=begin
267 デフォルトの名無しさん 2020/08/10(月) 05:44:26.44 ID:SKFyjjt9
お題:
Brainfuck実行環境を作成し,以下のhello.bfを読み込み実行してください
入力: https://g...content-available-to-author-only...b.com/pablojorge/brainfuck/blob/master/programs/hello.bf
出力: "Hello World!"
---------------------------------------------------------------------
ideone の仕様により入力は埋め込み。
2pass 化して連続処理を最適化。
=end
# require 'net/http'
# Uri = 'https://g...content-available-to-author-only...b.com/pablojorge/brainfuck/blob/master/programs/hello.bf'
# Uri_Raw = Uri.sub(%r{//github.com/(.*)/blob/}){"//raw.githubusercontent.com/#{$1}/"}
# $src = Net::HTTP.get( URI.parse( Uri_Raw ) )
$src = DATA.read
$src2 = [] # Pass2 code ( operand:n , opcode:3 )
OP_Ptr = 0
OP_Add = 1
OP_Put = 2
OP_Get = 3
OP_W_s = 4
OP_W_e = 5
def pass1_sub( ipc, ch, op )
p1 = 8
while $src[ipc+1] == ch
p1 += 8
ipc += 1
end
$src2 << ( op + p1 )
ipc
end
def pass1_num( ipc, op, op1, op2 )
p1 = 0
while ipc < $src.length
case $src[ipc]
when op1; p1 += 8
when op2; p1 -= 8
else
ipc -= 1
break
end
ipc += 1
end
$src2 << ( op + p1 ) if p1 != 0
ipc
end
def pass1( ipc, wloop = 0 )
while ipc < $src.length
ch = $src[ipc]
case ch
when '>', '<'; ipc = pass1_num( ipc, OP_Ptr, '>', '<' )
when '+', '-'; ipc = pass1_num( ipc, OP_Add, '+', '-' )
when '.'; ipc = pass1_sub( ipc, ch, OP_Put )
when ','; ipc = pass1_sub( ipc, ch, OP_Get )
when '['
$src2 << OP_W_s
wloop2 = $src2.length
ipc = pass1( ipc+1, wloop2 )
$src2[wloop2-1] += $src2.length << 3
when ']'
$src2 << ( OP_W_e + (wloop << 3) )
return ipc
end
ipc += 1
end
if wloop != 0
warn "Error [ ... ]"
exit 1
end
ipc
end
$src.gsub!( /[^<>+\-\.,\[\]]/, '' )
pass1( 0 )
# pass2
buff = [0] * 0x8000
ptr = 0
ipc = 0
while (o = $src2[ipc])
p1 = o >> 3
case o & 7
when OP_Ptr; ptr += p1
when OP_Add; buff[ptr] += p1
when OP_Put; print buff[ptr].chr * p1
when OP_Get; p1.times{ buff[ptr] = STDIN.getc.ord }
when OP_W_s; ipc = p1 - 1 if buff[ptr] == 0
when OP_W_e; ipc = p1 - 1 if buff[ptr] != 0
end
ipc += 1
end
__END__
+++++ +++++ initialize counter (cell #0) to 10
[ use loop to set the next four cells to 70/100/30/10
> +++++ ++ add 7 to cell #1
> +++++ +++++ add 10 to cell #2
> +++ add 3 to cell #3
> + add 1 to cell #4
<<<< - decrement counter (cell #0)
]
> ++ . print 'H'
> + . print 'e'
+++++ ++ . print 'l'
. print 'l'
+++ . print 'o'
> ++ . print ' '
<< +++++ +++++ +++++ . print 'W'
> . print 'o'
+++ . print 'r'
----- - . print 'l'
----- --- . print 'd'
> + . print '!'
> . print '\n'
PWJlZ2luCgoyNjcg44OH44OV44Kp44Or44OI44Gu5ZCN54Sh44GX44GV44KTIDIwMjAvMDgvMTAo5pyIKSAwNTo0NDoyNi40NCBJRDpTS0Z5amp0OQogICAg44GK6aGMOgogICAgQnJhaW5mdWNr5a6f6KGM55Kw5aKD44KS5L2c5oiQ44GX77yM5Lul5LiL44GuaGVsbG8uYmbjgpLoqq3jgb/ovrzjgb/lrp/ooYzjgZfjgabjgY/jgaDjgZXjgYQKCiAgICDlhaXlips6IGh0dHBzOi8vZy4uLmNvbnRlbnQtYXZhaWxhYmxlLXRvLWF1dGhvci1vbmx5Li4uYi5jb20vcGFibG9qb3JnZS9icmFpbmZ1Y2svYmxvYi9tYXN0ZXIvcHJvZ3JhbXMvaGVsbG8uYmYKICAgIOWHuuWKmzogIkhlbGxvIFdvcmxkISIKCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKCWlkZW9uZSDjga7ku5Xmp5jjgavjgojjgorlhaXlipvjga/ln4vjgoHovrzjgb/jgIIKCTJwYXNzIOWMluOBl+OBpumAo+e2muWHpueQhuOCkuacgOmBqeWMluOAggoKPWVuZAoKIyByZXF1aXJlICduZXQvaHR0cCcKIwlVcmkgPSAnaHR0cHM6Ly9nLi4uY29udGVudC1hdmFpbGFibGUtdG8tYXV0aG9yLW9ubHkuLi5iLmNvbS9wYWJsb2pvcmdlL2JyYWluZnVjay9ibG9iL21hc3Rlci9wcm9ncmFtcy9oZWxsby5iZicKIwlVcmlfUmF3ID0gVXJpLnN1YiglcnsvL2dpdGh1Yi5jb20vKC4qKS9ibG9iL30peyIvL3Jhdy5naXRodWJ1c2VyY29udGVudC5jb20vI3skMX0vIn0KIwkkc3JjID0gTmV0OjpIVFRQLmdldCggVVJJLnBhcnNlKCBVcmlfUmF3ICkgKQoJJHNyYyA9IERBVEEucmVhZAoKCSRzcmMyID0gW10JIyBQYXNzMiBjb2RlCSggb3BlcmFuZDpuICwgb3Bjb2RlOjMgKQoKCU9QX1B0ciA9IDAKCU9QX0FkZCA9IDEKCU9QX1B1dCA9IDIKCU9QX0dldCA9IDMKCU9QX1dfcyA9IDQKCU9QX1dfZSA9IDUKCmRlZiBwYXNzMV9zdWIoIGlwYywgY2gsIG9wICkKCXAxID0gOAoJd2hpbGUgJHNyY1tpcGMrMV0gPT0gY2gKCQlwMSArPSA4CgkJaXBjICs9IDEKCWVuZAoJJHNyYzIgPDwgKCBvcCArIHAxICkKCWlwYwplbmQKCmRlZiBwYXNzMV9udW0oIGlwYywgb3AsIG9wMSwgb3AyICkKCXAxID0gMAoJd2hpbGUgaXBjIDwgJHNyYy5sZW5ndGgKCQljYXNlICRzcmNbaXBjXQoJCXdoZW4gb3AxOwlwMSArPSA4CgkJd2hlbiBvcDI7CXAxIC09IDgKCQllbHNlCgkJCWlwYyAtPSAxCgkJCWJyZWFrCgkJZW5kCgkJaXBjICs9IDEKCWVuZAoJJHNyYzIgPDwgKCBvcCArIHAxICkJaWYgcDEgIT0gMAoJaXBjCmVuZAoKZGVmIHBhc3MxKCBpcGMsIHdsb29wID0gMCApCgl3aGlsZSBpcGMgPCAkc3JjLmxlbmd0aAoJCWNoID0gJHNyY1tpcGNdCgkJY2FzZSBjaAoJCXdoZW4gJz4nLCAnPCc7CWlwYyA9IHBhc3MxX251bSggaXBjLCBPUF9QdHIsICc+JywgJzwnICkKCQl3aGVuICcrJywgJy0nOwlpcGMgPSBwYXNzMV9udW0oIGlwYywgT1BfQWRkLCAnKycsICctJyApCgkJd2hlbiAnLic7CWlwYyA9IHBhc3MxX3N1YiggaXBjLCBjaCwgT1BfUHV0ICkKCQl3aGVuICcsJzsJaXBjID0gcGFzczFfc3ViKCBpcGMsIGNoLCBPUF9HZXQgKQoJCXdoZW4gJ1snCgkJCSRzcmMyIDw8IE9QX1dfcwoJCQl3bG9vcDIgPSAkc3JjMi5sZW5ndGgKCQkJaXBjID0gcGFzczEoIGlwYysxLCB3bG9vcDIgKQoJCQkkc3JjMlt3bG9vcDItMV0gKz0gJHNyYzIubGVuZ3RoIDw8IDMKCQl3aGVuICddJwoJCQkkc3JjMiA8PCAoIE9QX1dfZSArICAod2xvb3AgPDwgMykgKQoJCQlyZXR1cm4gaXBjCgkJZW5kCgkJaXBjICs9IDEKCWVuZAoJaWYgd2xvb3AgIT0gMAoJCXdhcm4gIkVycm9yIFsgLi4uIF0iCgkJZXhpdCAxCgllbmQKCWlwYwplbmQKCgkkc3JjLmdzdWIhKCAvW148PitcLVwuLFxbXF1dLywgJycgKQoJcGFzczEoIDAgKQojIHBhc3MyCglidWZmID0gWzBdICogMHg4MDAwCglwdHIgPSAwCglpcGMgPSAwCgl3aGlsZSAobyA9ICRzcmMyW2lwY10pCgkJcDEgPSBvID4+IDMKCQljYXNlIG8gJiA3CgkJd2hlbiBPUF9QdHI7CXB0ciArPSBwMQoJCXdoZW4gT1BfQWRkOwlidWZmW3B0cl0gKz0gcDEKCQl3aGVuIE9QX1B1dDsJcHJpbnQgYnVmZltwdHJdLmNociAqIHAxCgkJd2hlbiBPUF9HZXQ7CXAxLnRpbWVzeyBidWZmW3B0cl0gPSBTVERJTi5nZXRjLm9yZCB9CgkJd2hlbiBPUF9XX3M7CWlwYyA9IHAxIC0gMQlpZiBidWZmW3B0cl0gPT0gMAoJCXdoZW4gT1BfV19lOwlpcGMgPSBwMSAtIDEJaWYgYnVmZltwdHJdICE9IDAKCQllbmQKCQlpcGMgKz0gMQoJZW5kCgpfX0VORF9fCisrKysrICsrKysrICAgICAgICAgICAgIGluaXRpYWxpemUgY291bnRlciAoY2VsbCAjMCkgdG8gMTAKWyAgICAgICAgICAgICAgICAgICAgICAgdXNlIGxvb3AgdG8gc2V0IHRoZSBuZXh0IGZvdXIgY2VsbHMgdG8gNzAvMTAwLzMwLzEwCiAgICA+ICsrKysrICsrICAgICAgICAgICAgICBhZGQgIDcgdG8gY2VsbCAjMQogICAgPiArKysrKyArKysrKyAgICAgICAgICAgYWRkIDEwIHRvIGNlbGwgIzIgCiAgICA+ICsrKyAgICAgICAgICAgICAgICAgICBhZGQgIDMgdG8gY2VsbCAjMwogICAgPiArICAgICAgICAgICAgICAgICAgICAgYWRkICAxIHRvIGNlbGwgIzQKICAgIDw8PDwgLSAgICAgICAgICAgICAgICAgIGRlY3JlbWVudCBjb3VudGVyIChjZWxsICMwKQpdICAgICAgICAgICAgICAgICAgIAo+ICsrIC4gICAgICAgICAgICAgICAgICBwcmludCAnSCcKPiArIC4gICAgICAgICAgICAgICAgICAgcHJpbnQgJ2UnCisrKysrICsrIC4gICAgICAgICAgICAgIHByaW50ICdsJwouICAgICAgICAgICAgICAgICAgICAgICBwcmludCAnbCcKKysrIC4gICAgICAgICAgICAgICAgICAgcHJpbnQgJ28nCj4gKysgLiAgICAgICAgICAgICAgICAgIHByaW50ICcgJwo8PCArKysrKyArKysrKyArKysrKyAuICBwcmludCAnVycKPiAuICAgICAgICAgICAgICAgICAgICAgcHJpbnQgJ28nCisrKyAuICAgICAgICAgICAgICAgICAgIHByaW50ICdyJwotLS0tLSAtIC4gICAgICAgICAgICAgICBwcmludCAnbCcKLS0tLS0gLS0tIC4gICAgICAgICAgICAgcHJpbnQgJ2QnCj4gKyAuICAgICAgICAgICAgICAgICAgIHByaW50ICchJwo+IC4gICAgICAgICAgICAgICAgICAgICBwcmludCAnXG4nCg==