#Brainfuck interperter ver 1.1 use strict; $| = 1; my @com = split(//,join("",<>)); my @mem = (); my $ptr = 0; my $cnt = 0; while($cnt <= $#com){ if($com[$cnt] eq "+"){ if($mem[$ptr] == 0xff){ $mem[$ptr] = 0x0; } else{ $mem[$ptr]++; } } elsif($com[$cnt] eq "-"){ if($mem[$ptr] == 0x0){ $mem[$ptr] = 0xff; } else{ $mem[$ptr]--; } } elsif($com[$cnt] eq "<"){ if($ptr != 0){ $ptr--; } else{ &error("ポインタが負の値をとっています"); } } elsif($com[$cnt] eq ">"){ if($ptr < 29999){ $ptr++; } else{ &error("ポインタがオーバーフローしています"); } } elsif($com[$cnt] eq "."){ print pack("C",$mem[$ptr]); } elsif($com[$cnt] eq ","){ $mem[$ptr] = unpack("C",substr(,0,1)); } elsif($com[$cnt] eq "[" && $mem[$ptr] == 0){ my $flag = 0; while(1){ $cnt++; if($cnt > $#com){ &error("括弧の対応が不正です"); } if($com[$cnt] eq "]" && $flag == 0){ last; } elsif($com[$cnt] eq "["){ $flag++; } elsif($com[$cnt] eq "]" && $flag > 0){ $flag--; } } } elsif($com[$cnt] eq "]" && $mem[$ptr] != 0){ my $flag = 0; while(1){ $cnt--; if($cnt < 0){ &error("括弧の対応が不正です"); } if($com[$cnt] eq "[" && $flag == 0){ last; } elsif($com[$cnt] eq "]"){ $flag++; } elsif($com[$cnt] eq "[" && $flag > 0){ $flag--; } } } $cnt++; } sub error{ print "エラー:$_[0]\n"; exit; }