whatfuckを解釈する


8

Smallfuckは、1ビットのセルを備えたブレインファックのような言語です。次の指示があります。

> 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はもう1つの命令を追加します。

? Nondeterministically set the current bit to 0 or 1.

whatfuckプログラムは入力を取りません。1(受け入れ)、0(拒否)の3つの可能性のいずれかが発生する可能性があり、停止することはありません。

プログラムは1?s に対して選択されたビットのシーケンスが存在する場合に発生します。これにより、プログラム1は現在のビットとして終了します。

0すべての可能な選択肢が現在のビット0で終了する場合、プログラムは終了します。

一部の選択肢が終了せず、終了するすべての選択肢がで終了する0場合、プログラムは終了しません。

通訳者はすべての可能性を同時に実行する必要があります。一部のプログラムは必要なときに終了しないため、0最初に試行してからを試行することはできません1。たとえば、*[?*]*は選択1で受け入れますが、常に選択した場合は終了しません0

例として、これは私が書いたpython 2インタープリターですが、ゴルフではありません

ルール

  • 通訳者はstdinからwhatfuckプログラムを受け入れ、その結果を出力する必要があります。

  • whatfuckプログラムには文字のみが含まれていると想定できます。 []<>*?

  • ビットの配列は両端で無制限です。

  • 最短のコードが勝ちます。

いくつかのテストケース

コードが常に0最初に試行する場合、これは失敗します

*[?*]*
1

{-7,-3, 5, 8}合計が3のサブセットはありますか?

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

{-7,-3, 5, 8}合計が4のサブセットはありますか?

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

ブール値を代入する方法があるabcなるように

(a XOR b) AND (a XOR c) AND (b XOR c) 本当ですか?

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

回答:


5

Python、305文字

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

の非決定的な状態のセットを追跡します。S各状態には、コード位置p、テープ位置t、およびテープインデックスのリストが含まれますB。テープインデックスはリストに複数回出現する可能性がBあります。インデックスが奇数回出現する場合、そのインデックスのテープは1ですB


保存1つの置き換えることにより、バイトt+=(c=='>')-(c=='<');t+=c=='>';t-=c=='<';置換することによって、別の、B=B+[t]*(c=='*')B+=[t]*(c=='*')、と置き換えることにより第三p+=1+F.get(p,0)*(1-b)-R.get(p,0)*b;p+=1+F.get(p,0)*-~-b-R.get(p,0)*b;。正解です。(申し訳ありませんが、私はこの答えが古いことを知っています!)
osuka_

5

無限テープアホイ!

ハスケル、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$ \ζ->μ[((ο,ο),("",ζ))]

1
Haskellの答えは...周りのスコアを客観より良いと他の回答があってもトップの票を得ることに成功する頻度それが顕著だ
ターンに止まっcounterclockwis

μ:) ..............
luser droog 2013

1

パイソン(405 399 379)

これは1行で入力を受け取りますが、「whatfuckプログラムには文字のみが含まれていると想定するかもしれ[]<>*?ません」であり、改行はそのリストにありません:P

w、i、p、a = {}、0、raw_input()、[(0,0、[]、[])]
pのcの場合:
 c == '[':a + = i、
 if c == ']':g = a.pop(); w [i]、w [g] = g、i
 i + = 1
i、z = 0、lambda l:lおよびl.pop()または0
ながら:
 n、c、l、r = a.pop(0)
 try:o = p [n]
 例外:
        if c:i = 1; break
        継続する
 if o == '*':c = not c
 if o == '>':l + = c、; c = z(r)
 if o == '<':r + = c、; c = z(l)
 if in [[] 'and('] '== o)== c:n = w [n]
 if o == '?':a + =(n + 1、not c、l [:]、r [:])、
 a + =(n + 1、c、l、r)、
印刷する


1
.append(item)-> +=[item]kすべての呼び出しを削除して置き換えa+=[...]、数文字を保存します。
beary605 2012

@ beary605:おかげで、結局+=item,もっと短いものを使ってしまいました。
マリナス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.