この記事は【Kuin Advent Calendar 2016】の5日目の記事です。
【記事中で紹介しているコードについて】
コンパイルが通らない場合など、不具合があれば、@tatt61880まで連絡いただけると助かります。よろしくお願いいたします。
func main()
{
※Brainf*ckのコードは下記のURLに掲載されているものを使用しています。
Helloworldless Hello world by Mark Byers:
http://golf.shinh.org/reveal.rb?Helloworldless+Hello+world/Mark+Byers_1239553451&bf
}
do @brainfuck("++++++++[->->+++++>>>+>+>+>++>>++[+++<+]<]>->.-[->-[>]<<[<+]->-]>+>--.->---..>+++>.>>>++++[.<]")
end func
func brainfuck(src: []char)
var data: []bit8 :: #[30000]bit8
var ptr: int :: 0
var i: int :: 0
var reader: @Reader :: #@Reader
while(i < ^src)
switch(src[i])
case '>'
do ptr :+ 1
case '<'
do ptr :- 1
case '+'
do data[ptr] :+ 1b8
case '-'
do data[ptr] :- 1b8
case '.'
do cui@print([data[ptr] $ char])
case ','
do data[ptr] :: reader.getChar() $ bit8
case '['
if(data[ptr] = 0b8)
var cnt: int :: 1
while(cnt > 0)
do i :+ 1
switch(src[i])
case '['
do cnt :+ 1
case ']'
do cnt :- 1
end switch
end while
end if
case ']'
if(data[ptr] <> 0b8)
var cnt: int :: 1
while(cnt > 0)
do i :- 1
switch(src[i])
case '['
do cnt :- 1
case ']'
do cnt :+ 1
end switch
end while
end if
end switch
do i :+ 1
end while
do cui@print("\n")
end func
class Reader()
var buff: []char
var p: int
*func ctor()
do me.buff :: ""
do me.p :: 0
end func
+func getChar(): char
do me.p :+ 1
if(me.p >= ^me.buff)
do me.p :: 0
do me.buff :: cui@input() ~ "\n"
end if
ret me.buff[me.p]
end func
end class
Hello, world!