Hi Leute!
Ich will hier mal einen Versuch starten, und schaun wie's ankommt ;-)
Es ist zwar OFF-TOPIC, und ich weiss auch gar nicht, ob sowas im Forum erlaubt ist, aber es hat ja doch irgendwie Bezug zum Thema PERL, und es ist vielleich ganz gut geeignet, um die Stimmung ein bischen zu heben, aber auf alle Fälle einen kleinen Gute-Nacht-Gedanken wert!
Werd ja sehen ob ich einen Anschiss kassiere, aber einen Versuch ist's Wert
Ich lerne gerade mit meinen Studienkollegen für eine Informatikprüfung (Theoretische Informatik - Automaten, Turingmaschinen), und dabei sind wir über eine ziemlich hundsteufelgemeine Frage gestolpert, die keiner von uns lösen kann, und sich hervorragend für ein kleines Rätsel eignet!
Wir können in Worten beschreiben ;-) wie die gefragte RegExpr. aussehen soll, aber nicht hinschreiben!
Also hier die Aufgabe:
Stellt euch vor ihr habt eine Sprache die sich aus nur drei Buchstaben zusammensetzt! Es geht also um eine Sprache aus dem Alphabet {a,b,c}*, WOBEI vor jedem 'c' zumindest ein 'a' oder 'b' stehen MUSS. Ansonsten Syntaxfehler ;-) Anders gesagt: Es kann kein c vorkommen, vor dem nicht entweder mindestens ein a oder b steht!
a,b oder c können dabei * ( >=0 ) mal vorkommen. Die Worte, die man mit dieser Sprache bilden kann, sollen durch einen regulären Ausdruck beschrieben werden.
Das heisst der Ausdruck soll auf alle diese Möglichkeiten matchen, quasi die Syntax der Sprache checken. Also ein Wort einlesen und prüfen ob es überhaupt zum "Sprachschatz" gehört. Wie wenn ihr ein Programm schreibt, das prüfen soll, ob der Ausdruck "$var=3;" ein zulässiger Ausdruck in der Sprache "PERL" - mit dem Alphabet {$,3,v,a,r,=,;} - ist!
Mögliche Worte(Zeichenketten) sind z.b: aaa, abcabcc, ac, bcbbbb, ba, ... Keine Worte aus dieser Sprache wären: cabac, c, abccb
Ein Ausdruck der die Sprache z.B. nicht richtig bestimmt, wäre /a*b*c+/ da 'c' nicht zwingend vorkommen muss, ausserdem könnte nach c noch ein anderer Buchstabe (a oder b) kommen. /(a*b*c+)*/ geht auch nicht! Es kann dann zwar nacher nachmal ein a oder ein b oder ein c kommen, allerdings ist mit dem 'c+' festelegt, dass ein 'c' im Ausdruck sein muss - was im Wiederspruch zur Definition steht, da c auch _nicht_ vorkommen kann ;-)
Ihr seht, eine haarige Sache also, und gar nicht _soooo_ leicht.
Für die Informatiker unter euch:
Ein Beschreibung der Sprache, die folgender endlicher Automat erzeugt:
- Zustände {qo,q1,q2}
- Alphabet {a,b,c}
- Anfangs und Endzustand ist {q0}
- Übergangsfunktion: (q0,a) -> {qo,q2}
(q0,b) -> {q0,q1}
(q1,c) -> {q0}
(q2,b) -> {q1}
(q2,c) -> {q0}
;-)
Es ist wirklich nur zum Spass, ein kleiner Test, wie gut eure RegExpr-Künste wirklich sind ;-) Ich weiss auch gar nicht, ob ihr euch da reindenken könnt oder überhaupt verstanden habt was ich euch sagen will!
Um möglichen Fragen zuvorzukommen: Das ist keine besonders kreativ formulierte Ausrede um nicht im perldoc nachsclagen zu müssen ;-) es soll sich jedenfalls keiner gezwungen fühlen, diese Frage zu beantworten, daher auch keine perldoc-links bitte ;-) und keine Beschimpfungen denn wer's blöd findet braucht ja nix zu antworten!
Ich hoffe ich habe die Aufgabe deutlich formulieren können!
Viel Spass beim Grübeln,
Bernhard