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で実行の結果

hello world!


p(..)(--) => "..)(--"
なのでいまいち。標準のputsを上書きしてしまって悩んだ。