Als Antwort auf diesen Wettbewerb: Hier ist ein kleiner Matcher für reguläre Ausdrücke, in Haskell (344 Bytes):
p&(c:r)|c%h=p&z r|c%p=r:p&r|c%i=[]|1>0=p&r
z l=i&l!!0
b p q s=or[x?q$s|x<-p:j&p]
[h,i,j]="()|"
(p@(f:r)?q)s|n%'?'=o?q#id|n%'*'=m#id|n%'+'=m#b x|f%h=b r(z r?q)s|f%i||f%j=q s where x|f%h=r|1>0=f:i:r;n:o=z x;m#c=c(o?q)s||b x m s;m c=c/=s&&(p?q)c
((f:r)?q)(d:v)|d%f=r?q$v
(_?_)_=0>1
x%y=x==y
main=getLine>>=n.words
n(s:q)=mapM(print.b(s++[i])null)q
Er liest einen regulären Ausdruck von der Konsole (keine Zeichenklassen, keine Escapesequenzen oder Leerzeichen), gefolgt von mehreren Zeichenketten.
Dann schreibt er für jede der Zeichenketten entweder True
oder False
, je nachdem ob sie zu der von dem regulären Ausdruck erzeugten
Sprache gehört oder nicht.
Wer kann die Funktionsweise entschlüsseln? Wer kann in Haskell ein äquivalentes, aber kürzeres Programm schreiben?