-   
- 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