DRUNKEN_BISHOP=
->k{w=17
r=[z=?++?-*w+?+]
(0...w*9).each_slice(w).map{|o|r<<?|+o.map{|x|c=76
q=0
k.split(?:).flat_map{|b|(0..7).map{|i|b.to_i(16)[i]}}.each_slice(2){|h,v|v<1?(c>w&&c-=w):c<w*8&&c+=w
c+=h<1?c%w>0?-1:0:c%w<16?1:0
c==x&&q+=1}
x==76??S:c==x ??E:' .o+=*BOX@%&#/^'[q]}.join+?|}
(r+[z]).join'
'}
require 'minitest/autorun'
describe DRUNKEN_BISHOP do
def test_case_1
assert_equal <<-EOS.chomp, DRUNKEN_BISHOP['37:e4:6a:2d:48:38:1a:0a:f3:72:6d:d9:17:6b:bd:5e']
+-----------------+
| |
| |
| . |
| . o |
|o . o . S + |
|.+ + = . B . |
|o + + o B o E |
| o . + . o |
| .o |
+-----------------+
EOS
end
def test_case_2
assert_equal <<-EOS.chomp, DRUNKEN_BISHOP['16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48']
+-----------------+
| . |
| + . |
| . B . |
| o * + |
| X * S |
| + O o . . |
| . E . o |
| . . o |
| . . |
+-----------------+
EOS
end
def test_case_3
assert_equal <<-EOS.chomp, DRUNKEN_BISHOP['b6:dd:b7:1f:bc:25:31:d3:12:f4:92:1c:0b:93:5f:4b']
+-----------------+
| o.o |
| .= E.|
| .B.o|
| .= |
| S = .|
| . o . .= |
| . . . oo.|
| . o+|
| .o.|
+-----------------+
EOS
end
def test_case_4
assert_equal <<-EOS.chomp, DRUNKEN_BISHOP['05:1e:1e:c1:ac:b9:d1:1c:6a:60:ce:0f:77:6c:78:47']
+-----------------+
| o=. |
| o o++E |
| + . Ooo. |
| + O B.. |
| = *S. |
| o |
| |
| |
| |
+-----------------+
EOS
end
end
CkRSVU5LRU5fQklTSE9QPQotPmt7dz0xNwpyPVt6PT8rKz8tKncrPytdCigwLi4udyo5KS5lYWNoX3NsaWNlKHcpLm1hcHt8b3xyPDw/fCtvLm1hcHt8eHxjPTc2CnE9MAprLnNwbGl0KD86KS5mbGF0X21hcHt8YnwoMC4uNykubWFwe3xpfGIudG9faSgxNilbaV19fS5lYWNoX3NsaWNlKDIpe3xoLHZ8djwxPyhjPncmJmMtPXcpOmM8dyo4JiZjKz13CmMrPWg8MT9jJXc+MD8tMTowOmMldzwxNj8xOjAKYz09eCYmcSs9MX0KeD09NzY/P1M6Yz09eCA/P0U6JyAubys9KkJPWEAlJiMvXidbcV19LmpvaW4rP3x9CihyK1t6XSkuam9pbicKJ30KCgpyZXF1aXJlICdtaW5pdGVzdC9hdXRvcnVuJwoKZGVzY3JpYmUgRFJVTktFTl9CSVNIT1AgZG8KICBkZWYgdGVzdF9jYXNlXzEKICAgIGFzc2VydF9lcXVhbCA8PC1FT1MuY2hvbXAsIERSVU5LRU5fQklTSE9QWyczNzplNDo2YToyZDo0ODozODoxYTowYTpmMzo3Mjo2ZDpkOToxNzo2YjpiZDo1ZSddCistLS0tLS0tLS0tLS0tLS0tLSsKfCAgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICB8CnwgICAgICAgICAgLiAgICAgIHwKfCAgICAgLiAgIG8gICAgICAgfAp8byAuIG8gLiBTICsgICAgICB8CnwuKyArID0gLiBCIC4gICAgIHwKfG8gKyArIG8gQiBvIEUgICAgfAp8IG8gLiAgICsgLiBvICAgICB8CnwgICAgICAgICAubyAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tKwpFT1MKICBlbmQKCiAgZGVmIHRlc3RfY2FzZV8yCiAgICBhc3NlcnRfZXF1YWwgPDwtRU9TLmNob21wLCBEUlVOS0VOX0JJU0hPUFsnMTY6Mjc6YWM6YTU6NzY6Mjg6MmQ6MzY6NjM6MWI6NTY6NGQ6ZWI6ZGY6YTY6NDgnXQorLS0tLS0tLS0tLS0tLS0tLS0rCnwgICAgICAgIC4gICAgICAgIHwKfCAgICAgICArIC4gICAgICAgfAp8ICAgICAgLiBCIC4gICAgICB8CnwgICAgIG8gKiArICAgICAgIHwKfCAgICBYICogUyAgICAgICAgfAp8ICAgKyBPIG8gLiAuICAgICB8CnwgICAgLiAgIEUgLiBvICAgIHwKfCAgICAgICAuIC4gbyAgICAgfAp8ICAgICAgICAuIC4gICAgICB8CistLS0tLS0tLS0tLS0tLS0tLSsKRU9TCiAgZW5kCgogIGRlZiB0ZXN0X2Nhc2VfMwogICAgYXNzZXJ0X2VxdWFsIDw8LUVPUy5jaG9tcCwgRFJVTktFTl9CSVNIT1BbJ2I2OmRkOmI3OjFmOmJjOjI1OjMxOmQzOjEyOmY0OjkyOjFjOjBiOjkzOjVmOjRiJ10KKy0tLS0tLS0tLS0tLS0tLS0tKwp8ICAgICAgICAgICAgby5vICB8CnwgICAgICAgICAgICAuPSBFLnwKfCAgICAgICAgICAgICAuQi5vfAp8ICAgICAgICAgICAgICAuPSB8CnwgICAgICAgIFMgICAgID0gLnwKfCAgICAgICAuIG8gLiAgLj0gfAp8ICAgICAgICAuIC4gLiBvby58CnwgICAgICAgICAgICAgLiBvK3wKfCAgICAgICAgICAgICAgLm8ufAorLS0tLS0tLS0tLS0tLS0tLS0rCkVPUwogIGVuZAoKICBkZWYgdGVzdF9jYXNlXzQKICAgIGFzc2VydF9lcXVhbCA8PC1FT1MuY2hvbXAsIERSVU5LRU5fQklTSE9QWycwNToxZToxZTpjMTphYzpiOTpkMToxYzo2YTo2MDpjZTowZjo3Nzo2Yzo3ODo0NyddCistLS0tLS0tLS0tLS0tLS0tLSsKfCAgICAgICBvPS4gICAgICAgfAp8ICAgIG8gIG8rK0UgICAgICB8CnwgICArIC4gT29vLiAgICAgIHwKfCAgICArIE8gQi4uICAgICAgfAp8ICAgICA9ICpTLiAgICAgICB8CnwgICAgICBvICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICB8CnwgICAgICAgICAgICAgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tKwpFT1MKICBlbmQKZW5kCgoKCgo=