# -*- coding: utf-8 -*-
require 'minitest/autorun'
BuildTrack =->{
# Program begins here ----------
_={│:[1,4],─:[2,8],┌:[4,8],┐:[4,2],└:[1,8],┘:[1,2],┼:[1,4,2,8]}
s=->a,l,b{l==[]&&a==[]?b:(l.product(l).any?{|q,r|q,r=q[0],r[0];(q[0]-r[0])**2+(q[1]-r[1])**2>a.size**2}?!0:(w,f=l.pop
w&&v=!a.size.times{|i|y=_[x=a[i]]
f&&y&[f]==[]||(k=l.select{|p,d|w!=p||y&[d]==[]}
(y-[f]).map{|d|z=[w[0]+(d<2?-1:(d&4)/4),w[1]+(d==2?-1:d>7?1:0)]
g=d<3?d*4:d/4
b[z]?_[b[z]]&[g]!=[]||v=0:k<<[z,g]}
v||r=s[a[0...i]+a[i+1..-1],k,b.merge({w=>x})]
return r if r)}))}
c=eval"[#{gets}]"
r=s[6.downto(0).map{|i|[_.keys[i]]*c[i]}.flatten,[[[0,0],nil]],{}]
h=j=k=l=0
r.map{|w,_|y,x=w
h>x&&h=x
j>y&&j=y
k<x&&k=x
l<y&&l=y}
s=(j..l).map{|_|' '*(k-h+1)}
r.map{|w,p|y,x=w
s[y-j][x-h]=p.to_s}
puts s
# Program ends here ----------
}
describe BuildTrack do
# takes ~0.1s
def test_very_simple_square
assert_equal <<-EOS, execute("2,2,1,1,1,1,0\n")
┌─┐
│ │
└─┘
EOS
end
# takes ~0.6s
def test_added_more_vertical_pieces
assert_equal <<-EOS, execute("6,2,1,1,1,1,0\n")
┌─┐
│ │
│ │
│ │
└─┘
EOS
end
# takes ~0.0s
def test_throwing_cross_pieces_into_the_mix
assert_equal <<-EOS, execute("0,0,2,1,1,2,1\n")
┌┐
┌┼┘
└┘
EOS
end
# takes ~0.4s
def test_longer_track_containing_a_cross_piece
assert_equal <<-EOS, execute("4,4,2,1,1,2,1\n")
┌┐
┌──┼┘
│ │
│ │
└──┘
EOS
end
# remove the leading "x_"s to run these long lasting tests
# takes ~34s
def x_test_OP_testcase_1
assert_equal <<-EOS, execute("3,5,2,2,2,2,1\n")
┌──┐┌┐
│ └┼┘
│ │
└───┘
EOS
end
# takes ~2s
def x_test_OP_testcase_2
assert_equal <<-EOS, execute("0,0,1,4,4,1,3\n")
┌┐
└┼┐
└┼┐
└┼┐
└┘
EOS
end
def execute(input)
capture_stdout(input){ BuildTrack[] }
end
end
# capture STDIN/STDOUT for testing purposes
require 'stringio'
module Kernel
def capture_stdout(console_input = '')
$stdin = StringIO.new(console_input)
out = StringIO.new
out.set_encoding 'utf-8'
$stdout = out
yield
return out.string
ensure
$stdout = STDOUT
$stdin = STDIN
end
end
IyAtKi0gY29kaW5nOiB1dGYtOCAtKi0KcmVxdWlyZSAnbWluaXRlc3QvYXV0b3J1bicKCkJ1aWxkVHJhY2sgPS0+eyAKCiMgUHJvZ3JhbSBiZWdpbnMgaGVyZSAtLS0tLS0tLS0tCgpfPXvilII6WzEsNF0s4pSAOlsyLDhdLOKUjDpbNCw4XSzilJA6WzQsMl0s4pSUOlsxLDhdLOKUmDpbMSwyXSzilLw6WzEsNCwyLDhdfQpzPS0+YSxsLGJ7bD09W10mJmE9PVtdP2I6KGwucHJvZHVjdChsKS5hbnk/e3xxLHJ8cSxyPXFbMF0sclswXTsocVswXS1yWzBdKSoqMisocVsxXS1yWzFdKSoqMj5hLnNpemUqKjJ9PyEwOih3LGY9bC5wb3AKdyYmdj0hYS5zaXplLnRpbWVze3xpfHk9X1t4PWFbaV1dCmYmJnkmW2ZdPT1bXXx8KGs9bC5zZWxlY3R7fHAsZHx3IT1wfHx5JltkXT09W119Cih5LVtmXSkubWFwe3xkfHo9W3dbMF0rKGQ8Mj8tMTooZCY0KS80KSx3WzFdKyhkPT0yPy0xOmQ+Nz8xOjApXQpnPWQ8Mz9kKjQ6ZC80CmJbel0/X1tiW3pdXSZbZ10hPVtdfHx2PTA6azw8W3osZ119CnZ8fHI9c1thWzAuLi5pXSthW2krMS4uLTFdLGssYi5tZXJnZSh7dz0+eH0pXQpyZXR1cm4gciBpZiByKX0pKX0KYz1ldmFsIlsje2dldHN9XSIKcj1zWzYuZG93bnRvKDApLm1hcHt8aXxbXy5rZXlzW2ldXSpjW2ldfS5mbGF0dGVuLFtbWzAsMF0sbmlsXV0se31dCmg9aj1rPWw9MApyLm1hcHt8dyxffHkseD13Cmg+eCYmaD14Cmo+eSYmaj15Cms8eCYmaz14Cmw8eSYmbD15fQpzPShqLi5sKS5tYXB7fF98JyAnKihrLWgrMSl9CnIubWFwe3x3LHB8eSx4PXcKc1t5LWpdW3gtaF09cC50b19zfQpwdXRzIHMKCiMgUHJvZ3JhbSBlbmRzIGhlcmUgLS0tLS0tLS0tLQoKfQoKZGVzY3JpYmUgQnVpbGRUcmFjayBkbwogICMgdGFrZXMgfjAuMXMKICBkZWYgdGVzdF92ZXJ5X3NpbXBsZV9zcXVhcmUKICAgIGFzc2VydF9lcXVhbCA8PC1FT1MsIGV4ZWN1dGUoIjIsMiwxLDEsMSwxLDBcbiIpCuKUjOKUgOKUkArilIIg4pSCCuKUlOKUgOKUmApFT1MKICBlbmQKCiAgIyB0YWtlcyB+MC42cwogIGRlZiB0ZXN0X2FkZGVkX21vcmVfdmVydGljYWxfcGllY2VzCiAgICBhc3NlcnRfZXF1YWwgPDwtRU9TLCBleGVjdXRlKCI2LDIsMSwxLDEsMSwwXG4iKQrilIzilIDilJAK4pSCIOKUggrilIIg4pSCCuKUgiDilIIK4pSU4pSA4pSYCkVPUwogIGVuZAoKICAjIHRha2VzIH4wLjBzCiAgZGVmIHRlc3RfdGhyb3dpbmdfY3Jvc3NfcGllY2VzX2ludG9fdGhlX21peAogICAgYXNzZXJ0X2VxdWFsIDw8LUVPUywgZXhlY3V0ZSgiMCwwLDIsMSwxLDIsMVxuIikKIOKUjOKUkArilIzilLzilJgK4pSU4pSYIApFT1MKICBlbmQKCiAgIyB0YWtlcyB+MC40cwogIGRlZiB0ZXN0X2xvbmdlcl90cmFja19jb250YWluaW5nX2FfY3Jvc3NfcGllY2UKICAgIGFzc2VydF9lcXVhbCA8PC1FT1MsIGV4ZWN1dGUoIjQsNCwyLDEsMSwyLDFcbiIpCiAgIOKUjOKUkArilIzilIDilIDilLzilJgK4pSCICDilIIgCuKUgiAg4pSCIArilJTilIDilIDilJggCkVPUwogIGVuZAoKICAjIHJlbW92ZSB0aGUgbGVhZGluZyAieF8icyB0byBydW4gdGhlc2UgbG9uZyBsYXN0aW5nIHRlc3RzCgogICMgdGFrZXMgfjM0cwogIGRlZiB4X3Rlc3RfT1BfdGVzdGNhc2VfMQogICAgYXNzZXJ0X2VxdWFsIDw8LUVPUywgZXhlY3V0ZSgiMyw1LDIsMiwyLDIsMVxuIikK4pSM4pSA4pSA4pSQ4pSM4pSQCuKUgiAg4pSU4pS84pSYCuKUgiAgIOKUgiAK4pSU4pSA4pSA4pSA4pSYIApFT1MKICBlbmQKCiAgIyB0YWtlcyB+MnMKICBkZWYgeF90ZXN0X09QX3Rlc3RjYXNlXzIKICAgIGFzc2VydF9lcXVhbCA8PC1FT1MsIGV4ZWN1dGUoIjAsMCwxLDQsNCwxLDNcbiIpCuKUjOKUkCAgIArilJTilLzilJAgIAog4pSU4pS84pSQIAogIOKUlOKUvOKUkAogICDilJTilJgKRU9TCiAgZW5kCgoKICBkZWYgZXhlY3V0ZShpbnB1dCkKICAgIGNhcHR1cmVfc3Rkb3V0KGlucHV0KXsgQnVpbGRUcmFja1tdIH0KICBlbmQKZW5kCgoKIyBjYXB0dXJlIFNURElOL1NURE9VVCBmb3IgdGVzdGluZyBwdXJwb3NlcwpyZXF1aXJlICdzdHJpbmdpbycKbW9kdWxlIEtlcm5lbAogIGRlZiBjYXB0dXJlX3N0ZG91dChjb25zb2xlX2lucHV0ID0gJycpCiAgICAkc3RkaW4gPSBTdHJpbmdJTy5uZXcoY29uc29sZV9pbnB1dCkKICAgIG91dCA9IFN0cmluZ0lPLm5ldwogICAgb3V0LnNldF9lbmNvZGluZyAndXRmLTgnCiAgICAkc3Rkb3V0ID0gb3V0CiAgICB5aWVsZAogICAgcmV0dXJuIG91dC5zdHJpbmcKICBlbnN1cmUKICAgICRzdGRvdXQgPSBTVERPVVQKICAgICRzdGRpbiA9IFNURElOCiAgZW5kCmVuZAo=