Fotolog
Volver a la lista de problemas
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;
}









