Back to list of problems
Loglan-A Logical Language
134.c
/* 134 - Loglan-A Logical Language */ #include <stdio.h> #include <stdlib.h> #include <string.h> int nw; char **words = NULL; #if DEBUG void debug(char *str, int start, int end) { int i; printf("DEBUG: %s (", str); for (i=start; i<end; i++) { printf("%s ", words[i]); } printf(")\n"); } #endif int vowel(char c) { if (c=='a' || c=='e' || c=='i' || c=='o' || c=='u') { return 1; } else { return 0; } } int A(int start, int *end) { if (start>=nw) return 0; if (!strcmp(words[start], "a") || !strcmp(words[start], "e") || !strcmp(words[start], "i") || !strcmp(words[start], "o") || !strcmp(words[start], "u")) { *end = start+1; #if DEBUG debug("A", start, *end); #endif return 1; } else { return 0; } } int MOD(int start, int *end) { if (start>=nw) return 0; if (!strcmp(words[start], "ga") || !strcmp(words[start], "ge") || !strcmp(words[start], "gi") || !strcmp(words[start], "go") || !strcmp(words[start], "gu")) { *end = start+1; #if DEBUG debug("MOD", start, *end); #endif return 1; } else { return 0; } } int BA(int start, int *end) { if (start>=nw) return 0; if (!strcmp(words[start], "ba") || !strcmp(words[start], "be") || !strcmp(words[start], "bi") || !strcmp(words[start], "bo") || !strcmp(words[start], "bu")) { *end = start+1; #if DEBUG debug("BA", start, *end); #endif return 1; } else { return 0; } } int DA(int start, int *end) { if (start>=nw) return 0; if (!strcmp(words[start], "da") || !strcmp(words[start], "de") || !strcmp(words[start], "di") || !strcmp(words[start], "do") || !strcmp(words[start], "du")) { *end = start+1; #if DEBUG debug("DA", start, *end); #endif return 1; } else { return 0; } } int LA(int start, int *end) { if (start>=nw) return 0; if (!strcmp(words[start], "la") || !strcmp(words[start], "le") || !strcmp(words[start], "li") || !strcmp(words[start], "lo") || !strcmp(words[start], "lu")) { *end = start+1; #if DEBUG debug("LA", start, *end); #endif return 1; } else { return 0; } } int NAM(int start, int *end) { if (start>=nw) return 0; if (vowel(words[start][strlen(words[start])-1])) { return 0; } else { *end = start+1; #if DEBUG debug("NAM", start, *end); #endif return 1; } } int PREDA(int start, int *end) { if (start>=nw) return 0; if (strlen(words[start]) != 5) { return 0; } if (!vowel(words[start][0]) && !vowel(words[start][1]) && vowel(words[start][2]) && !vowel(words[start][3]) && vowel(words[start][4])) { *end = start+1; #if DEBUG debug("PREDA", start, *end); #endif return 1; } if (!vowel(words[start][0]) && vowel(words[start][1]) && !vowel(words[start][2]) && !vowel(words[start][3]) && vowel(words[start][4])) { *end = start+1; #if DEBUG debug("PREDA", start, *end); #endif return 1; } return 0; } int predstring(int start, int *end) { int a; if (!PREDA(start, &a)) { return 0; } while (1) { int b; if (PREDA(a, &b)) { a = b; } else { break; } } *end = a; #if DEBUG debug("predstring", start, *end); #endif return 1; } int preds(int start, int *end) { int a; if (!predstring(start, &a)) { return 0; } while (1) { int b; if (A(a,&b)) { if (predstring(b,&b)) { a = b; } else { break; } } else { break; } } *end = a; #if DEBUG debug("preds", start, *end); #endif return 1; } int predname(int start, int *end) { int a; if (LA(start, &a)) { if (predstring(a, &a)) { *end = a; #if DEBUG debug("predname", start, *end); #endif return 1; } } if (NAM(start, &a)) { *end = a; #if DEBUG debug("predname", start, *end); #endif return 1; } return 0; } int predclaim(int start, int *end) { int a; if (predname(start, &a)) { if (BA(a, &a)) { if (preds(a, &a)) { *end = a; #if DEBUG debug("predclaim", start, *end); #endif return 1; } } } if (DA(start, &a)) { if (preds(a, &a)) { *end = a; #if DEBUG debug("predclaim", start, *end); #endif return 1; } } return 0; } int verbpred(int start, int *end) { int a; if (!MOD(start, &a)) { return 0; } if (!predstring(a, &a)) { return 0; } *end = a; #if DEBUG debug("verbpred", start, *end); #endif return 1; } int statement(int start, int *end) { int a,b; if (!predname(start, &a)) { return 0; } if (!verbpred(a, &a)) { return 0; } if (predname(a, &b)) { *end = b; } else { *end = a; } #if DEBUG debug("statement", start, *end); #endif return 1; } int sentence(int start, int *end) { if (statement(start, end)) { #if DEBUG debug("sentence", start, *end); #endif return 1; } if (predclaim(start, end)) { #if DEBUG debug("sentence", start, *end); #endif return 1; } return 0; } void doit(void) { int a; if (sentence(0, &a) && a==nw) { printf("Good\n"); } else { printf("Bad!\n"); } } int main(void) { while (1) { char buf[1024]; int fin=0; nw = 0; while (!fin) { scanf(" %s", buf); if (buf[0]=='#') { return 0; } if (buf[strlen(buf)-1]=='.') { fin=1; buf[strlen(buf)-1] = '\0'; } words = realloc(words, (nw+1)*sizeof(char*)); words[nw] = malloc(strlen(buf)+1); strcpy(words[nw],buf); nw++; } doit(); fgets(buf, 1024, stdin); } return 0; }