複数行print
brainf*ckで
makeBfPrint.rb
a=gets('') len=a.length-1 print "+"*a[0],"." len.times{|i| sa=a[i+1]-a[i] if sa==0;mark="" elsif sa>0;mark="+"*sa else;mark="-"*(-sa) end print mark,"." }
入力
>makeBfPrint
makeBfPrint.rb
a=gets('')
len=a.length-1
print "+",a[0],"."
len.times{|i|
sa=a[i+1]-a[i]
(略)
^Z
出力
+++++++++++++++++++++++++++++++++++(略)
makeBfpPrint.rb
a=gets('') len=a.length-1 print "+",a[0],"." len.times{|i| sa=a[i+1]-a[i] if sa==0;mark="" elsif sa>0;mark="+"+sa.to_s else;mark="-"+(-sa).to_s end print mark,"." }
入力
>makeBfPrint
makeBfPrint.rb
a=gets('')
len=a.length-1
print "+",a[0],"."
len.times{|i|
sa=a[i+1]-a[i]
(略)
^Z
出力
+109.-12.+10.-6.-35.+36.-22.+34.-9.+5.+6.-7(略)
(まえののversion upですが)
上の"+109.-12.+10 (略)"を通しても最初のバッファ設定部分を消さないと予想するようには動かない。
bfp-3.rb
# brainf*ck +put # # ",3.4[5>+6<]5+" => ,,,....[[[[[>++++++<]]]]]+ # "p(x)" => puts (>>>>+++++.-----<<<<< etc.) # multi line, quit=Ctrl+Z PUT ="p" $stpos =3 $buffersize =10 def min(a,b) a<b ? a:b end def max(a,b) a>b ? a:b end def mini_(a,b,c,d,e,f,g,h,i) an=min(min(min(min(min(min(min(min(a,b),c),d),e),f),g),h),i) end def offset(a) mk="+" if a<0 mk="-" a=-a end print mk*a end def mini(a,b) l= min=1000 ii=0 sa=0 a.each{|i| min=min(min,(i-b).abs) if l!=min l=min ii=i sa=i-b end } [min,ii,sa] end def pStart() print'>'*$stpos end def pEnd(l) #offset(l) #print'<'*$stpos end def putcc(a) pStart() print'+'*a[0] print'.' print'-'*a[0] pEnd() end def putOne(d) print'.' #print"(",d.chr,")" end def putcs(l,a) a-l end def getbufnum(d) n=" "*num num.times{|i| n[i]=$buf[i] } mini(n) end def getlast(d) d=~/\(([^*$]*)\)/ $1 end Plus="+" def pu(d,num) print d*num end class Buf def ini(code) @min=255 @max=0 @maxnum=$buffersize @num=@maxnum @step=177/@num @start=@step/2 @buf=[] @bufpos=0 # @bufv=0 code(code) pStart() @maxnum.times{|i| setbuf @start+i*@step if i<@maxnum pu Plus,@buf[i] #print"^",@start+i*@step,@buf[i],@buf[i].chr,":" #print"." pu ">",1 end } pu "<",*@num end def code(d) d.length.times{|i| @min=min(@min,d[i]) @max=max(@max,d[i]) } @start =@min @step =max(1,(@max-@min)/@num) @num =min(@num,@max-@min+1) #p "^",@start,@max,@step,@num,@start.chr,":" end def setbuf(n) @buf+=[n] end def near(b) l= min=1000 ii=0 sa=0 co=0 @buf.each{|i| min=min(min,(i-b).abs) if l!=min l=min ii=co sa=i-b end co+=1 } [ii,sa] end def offset(a) @buf[@bufpos]+=a mk="+" if a<0 mk="-" a=-a end print mk*a end def move to sa=to-@bufpos @bufpos=to mk=">" if sa<0 mk="<" sa=-sa end print mk*sa end def putss(d) l=0 d.length.times{|a| data=near(d[a]) move(data[0]) # p data now=d[a] sa=putcs(@buf[data[0]],now) offset(sa) putOne(now) l=now } pEnd(l) end end code=" "*10000 code=gets('').chomp buf=Buf.new buf.ini(code) 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) buf.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 }
なんかおかしい
diff.rb
a,b =ARGV[0], ARGV[1]
x=
y=
open(a).each_line{|i|x+=[i]}
open(b).each_line{|i|y+=[i]}
x.length.times{|i|
if x[i]!=y[i]
print i,":",x[i],"!",y[i]
puts
end
}
sa=putcs(@buf[data[0]],now)
かっこ閉じはどうやって表示するんだったか
追記:スーパーpre記法というので解決