複数行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記法というので解決