#!/usr/bin/ruby i=ARGV; z=[i[0]&&i[0].to_i-3||18,14].max; Z=[i[1]&&i[1].to_i-2||64,32].max/16; z=(z-(z+2)%4)/2; if i[2];srand i[2].to_i;end; $p={}; $o=[]; $q={}; def s(d,b); p=[d,b]; while$p[p]&&$p[p]!=p; p=$p[p] end; return p; end; def y(d,i,b,q); p=s(d,i); q=s(b,q); if p!=q; $p[p]=$p[q]=[p,q].min; if d==b; 4.times{|l|$o[d+l][i+8,2]="' ."[l]*2}; else; o=[d,b].max; if$q[p]&&$q[q]; 2.times{|l|$o[o+l][i+2,6]=" "*6}; else $o[o][i+4,2]=" , "[(i%16/8)^(o%4/2),2]; $o[o+1][i+4,2]=" " end; end; end; end; I=[ "; .;;;. ", ";;' ; ';", ";;. ; .;", "; ';;;' ", "';. ; .;", " ';;;' ", " ' " ].map{|l|l.split(//).map{|i|i*2}.join}; (z*2).times{|l|$o+=[I[l%4]*Z]}; $o[0]=$o[0].gsub(/;; /," "); $o[1]=$o[1].gsub(/;;;;''/,"..;;''"); 3.times{|l|$o+=[I[l+4]*Z]}; $o.size.times{|l|$o[l]+=" .' "[l%4]*2}; z.times{|l| (Z*2).times{|i| p=[l*2,i*8]; $p[p]=p } }; O=(Z*2)*z+1; O.times{ if$q.size0?2:-2; while(g<1||rand(5)>0)&& (p=j+8*g)1&& (0..2).all?{|l|!$q[[q+l*2,p]]&& !$q[[q+l*2,p+8]]}; g+=1; end; if g>0; g.times{|l| 3.times{|u| [0,8].each{|v| $q[[i+l*f+u*2,j+l*8+v]]=1; } } }; h=rand(2)*2-1; e=h*f<0; u=v=w=x=nil; g.times{|l| y(d=i+l*f+(h>0?0:4),b=j+l*8,p=d,q=b+8); y(m=d+(e ?-2*f:f),n=b+(e ?8:0),r=m+f,s=n); if u; y(u,v,d,b); y(w,x,m,n) end; u=p; v=q; w=r; x=s }; y(u=e ?i+2:w,v=e ?j:x+8,u-f,v) end; end }; w=[]; z.times{|l| Z.times{|i| y(q=l*2,p=i*16-l%2*8,q,p+(!$q[[q,p]]&&!$q[[q,p+8]]?8:0)) }; (1..Z*2-2).each{|i| w+=l>0?[[q=l*2,p=i*8,q-2,p]]:[] } }; w=w.shuffle; 2.times{|l| w.each{|p,d,q,b| if(l<1|| s(0,0)!=s(z*2-2,Z*16-8))&& !$q[[p,d]]&& !$q[[q,b]]; y(p,d,q,b) end }; $q={} }; y(-2,0,0,0); y(p=z*2,q=Z*16-8,p-2,q); $o.each{|l|puts l}