Interpretiere was zum Teufel

8

Smallfuck ist eine Brainfuck-ähnliche Sprache mit 1-Bit-Zellen. Es hat die folgenden Anweisungen:

> Increment the pointer
< Decrement the pointer
* Flip the current bit
[ If the current bit is not set, jump to the instruction after the matching ]
] If the current bit is set, jump to the instruction after the matching [ 
    ( or just jump unconditionally to matching [ )

Whatfuck fügt noch eine Anweisung hinzu:

? Nondeterministically set the current bit to 0 or 1.

Ein Whatfuck-Programm nimmt keine Eingabe entgegen. Es kann zu einer von drei Möglichkeiten führen: 1(akzeptieren), 0(ablehnen) oder es kann niemals aufhören.

Das Programm führt dazu, dass 1eine für ?s ausgewählte Folge von Bits vorhanden ist, was dazu führt, dass das Programm 1als aktuelles Bit endet .

Das Programm endet mit, 0wenn alle möglichen Auswahlmöglichkeiten mit dem aktuellen Bit enden 0.

Wenn einige Auswahlmöglichkeiten nicht beendet werden und alle Auswahlmöglichkeiten damit beendet werden 0, wird das Programm niemals beendet.

Ihr Dolmetscher sollte alle Möglichkeiten gleichzeitig ausführen. Sie können es nicht 0zuerst versuchen und dann versuchen 1, da einige Programme nicht beendet werden, wenn sie sollten. *[?*]*Wird zum Beispiel mit der Auswahl akzeptieren 1, aber niemals beenden, wenn Sie immer wählen 0.

Als Beispiel ist hier ein Python 2-Interpreter, den ich geschrieben habe, nicht Golf

Regeln

  • Ihr Dolmetscher muss ein whatfuck-Programm von stdin akzeptieren und das Ergebnis ausdrucken.

  • Sie können davon ausgehen, dass das whatfuck-Programm nur Zeichen enthält []<>*?

  • Das Array von Bits ist an beiden Enden unbegrenzt.

  • Der kürzeste Code gewinnt.

Einige Testfälle

Dies schlägt fehl, wenn Ihr Code immer 0zuerst versucht

*[?*]*
1

Gibt es eine Teilmenge, {-7,-3, 5, 8}deren Summe 3 ist?

*<<<<<?[<<<<<<<<<<<<<<]?[<<<<<<]?[>>>>>>>>>>]?[>>>>>>>>>>>>>>>>]<
1

Gibt es eine Teilmenge, {-7,-3, 5, 8}deren Summe 4 ist?

*<<<<<<<?[<<<<<<<<<<<<<<]?[<<<<<<]?[>>>>>>>>>>]?[>>>>>>>>>>>>>>>>]<
0

Gibt es eine Möglichkeit, boolesche Werte zuzuweisen a, bund zwar cso

(a XOR b) AND (a XOR c) AND (b XOR c) ist wahr?

?[*>*>*<<]?[*>*>>*<<<]?[*>>*>*<<<]>[*>[*>[*>*<]<]<]>>>
0
Pappkarton
quelle

Antworten:

5

Python, 305 Zeichen

P=raw_input()+'$'
S=[(0,0,[])]
F={}
R={}
i=r=0
for c in P:
 if'['==c:S+=i,
 if']'==c:j=S.pop();F[j]=R[i]=i-j
 i+=1
while S*(1-r):p,t,B=S.pop(0);c=P[p];b=B.count(t)%2;p+=1+F.get(p,0)*(1-b)-R.get(p,0)*b;t+=(c=='>')-(c=='<');B=B+[t]*(c=='*');r|=(c=='$')&b;S+=[(p,t,B)]*(c!='$')+[(p,t,B+[t])]*(c=='?')
print r

Verfolgt den nichtdeterministischen Satz von Zuständen Smit jeweils einer Codeposition p, einer Bandposition tund einer Liste von Bandindizes B. Ein Bandindex kann mehrmals in der Liste Berscheinen. Das Band an diesem Index ist 1, wenn der Index ungerade oft in der Liste erscheint B.

Keith Randall
quelle
Speichern Sie 1 Byte durch Ersetzen t+=(c=='>')-(c=='<');durch t+=c=='>';t-=c=='<';, ein weiteres durch Ersetzen B=B+[t]*(c=='*')durch B+=[t]*(c=='*')und ein drittes durch Ersetzen p+=1+F.get(p,0)*(1-b)-R.get(p,0)*b;durch p+=1+F.get(p,0)*-~-b-R.get(p,0)*b;. Gute Antwort! (Entschuldigung, ich weiß, dass diese Antwort super alt ist!)
Osuka_
5

Unendliches Band ahoi!

Haskell, 516

i((p:l,r),(π,'<':φ))=[((l,p:r),('<':π,φ))]
i((l,p:r),(π,'>':φ))=[((p:l,r),('>':π,φ))]
i((l,p:r),(π,'*':φ))=[((l,1-p:r),('*':π,φ))]
i((l,_:r),(π,'?':φ))=[((l,b:r),('?':π,φ))|b<-[0,1]]
i(s@(l,0:r),(π,'[':φ))=[(s,m(']':π,φ)0)]
i(s,(π,'[':φ))=[(s,(']':π,φ))]
i(s,(π,']':φ))=[(s,ξ$m(']':φ,π)0)]
i _=[]
m(l,']':r)0=('[':l,r)
m(l,']':r)n=m('[':l,r)$n-1
m(l,'[':r)n=m(']':l,r)$n+1
m(l,c:r)n=m(c:l,r)n
ν=null;ο=0:ο
μ[]="0"
μ ω|ν[ψ|ψ@((_,b:_),_)<-ω,b>0,ν$i ψ]=μ$ω>>=i
μ _="1"
ξ(a,b)=(b,a)
main=interact$ \ζ->μ[((ο,ο),("",ζ))]
hörte auf, gegen den Uhrzeigersinn zu drehen
quelle
1
Es ist bemerkenswert, wie oft es Haskell-Antworten gelingt, Top-Stimmen zu erhalten, selbst wenn es andere Antworten mit objektiv besserer Punktzahl gibt ...
aufgehört, gegen den Uhrzeigersinn am
μ :) ..............
luser droog
1

Python ( 405 399 379)

Es nimmt die Eingabe in einer Zeile, aber ich "kann annehmen, dass das whatfuck-Programm nur Zeichen enthält []<>*?" und newline ist nicht in dieser Liste: P.

w, i, p, a = {}, 0, raw_input (), [(0,0, [], [])]
für c in p:
 wenn c == '[': a + = i,
 wenn c == ']': g = a.pop (); w [i], w [g] = g, i
 i + = 1
i, z = 0, Lambda l: l und l.pop () oder 0
während ein:
 n, c, l, r = a.pop (0)
 versuche: o = p [n]
 außer:
        wenn c: i = 1; Pause
        fortsetzen
 wenn o == '*': c = nicht c
 wenn o == '>': l + = c ,; c = z (r)
 wenn o == '<': r + = c ,; c = z (l)
 wenn o in '[]' und (']' == o) == c: n = w [n]
 wenn o == '?': a + = (n + 1, nicht c, l [:], r [:]),
 a + = (n + 1, c, l, r),
drucken i

Marinus
quelle
1
.append(item)-> +=[item]Entfernen Sie kalle Anrufe und ersetzen Sie sie durch a+=[...], um einige Zeichen zu speichern.
Beary605
@ beary605: danke, aber am Ende habe ich verwendet, +=item,was noch kürzer ist.
Marinus