DRUNKEN_BISHOP=
->key{
get_char_at_pos=->x{
middle = 4 * 17 + 8
return 'S' if x == middle
current_location = middle
step_count_at_location_x = 0
key.split(?:).flat_map{|b|(0..7).map{|i|b.to_i(16)[i]}}.each_slice(2) do |horz, vert|
if vert == 0 && current_location > 17
current_location -= 17
end
if vert == 1 && current_location < 17 * 9 - 17
current_location += 17
end
if horz == 0 && current_location % 17 > 0
current_location -= 1
end
if horz == 1 && current_location % 17 < 16
current_location += 1
end
step_count_at_location_x += 1 if current_location == x
end
if current_location == x
return 'E'
else
return ' .o+=*BOX@%&#/^'[step_count_at_location_x]
end
}
r=[z=?++?-*17+?+]
(0...17*9).each_slice(17).map do |row|
r << ?|+row.map(&get_char_at_pos).join+?|
end
(r+[z]).join ?\n
}
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
CkRSVU5LRU5fQklTSE9QPQotPmtleXsKICBnZXRfY2hhcl9hdF9wb3M9LT54ewogICAgbWlkZGxlID0gNCAqIDE3ICsgOAoKICAgIHJldHVybiAnUycgaWYgeCA9PSBtaWRkbGUKCiAgICBjdXJyZW50X2xvY2F0aW9uID0gbWlkZGxlCgogICAgc3RlcF9jb3VudF9hdF9sb2NhdGlvbl94ID0gMAoKICAgIGtleS5zcGxpdCg/OikuZmxhdF9tYXB7fGJ8KDAuLjcpLm1hcHt8aXxiLnRvX2koMTYpW2ldfX0uZWFjaF9zbGljZSgyKSBkbyB8aG9yeiwgdmVydHwKICAgICAgaWYgdmVydCA9PSAwICYmIGN1cnJlbnRfbG9jYXRpb24gPiAxNwogICAgICAgIGN1cnJlbnRfbG9jYXRpb24gLT0gMTcKICAgICAgZW5kCiAgICAgIGlmIHZlcnQgPT0gMSAmJiBjdXJyZW50X2xvY2F0aW9uIDwgMTcgKiA5IC0gMTcKICAgICAgICBjdXJyZW50X2xvY2F0aW9uICs9IDE3CiAgICAgIGVuZAoKICAgICAgaWYgaG9yeiA9PSAwICYmIGN1cnJlbnRfbG9jYXRpb24gJSAxNyA+IDAKICAgICAgICBjdXJyZW50X2xvY2F0aW9uIC09IDEKICAgICAgZW5kCiAgICAgIGlmIGhvcnogPT0gMSAmJiBjdXJyZW50X2xvY2F0aW9uICUgMTcgPCAxNgogICAgICAgIGN1cnJlbnRfbG9jYXRpb24gKz0gMQogICAgICBlbmQKICAgICAgCiAgICAgIHN0ZXBfY291bnRfYXRfbG9jYXRpb25feCArPSAxIGlmIGN1cnJlbnRfbG9jYXRpb24gPT0geAogICAgZW5kCgogICAgaWYgY3VycmVudF9sb2NhdGlvbiA9PSB4CiAgICAgIHJldHVybiAnRScKICAgIGVsc2UKICAgICAgcmV0dXJuICcgLm8rPSpCT1hAJSYjL14nW3N0ZXBfY291bnRfYXRfbG9jYXRpb25feF0KICAgIGVuZAogIH0KCiAgcj1bej0/Kys/LSoxNys/K10KCiAgKDAuLi4xNyo5KS5lYWNoX3NsaWNlKDE3KS5tYXAgZG8gfHJvd3wKICAgIHIgPDwgP3wrcm93Lm1hcCgmZ2V0X2NoYXJfYXRfcG9zKS5qb2luKz98CiAgZW5kCiAgKHIrW3pdKS5qb2luID9cbgp9CgoKcmVxdWlyZSAnbWluaXRlc3QvYXV0b3J1bicKCmRlc2NyaWJlIERSVU5LRU5fQklTSE9QIGRvCiAgZGVmIHRlc3RfY2FzZV8xCiAgICBhc3NlcnRfZXF1YWwgPDwtRU9TLmNob21wLCBEUlVOS0VOX0JJU0hPUFsnMzc6ZTQ6NmE6MmQ6NDg6Mzg6MWE6MGE6ZjM6NzI6NmQ6ZDk6MTc6NmI6YmQ6NWUnXQorLS0tLS0tLS0tLS0tLS0tLS0rCnwgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgIC4gICAgICB8CnwgICAgIC4gICBvICAgICAgIHwKfG8gLiBvIC4gUyArICAgICAgfAp8LisgKyA9IC4gQiAuICAgICB8CnxvICsgKyBvIEIgbyBFICAgIHwKfCBvIC4gICArIC4gbyAgICAgfAp8ICAgICAgICAgLm8gICAgICB8CistLS0tLS0tLS0tLS0tLS0tLSsKRU9TCiAgZW5kCgogIGRlZiB0ZXN0X2Nhc2VfMgogICAgYXNzZXJ0X2VxdWFsIDw8LUVPUy5jaG9tcCwgRFJVTktFTl9CSVNIT1BbJzE2OjI3OmFjOmE1Ojc2OjI4OjJkOjM2OjYzOjFiOjU2OjRkOmViOmRmOmE2OjQ4J10KKy0tLS0tLS0tLS0tLS0tLS0tKwp8ICAgICAgICAuICAgICAgICB8CnwgICAgICAgKyAuICAgICAgIHwKfCAgICAgIC4gQiAuICAgICAgfAp8ICAgICBvICogKyAgICAgICB8CnwgICAgWCAqIFMgICAgICAgIHwKfCAgICsgTyBvIC4gLiAgICAgfAp8ICAgIC4gICBFIC4gbyAgICB8CnwgICAgICAgLiAuIG8gICAgIHwKfCAgICAgICAgLiAuICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0rCkVPUwogIGVuZAoKICBkZWYgdGVzdF9jYXNlXzMKICAgIGFzc2VydF9lcXVhbCA8PC1FT1MuY2hvbXAsIERSVU5LRU5fQklTSE9QWydiNjpkZDpiNzoxZjpiYzoyNTozMTpkMzoxMjpmNDo5MjoxYzowYjo5Mzo1Zjo0YiddCistLS0tLS0tLS0tLS0tLS0tLSsKfCAgICAgICAgICAgIG8ubyAgfAp8ICAgICAgICAgICAgLj0gRS58CnwgICAgICAgICAgICAgLkIub3wKfCAgICAgICAgICAgICAgLj0gfAp8ICAgICAgICBTICAgICA9IC58CnwgICAgICAgLiBvIC4gIC49IHwKfCAgICAgICAgLiAuIC4gb28ufAp8ICAgICAgICAgICAgIC4gbyt8CnwgICAgICAgICAgICAgIC5vLnwKKy0tLS0tLS0tLS0tLS0tLS0tKwpFT1MKICBlbmQKCiAgZGVmIHRlc3RfY2FzZV80CiAgICBhc3NlcnRfZXF1YWwgPDwtRU9TLmNob21wLCBEUlVOS0VOX0JJU0hPUFsnMDU6MWU6MWU6YzE6YWM6Yjk6ZDE6MWM6NmE6NjA6Y2U6MGY6Nzc6NmM6Nzg6NDcnXQorLS0tLS0tLS0tLS0tLS0tLS0rCnwgICAgICAgbz0uICAgICAgIHwKfCAgICBvICBvKytFICAgICAgfAp8ICAgKyAuIE9vby4gICAgICB8CnwgICAgKyBPIEIuLiAgICAgIHwKfCAgICAgPSAqUy4gICAgICAgfAp8ICAgICAgbyAgICAgICAgICB8CnwgICAgICAgICAgICAgICAgIHwKfCAgICAgICAgICAgICAgICAgfAp8ICAgICAgICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLSsKRU9TCiAgZW5kCmVuZAoK