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?

Teilen:  E-Mail Twitter Facebook LinkedIn Reddit
Impressum und Kontakt | © 2016-07-31 siquod.org

Diskussion

Bisher keine Beiträge
Hier können keine Kommentare hinzugefügt werden.