Skip to content

Instantly share code, notes, and snippets.

@tompng
Last active July 27, 2019 13:17
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save tompng/7e15397aba472c136aa8bf7fdcf3f63b to your computer and use it in GitHub Desktop.
Save tompng/7e15397aba472c136aa8bf7fdcf3f63b to your computer and use it in GitHub Desktop.
自己紹介用コード(moved to https://github.com/tompng/tompng)
########################################################################################################################################################################################
########################################################################################################################################################################################
########################################################################################################################################################################################
########### ########################################################################################################################################################################
########### ########################################################################################################################################################################
########### ########################################################################################################################################################################
########### ########################################################################################################################################################################
##### ######### ########## ### ###### ######### ## ########## #### ############## ## #####
##### ####### ######## # ## ####### ######## ## ########## #####
##### ##### ##### ###### ## ### ###### #### ###### ### ####### ##### #####
########### ########## ########## ##### ####### ####### ###### ########## ###### ######## ###### ######### #####
########### ######### ############ ##### ######### ########## ###### ############ ##### ########## ##### ########### #####
########### ######### ############# #### ########## ########## ###### ############## ##### ########### #### ############# #####
########### ######### ############## #### ########## ########## ###### ############## ##### ############ #### ############# #####
########### ######### ############## #### ########## ########## ###### ############## ##### ############ #### ############# #####
########### ######### ############## #### ########## ########## ###### ############## ##### ############ #### ############# #####
########### ######### ############# ##### ########## ########## ###### ############# ##### ############ ##### ############ #####
########### ########## ############ ##### ########## ########## ###### ########### ##### ############ ##### ########## #####
########### ########## ######## ###### ########## ########## ###### ####### ###### ############ ###### #### #####
########### ##### ####### ########## ########## ###### ####### ############ ######## #####
########### ####### ######### ########## ########## ###### # ######### ############ ########## ### #####
############# ########## ############ ########## ########## ###### ##### ############# ############ ####################### ######
################################################################################################# ##################################################################### ######
################################################################################################# ##################################################### ######### #######
################################################################################################# ##################################################### ########
################################################################################################# ####################################################### ##########
################################################################################################# ############################################################ ################
########################################################################################################################################################################################
########################################################################################################################################################################################
require'io/console';cx,w,h,m=cy=0.5;zm=2;R=->{l='';h,w=IO.console&.winsize||[48]*2;h*=2;m=1.0*[w,h].min;m*zm<=w&&cx=0.5;m*zm<=h&&cy=0.5;g=(0...h).map{[0]*w};[[524,489,%(H9zR0b8H/R4EJlT
y5fyPUDVdSVeyIiuzaChOoHiIwhiK9wfZpEuoHKGEBkHQcBv9EWmH28FWXMf0kHDYhi0R3AYdgxEYgYNDGZiGKZ3zOTeC52RWRdv5Zr414suo7ujuEpZHeZyNUsMMEE5a0e41OvXu5/b3wvf/z299+f/lX6H4wQY)],[509,22,%(FVAgpVA59Dv
dSraTKmVyJoeGk6FkaGhSNB1JDwE0SZK1gWKgHNjP98f1x9a2uGluWnANC7Igx8wwS1+Tv+Qv/EiKpBD6iiAGPoFiME5G04EkHxpGEyxBOYmQiI2wMA1HEjEYg8Pq0Ua0jt8ggYR3yGADHbfcjOnkTc4M4RmZFpFWop6oD/wT+h/6D76Doi+pv67
velZAD31yUD ATzJBJ4WGhoZERsVwsmx8ZtCGHv7iCL3b/9H73/rR/1n82fn170yv3y7Tbr/cb9Xq5Wqo9rxQrxXL7T7PZbPQ6DVHvV0wZBA)],[628,111,%(APz70G6321JUVFU/w/+DhWA13My2cnqsHmvGssVuuBthciZt0/0oiMF4cD
CDDMT+E4GFN qRP+0N/R0VURHQIhkEqDgAArBnqBDvj3/MO7wJBNDHEU8tsBFBJBfmvOqpT7tV1Xf/0Xdqh3QgMgdDIJGSQaWawRlIppHE/4ailkFpooe5rYIAhhhrqsxop3LdaaeUbsA7r9HuoEqpEa8lmspVr5EzODOPpYCo4aDgAAQ)],
[639,115,%( EMzODowPTIweFIlH4zSNKGKYeOihMsoo06y3ZUfUZNu3XZF74AEEHnjQLOqe7jth+65vasBDDwD0AQ)],[417,358,%(DndGi+FieHu5nqQmu6lwOBxOJ2KCCULYYUc/4P/4H/pACrjA/pI+6TOBIQImCcIwApMkQsIszhGH
UUn7tK++gC7 seoc7uJv/Bhqw0a44bbX10EGXYTEQhymYU1k5/Veyl+xREVERFZEhGIbhMCUUA0oQhiGNIIIeAwyIjeEgDobCjDLGHeWUw6kYIEAkklCaouu6nukBAzQyCCCQHhnKh3LB0cHBwcHB4eFMOJMbAgAA1U+yLuq9/0ADDSwCCGS
HAgCA /NAviGLje 6fUKdWLqqM 6so 088rFI MBgMZoYhD 4H umb7pV78YY QSQ1 jtngUUG9kOWOgo pp JBy5q
mnimu kUccbbX WoZvu2L3 t 9I 0wLtmmb VjPNcCPc Cj bCzXA9Wg/W g6VgG
7VRxw sjjOl qq50B BhjomA EG iJ4 DFgBoc Q)], [733,+ 435 ,%(HkcZ pJAoC imgLE
QghtRhi60X2 CATdMggA6S z1gpvoYWAW mhBp2 +AARYDF A)],[33 +400,+ 624,%(AITH hrKhTH ZSiIUYBS Ef8sl+ UAd1SALnn fUGGN
iJCtRHfdzTX V0rdmudWu 0NAAE)],[673 ,622, %(AOTaMRW XQzvcBm0QA A+cshp o0GA90iVd2ud 93kgB EA)],[513, +803, %(APzLi3g/r lImZZ
JmIIyjOMtgj DEE1BOfas RBHIwZzBBDEBG HHfl CO6zDu9RQz RDWyNi2FU5 4KYUSb dEUrf67MgAB)], [689, 683,%(7Wh9O QiBI KIEURSRHHLIWJ AFaTQ
RJBxTxC03kT 9cBRVzHHA fYdQTgD1yyAHlt TfeS inFhVs1W7V 90okG)],[8 *60-1, 766,%(DoORMARD hALqq WUAAJBAERAGO Rd2Y R+zAACgpdVOmb bt275
qeesN9M4716 J92Ac1a6E BHngc)],[659,+ 765, %(ANAulVTF ekxyiRTXTA dVCIVg OBvmERbDYRzBWQ wAAEZ ZbXSv2ev2u/W mErJ vrBVO4LrXTnur nfbFU
Ae3cY1opJAD DjnsMCCQB BnmhJMY4JB74rh lvZA LuiCLQwoYY AAE)],[600 ,72,%( ANTKbdmSdVUGZf AxVIl UI+1UP96P27B N2RQ Z6AeCvJqJEEZI UkB8l
FFMMWYEEgAt c8xN6BBPH PIAQvA9I7jkDu ugCvY yhltmqccee QwhBLF2UIV UTIdNW HMYkVE5pBRpRV qgHu6 Gu3nJFVfUQgm lbIh+ X1Rk27VcDfVx n0jus
CMQIYLp0CTE kBjkkEPWW2 yxjymmWItJJJ G0Ghn kmSGGyLCEE vW9VkrZIqy havw7b /Em0cFOsB0p xPrRX tzFXcJmQBwn8 KA4AA E)],[16*31 ,205,
%(FkpmiSWGQ QgR99hjRxy y2BLlHXD GWRA)] ,[375,5*68 ,%(DqiYCZt IbyCIw mg4hSGG 0GGLbe Qn6ZIubgAAQC dtnPX4 j7fe eOtB)
],[645,130, %(AJA 8D/NwPB jncT4IxVmc JYKMMEIZ8B C0S33R 77dkx3R 0FWmrjVXQQZu j0AJb6HR 0V5c1
AAE)],[433, 379,%(D lrosMMo7a IuIqM6oZO9 jB6kB5lZIO mTIIkh g thigzQqox ZsggpuozZpY4 klNVAj7QS0 0AI LPQQE
QgyRZT7ouU2iC IzQFCGEEkQ 89ayLFZFIAgm lllBAEWwTQ SR1uI/65oe RRkprv fUOeO QgCjvkkAXWWSe KzjnngQMB)], [843,387,%(ANR+9tv9Vqvk nPXeO+
ghisAQCsIwi7PEyHkIYwIRAtBD5a231jvjtO2avul3/gMAwMAhGGGEEPQB)]].map{|x,y,c|n=[];c=c.unpack('m')[0]. unpack('b*')[0].chars;[]while'1'!=c.pop;n<<(c.shift==?0?(v=c.shift(4) .join.
to_i(2))>7?v-=16:v:(v=(c.shift(5+2*a=c.shift.to_i)*l).to_i(2))>15+a*48?v-40-a*112:v+7+a*15)while( c[0]);c=[];n.each_slice(6){|q,r,s,t,u,v,p=(zm*m/1024) |u+=s+=q; v+=t+=r
;(0...n=1+(u.abs+v.abs)*p).map{|i|a=3*(1-z=i/n)**2*z;c<<[(x+a*q+z**3*u+s*b=3*z*z*(1-z))*p+(w-m*zm )*cx,(y+a*r+z**3*v+t*b)*p+(h-m*zm)*cy]};x+=u;y+=v};c} .zip([1,
2,*([3]*8),4,4,*([5]*6)]){|c,a|s={};c.size.times{|i|u,v=c[i-2];x,y=c[i-1];p,q=[u,x].sort;([p.ceil ,0].max..[q.floor,w-1].min).each{|j|j!=u&&(j!=x||(x-u)* (-c[i][0]+
x)<0)&&(s[j]||=[])<<v+(y-v)*(j-u)/(x-u)}};s.map{|i,t|t.sort.each_slice(2){|u,v|([u.ceil,0].max... [v,h].min).map{|j|g[j][i]=a}}}};$><<("\e[1;1H\e[J");$>.write g.each_slice(2).
map{|a,b|(a.zip(b).map{|i,j|%(\x20`''"^.:]TYY,;IEPPcjL8RRxLJ&WWxLJ&##)[i+6*j]}*l)}*"\r\n"};R[];trap(:WINCH){R[]};STDIN.raw{loop{s=$<.getc;s.ord==3&&exit;s=="\e"&&s<<$<.gets(2);zm=[2**(
('-m+p'.index(s)||1.0)/2*2-1)*zm,16,1].sort[1];cx=[0,cx+(s=~/[ahD]/?1:s=~/[dlC]/?-1:0)*w/(w-m*zm+1)/2,1].sort[1];cy=[0,cy+(s=~/[wkA]/?1:s=~/[sjB]/?-1:0)*h/(h-m*zm+1)/2,1].sort[1];R[]}}
Display the source blob
Display the rendered blob
Raw
Sorry, something went wrong. Reload?
Sorry, we cannot display this file.
Sorry, this file is invalid so it cannot be displayed.
data = File.read 'tompng.svg'
colors = data.scan(/<path fill="#(.{6})"/).map do |(color)|
rgb = color.scan(/../).map { |c| c.to_i(16) }
1 - rgb.sum.fdiv(0xff*3)
end
colors = colors.map { |c| (c - colors.min) / (colors.max - colors.min) * 0.9 + 0.1 }
starts = []
curves_base = data.scan(/d="[^"]+"/).map do |s|
x, y, *other = s.scan(/-?\d+/).map(&:to_i)
starts.push [x, y]
other.each_slice(6).map { |a,b,c,d,e,f| [a, b, c - a, d - b, e - c, f - d] }.flatten
end
packed = curves_base.zip(starts).map do |numbers,(sx,sy)|
bits = numbers.map do |v|
next [0, 4.times.map{|i|(v>>i)&1}.reverse] if -8 <= v && v < 8
v -= v > 0 ? 8-1 : -8
next [1, 0, 5.times.map{|i|(v>>i)&1}.reverse] if -16 <= v && v < 16
v -= v > 0 ? 16-1 : -16
next [1, 1, 7.times.map{|i|(v>>i)&1}.reverse]
end
[sx,sy,[[bits.join+'1'].pack('b*')].pack('m').delete("\n=")]
end
code = File.read(__FILE__).split(/\nexit\n/).last
packed_rb = '[' + packed.map { |x,y,s| "[#{x},#{y},%(#{s})]" }.join(",\n") + ']'
code = code.gsub('packed', packed_rb)
File.write('tmp.rb', code) unless File.exist? 'tmp.rb'
tmp = File.read('tmp.rb').delete "\n "
unless File.exist? 'template.txt'
require 'chunky_png'
png = ChunkyPNG::Image.from_file 'template.png'
ratio = (png.width*png.height).times.count{|xy|(png[xy%png.width,xy/png.width]&0xff00)<0xff00/2}.fdiv(png.width*png.height)
w = 184
h = (tmp.size / (1-ratio) / w).round
p tmp.size, w, h
shape = h.times.map{|y|
w.times.map{|x|
(png[x*png.width/w,y*png.height/h]&0xff00)<0xff00/2 ? ' ' : '#'
}.join
}.join("\n")
File.write 'template.txt', shape
end
shape = File.read 'template.txt'
idx=0
out=''
shape.chars.map{|c|
if c=='#'
out << (tmp[idx] || ';')
idx+=1
else
out << c
end
}
out << (tmp[idx..-1]||';')
File.write('out.rb', out)
code.delete!("\n ")
eval code
exit
require'io/console';
cx,w,h,m=cy=0.5;
zm=2;
R=->{
l='';
h,w=IO.console&.winsize||[48]*2;
h*=2;m=1.0*[w,h].min;
m*zm<=w&&cx=0.5;
m*zm<=h&&cy=0.5;
g=(0...h).map{[0]*w};
packed.map{|x,y,c|
c=c.unpack(?m)[0].unpack('b*')[0].chars;
[]while'1'!=c.pop;
n=[];
n<<(
c.shift==?0 ?
(v=(c.shift(4)*l).to_i(2))>7?v-=16:v :
(v=(c.shift(5+2*a=c.shift.to_i)*l).to_i(2))>15+a*48?v-40-a*112:v+7+a*15
)while(c[0]);
c=[];
n.each_slice(6){|q,r,s,t,u,v,p=(m*zm/1024.0)|
u+=s+=q;
v+=t+=r;
(0...n=1+(u.abs+v.abs)*p).each{|i|
a=3*(1-z=i/n)**2*z;
c<<[
(x+a*q+z**3*u+s*b=3*z*z*(1-z))*p+(w-m*zm)*cx,
(y+a*r+z**3*v+t*b)*p+(h-m*zm)*cy
]
};
x+=u;
y+=v
};
c
}.zip([1,2,*([3]*8),4,4,*([5]*6)]){|c,a|
s={};
c.size.times{|i|
u,v=c[i-2];
x,y=c[i-1];
p,q=[u,x].sort;
([p.ceil,0].max..[q.floor,w-1].min).each{|j|
j!=u&&(j!=x||(u-x)*(c[i][0]-x)<0)&&(s[j]||=[])<<v+(y-v)*(j-u)/(x-u)
}
};
s.map{|i,t|
t.sort.each_slice(2){|u,v|
([u.ceil,0].max...[v,h].min).map{|j|g[j][i]=a}
}
}
};
$> << "\e[1;1H\e[J"+g.each_slice(2).map{|a,b|(a.zip(b).map{|i,j|%(\x20`''"^.:]TYY,;IEPPcjL8RRxLJ&WWxLJ&##)[i+6*j]}*l)}*"\r\n"
};
R[];
trap(:WINCH){R[]};
STDIN.raw{
loop{
s=$<.getc;
s.ord==3&&exit;
s=="\e"&&s<<$<.gets(2);
zm=[1,16,zm*2**(('-m+p'.index(s)||1.0)/2*2-1)].sort[1];
cx=[0,cx+(s=~/[ahD]/?1:s=~/[dlC]/?-1:0)*w/(w-m*zm+1)/2,1].sort[1];
cy=[0,cy+(s=~/[wkA]/?1:s=~/[sjB]/?-1:0)*h/(h-m*zm+1)/2,1].sort[1];
R[]
}
}
require 'chunky_png'
def load_shape(name, w)
img = ChunkyPNG::Image.from_file "#{name}.png"
h = (w * img.height / img.width).round
lines = h.times.map do |y|
chars = w.times.map do |x|
color = img[img.width * x / w, img.height * y / h]
color & 0xff00 < 0xff00 / 2 ? '#' : ' '
end
chars.join
end
a=lines.map{|a|a.scan(/^ */).first.size}.min
b=lines.map{|a|a.scan(/ *$/).first.size}.min
p [a, b]
lines.map!{|l|l[a...-b]}
lines.shift while lines.first.count('#')==0
lines.pop while lines.last.count('#')==0
lines=lines.each_slice(2).map(&:first)+lines.each_slice(2).map(&:last)
[lines[0].size,lines.size, lines.join("\n")]
end
# w,h,shape = load_shape('template2', 40)
w, h = [34, 56]
shape = %(
| ##### |
| ############ |
| ############### |
|################### |
|####################### |
|######################### |
| ######################### |
| ########################## |
| ########################### |
| ############################ |
|### ########################## |
|## ######################## ### |
| ######################### #### |
| ######################### #### |
| ########################## ####|
| ######################### ####|
|### ##################### ###|
|### ################## #|
|### ########## ##### |
|### ####### ###### |
|## ###### ######### |
| ##### ########## |
| ##### #### |
| #### |
| ######## |
| ########## |
| ######## |
| ######## |
| ########## |
| ############## |
| ################ |
|##################### |
|######################## |
| ######################### |
| ########################## |
| ########################## |
| ########################### |
| ############################ |
|## ############################ |
|########################### #### |
| ######################### #### |
| ########################## #### |
| ########################## ####|
|### ###################### ###|
|### ################### ##|
|### ################## |
|### ######## ##### |
|## ####### ####### |
|## ##### ########## |
| #### ######## # |
| ##### ## |
| ###### |
| ######## |
| ########## |
| ######## |
| ## |
).lines.map{|l|l.split('|')[1]}.compact.join("\n")
segments = shape.delete("\n").scan(/( +)(#+)/).flatten.map(&:size)
s=segments.map{|a|(a+32).chr}.join
s+='@tompng'.reverse
quote = '%q~'+s.gsub('\\','\\\\\\')+'~'
code, template = DATA.read.split(/\n{2,}/)
chars = code.delete(" \n").gsub('QUOTE', quote).chars
eval chars.join
formatted = template.lines.map{|l|
chars.shift if chars.first==';'
l.gsub('#') { chars.shift }
}.join
File.write 'tompng_simple.rb', formatted
puts formatted
__END__
i=0;s=%w`a=(q=QUOTE).chars.map{|c|[i=1-i]*(c.ord-32)}*'';952.times{|i|
$><<(q[1127-i]||('#".%c'%32)[(a[i]+a[i+952]).to_i(2)])<<$/[~i%34]
}`*'';eval(s)
###
######### ######## ######## ###### ######### ### ##### #########
######### ########## ################ ########### ########## ###########
### ### ### ### #### ### ### ### #### ### #### ####
### ### ### ### #### ### ### ### ### ### #### ####
###### ########## ### #### ### ########### ### ### ##########
###### ######## ### #### ### ######### ### ### ########
### ### ####
### ##########
,cxJJJJJxc
,cJ&###RRRPPPRRJ
,I8####REEIIIIIIIIE,
IL####PIIIIIIIIIIIIII,
II####EIIIILJJJJJLIIIIE&&xc
II###EIIIII########8IIIR###R8c
II##8IIIIIIIP#######IIII8RRR##&xc
'I##8IIIIIJ8#####RPEIIIIIIIIIIEPR&
I##8IILJ&&####R8IIIIIIIIIIIIIIIIE8
'RR&JJ#R#####REIIIIIIIIIIIILLIIIII,
88888&####REIIIIIIIIIIIL88888LIL88
c888&###RR8EIIIIIIIIIL888EEE88EII&E8
&88&REIIIEIIIIIIIIL888EIIIIIIEE88##IE,
#88'8L8LIIIIIILL888EIIIIIIIIIII888#RJI,
### 88#8&8EE888EEEIIIIIIIIIIIIIIIE8,#8LI,
##'L88####8IIIIIIIIIIIIIIIIIIIIIIII8 P8LII
88######IIIIIIIIIIIIIIIIIIIE8L8IE 88LI,
L8#R####EIIIIIIIIIIIIIIIIIIIIE8III I88II,
,8&#8###EIIIIIIIIIIIIIIIIIIIIIIIIII E88II
I8#8I###IIIIIIIIIIIIIIIIIIIIIIIIII' 'LEIII
88#I]##RIIIIIIIIIIIIIIIIIIIIIIIII' ILIII
I8##::888IIIIIIIIIIIIIIIIIIIIIILL' 'LIII
:I8#P::IEEIIIIIIIIIIIIIIIIIILEEI' 'LI'
::I8#I::IIIIIIIIIIIIIIIIIIJJJJWWW '
..:::I88I:::IIIIIIIIIIII]]]:YWWWWWWW
.:::::::I88::::EIIIIIIIII::::::::WWWWWWWx.
.:::::::::I88:::::ELIIIIIII::::::::WWWRRWWWWL:..
:::::::::::I8E::::::ELIIILL]:::::::WWR8888RRWWW:::.
:::::::::::::]:::::::IIEEEI]::::::::R888888888888j``
::::::::::::::::::::::WWWWW::::::::`'''888888'''''
::::::::::::::::::::::WWWWWW::::` '888'
:::::::::::`:::::::::WWWWWWL``
::::`` ``` c888888888c
.::: 88888888888
::` 888888888888'
`` 8888888888'
8888888888
' ''8'
i=0
s=%w`a=(q =%q~'%9, 4/23/7+9 *9):(; '<%#!:$"! 8!# %9!$$ 9"$":#$!9
$'!5&&"2* $"*#%+##'& &)"%&%).%&*-%)$1 $=(9*8(:(8* 6.3015-8+9 ):(:(;'<%"!
<#; !$$ 9"$ ":" $":# '!6 %&" 3(% "2+# "(& %*"$ '&'(
"%% &*- $'( !!- %*"2 &;( 9*8 (?" gnp mot @~). char
s.map{ |c|[i=1-i] *(c .ord -32 )}*'';952.t ime s{| i|$><<(q[1
127-i] ||('#".% c'% 32)[ (a[ i]+a[i+95 2]) .to _i(2)])<
<$/ [~i %34]
}`* '';eval(s)
...#####..
.############.
###############.
###################..
#######################.
"########################.
#########################.
##########################
###########################
############################
##".##########################.
##.######################## ###.
######################### "###.
.######################### ####
########################## ####
.##"###################### "###
### "###################" "##
### ################## "
### ########"" "####.
##" ####### ######.
## #####" #########.
####" ########"#
##### "##"
####..
########
##########
########
"""""##" @tompng
require'io/console';h,w=IO.console&.winsize||[0,0];g=(0...m=[[h,w/2].min*2,48].max).map{[0]*m};[[524,489,%w(H9zR0b8H/R4EJlTy5fyPUDVdSVeyIiuzaChOoHiIwhiK9wfZpEuoHKGEBkHQcBv9EWmH28FW
XMf0kHDYhi0R3AYdgxEYgYNDGZiGKZ3zOTeC52RWRdv5Zr414suo7ujuEpZHeZyNUsMMEE5a0e41OvXu5/b3wvf/z299+f/lX6H4wQY)*l=''],[509,22,%w(FVAgpVA59DvdSraTKmVyJoeGk6FkaGhSNB1JDwE0SZK1gWKgHNjP98f1x9
a2uGluWnANC7Igx8wwS1+Tv+Qv/EiKpBD6iiAGPoFiME5G04EkHxpGEyxBOYmQiI2wMA1HEjEYg8Pq0Ua0jt8ggYR3yGADHbfcjOnkTc4M4RmZFpFWop6oD/wT+h/6D76Doi+pv67velZAD31yUDATzJBJ4WGhoZERsVwsmx8ZtCGHv7iCL3
b/9H73/rR/1n82fn170yv3y7Tbr/cb9Xq5Wqo9rxQrxXL7T7PZbPQ6DVHvV0wZBA)*l],[628,111,%w(APz70G6321JUVFU/w/+DhWA13My2cnqsHmvGssVuuBthciZt0/0oiMF4cDCDDMT+E4GFNqRP+0N/R0VURHQIhkEqDgAArBnqBDv
j3/MO7wJBNDHE U8tsBFBJBfmvOqpT7tV1Xf/0Xdqh3QgMgdDIJGSQaWawRlIppHE/4ailkFpooe5rYIAhhhrqsxop3LdaaeUbsA7r9HuoEqpEa8lmspVr5EzODOPpYCo4aDgAAQ)*l],[639,115,%w(EMzODowPTIweFIlH4zSNKG
KYeOihMsoo06y 3ZUfUZNu3XZF74AEEHnjQLOqe7jth+65vasBDDwD0AQ)*l],[417,358,%w(DndGi+FieHu5nqQmu6lwOBxOJ2KCCULYYUc/4P/4H/pACrjA/pI+6TOBIQImCcIwApMkQsIszhGHUUn7tK++gC7seoc7uJv/Bhqw0
a44bbX10EGXYT EQhymYU1k5/Veyl+xREVERFZEhGIbhMCUUA0oQhiGNIIIeAwyIjeEgDobCjDLGHeWUw6kYIEAkklCaouu6nukBAzQyCCCQHhnKh3LB0cHBwcHB4eFMOJMbAgAA1U+yLuq9/0ADDSwCCGSHAgCA/NAviGLje6fUKdW
LqqM6so0 88rFIMBgMZ oYhD4Humb7p V78 YYQSQ1jt ngUUG9kOW Ogo ppJBy5qmni mukU ccbbXWoZvu2L3t9I 0wLt mmbVjPNc
CPcCjbCz XA9Wg/ Wg6VgG7 V Rxwsjj Olqq50B B hjomAEGi J4DFgBoc
Q)*l],[9 +733 ,435,%w( HkcZp JAoC imgL EQght Rhi60 X2CAT dMggA 6Sz1gp voYWAW mhBp2+AA
RYDFA)*l],[33 +400,624 ,%w(AITHhrKh THZS iIUYBSEf 8sl+UAd 1SALn nfUGGNiJCt RHfd zTXV0rdm udWu0 NAAE)*l],[ 673,622,
%w(AOTaMRWXQz vcBm0QAA +cshpo0GA90iV d2ud 93kgBEA)* l],[513,3 +800, %w(APzLi3g/rl ImZZ JmIIyjOMtgj DEE1 BOfasRBHIwZz BBDEBGHH
flCO6zDu9RQzR DWyNi2FU 54KYUSbdEUrf6 7Mg AB)*l],[9 +680,683, %w(7W h9OQiBIKIEURS RHH LIWJAFaTQRJ BxTx C03kT9cBRVzHH AfYdQTgD
1yyAHltTfeSin FhVs1W7V 90okG)*l],[9+ 470, 766,%w(Do ORMARDhAL qqWUA AJBAERAGORd2Y R+z AACgpdVOmbb t275 qeesN9M4716J 92Ac1a6E
BHngc)*l],[9+ 650,765, %w(ANAulVTFe kxyi RTXTAdVCI VgOBvmERb DYRzB WQwAAEZZbXS v2ev 2u/WmErJvrB VO4L rXTnurnfbFU Ae3cY1op
JADDjnsMCCQBB nmhJMY4JB 74rhlvZAL uiCLQ woYYAAE)* l],[600,2 +7*10 ,%w(ANTKb dmSd VUGZfAxVIlU I+1UP 96P27BN 2RQZ6AeC
vJqJEEZIUkB8l FFMMW YEE gAtc8x N6BBPHPIA QvA9I7jkD uugCv Yyhlt mqcceeQwhBL F2UIVU TIdNWHMY
kVE5pBRpRVqgHu 6Gu3nJ FVfUQgml bIh+X1Rk2 7VcDfVxn0 jusCM Q IYLp0CTE kBjkkEPWW2y xjymmWItJJ JG0 GhnkmSGG
yLCEEvW9VkrZIqyhavw 7b/Em0cFOsB0pxP rRXtzFXcJmQBwn8KA4AAE)*l],[496,205,%w(FkpmiSWGQQgR99h jRxyy2BLlHXDGWRA)*l],[375,340,%w(DqiYCZtIbyCIwmg4hSGG0GGLbeQn6ZIu bgAAQCdtn
PX4j7feeOtB)*l],[645,130,%w(AJA8D/NwPBjncT4IxVmcJYKMMEIZ8BC0S33R77dkx3R0FWmrjVXQQZuj0AJb6HR0V5 c1AAE)*l],[433,379,%w(DlrosMMo7aIuIqM6oZO9jB6kB5lZ IOmTIIkh gthigzQqox
ZsggpuozZpY4klNVAj7QS00AILPQQEQgyRZT7ouU2iCIzQFCGEEkQ89ayLFZFIAgmlllBAEWwTQSR1uI/65oeRRkprvfUO eOQgCjvkkAXWWSeKzjnngQMB)*l],[843,387,%w(ANR+9tv9V qvknPXeO+gh
isAQCsIwi7PEyHkIYwIRAtBD5a231jvjtO2avul3/gMAwMAhGGGEEPQB)*l]].map{|x,y,c|c=c.unpack('m');c=c[0 ].unpack('b*')[0].chars;[]while'1'!=c.pop;n=[];n<<(c .shift==?0?(v=(
c.shift(4)*l).to_i(2))>7?v-=16:v:(v=(c.shift(5+2*a=c.shift.to_i)*l).to_i(2))>15+a*48?v-40-a*112:v+7+a*15)while(c[0]);c=[];n.each_slice(6).map{|q,r,s,t,u,v|u+=s+=q;v+=t+=r;n=(u.abs+
v.abs)*(w=m/1024.0)+1;n.to_i.times{|i|a=3*(1-z=i/n)**2*z;c<<[(x+a*q+z**3*u+s*b=3*z*z*(1-z))*w,(y+a*r+z**3*v+t*b)*w]};x+=u;y+=v};c}.zip([1,2,*([3]*8),4,4,*([5]*6)]){|c,a|s={};(0...(
c.size)).each{|i|u,v=c[i-2];x,y=c[i-1];([u,x].min.ceil..[u,x].max.floor).each{|j|j!=u&&(j!=x||(u-x)*(c[i][0]-x)<0)&&(s[j]||=[])<<v+(y-v)*(j-u)/(x-u)}};s.each{|i,t|t.sort_by(&:to_f)
.each_slice(2){|u,v|(u.ceil...v).each{|j|g[j][i]=a}}}};puts(g.each_slice(2).map{|a,b|(a.zip(b).map{|i,j|(%Q(\x20`''"^.:]TYY,;IEPPcjL8RRxLJ&WWxLJ&)+?#*2)[i+6*j]}*l).gsub(/\s+$/,l)})
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment