/* Der Kadonische Leuchtturm */ /* Jan Bredereke, Januar 2002, April 2004 */ #include typedef enum {ROT, WEISS, UNBEKANNT, ENDE} farben_t; char zeile[1000]; /* Die eingegebene Zeile */ char *currZeile = zeile; /* Die aktuelle Position in der Zeile */ char *lastZeile = NULL; /* Die vorige Position in der Zeile */ farben_t naechsterRing() { switch(*currZeile++) { case 'r': return ROT; case 'w': return WEISS; case '\0': return ENDE; default: return UNBEKANNT; } } void merkeRing() { lastZeile = currZeile; /* Anmerkung: Fuer mehrfache Aufrufe waere es besser gewesen, keine globale Variable zu nehmen, sondern mehrere lokale. */ } void zurueckRing() { currZeile = lastZeile; } int mann() { merkeRing(); if( naechsterRing() == ROT && naechsterRing() == WEISS && naechsterRing() == ROT) { return 1; } else { zurueckRing(); return 0; } } int frau() { merkeRing(); if( naechsterRing() == WEISS && naechsterRing() == ROT && naechsterRing() == WEISS) { return 1; } else { zurueckRing(); return 0; } } int helfer() { return( mann() || frau()); } int kadonischerturm() { return( helfer() && helfer() && helfer() && helfer() && naechsterRing() == ENDE); /* Achtung: Diese Funktion setzt bei Nicht-Match die aktuelle Position nicht auf den vorigen Wert zurueck. Aber der wird auch nie mehr benoetigt. */ } int main() { printf("Wie sieht der Leuchtturm aus, Sir? "); scanf("%s", zeile); if(kadonischerturm()) printf("Wir liegen vor der Insel Kadonien, Sir!\n"); else printf("Wir liegen *nicht* vor der Insel Kadonien, Sir!\n"); }