bf
(brainf*ckとは 8つの文字だけでプログラムが書ける言語らしいです。とはいえもともと0と1ですね)
brainf*ckでp(foo)で文字列出力をするために。
あとは、繰り返しを "[5" のように書ける。"[100" などでもよい
bfp1.rb # brainf*ck +put # # ",3.4[5>+6<]5+" => ,,,....[[[>++++++<]]]+ # "p(x)" => puts (>>>>+++++.-----<<<<< etc.) PUT="p" def pStart() print'>'*5 end def offset(a) mk="+" if a<0 mk="-" a=-a end print mk*a end def pEnd(l) offset(l) print'<'*5 end def putcc(a) pStart() print'+'*a[0] print'.' print'-'*a[0] pEnd() end def putOne(d) print'.' end def putcs(l,a) a-l end def putss(d) l=0 pStart() d.length.times{|a| now=d[a] sa=putcs(l,now) offset(sa) putOne(now) l=now } pEnd(l) end def getlast(d) d=~/^\((.*)\)/ $1 end code=gets.chomp f=0 putf=0 putstart=0 nex=0 len=code.length len.times{|pos| a=code[pos..pos] if nex>pos else nex=pos+1 c=code[pos+1..len] if(a==PUT) if c[0..0]=="(" pd =getlast(c) putss(pd) nex=pd.length+pos+3 end else a=~/(\d)/ if($1) f=0 else f=1 end c=~/^(\d+)/ if($1)then c=$1 else c=1 end if f==1 print a*c.to_i end end end }
入力
>2+2p(hello world!)
出力
>>++>>>>>+++++(略
bfiで実行の結果
p(..)(--) => "..)(--"
なのでいまいち。標準のputsを上書きしてしまって悩んだ。