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 Google+ LinkedIn Reddit
Impressum und Kontakt | © 2016-07-31 siquod.org

Diskussion

Bisher keine Beiträge

Kommentar abgeben


:
-- Gib den voranstehenden Text ein: