Top
横へな E27 参考問題「灯りと鏡」


#!/usr/bin/python3
# -*- coding: utf-8 -*-
# †
from string import ascii_lowercase as lower

     # N  E  S   W
dr = [-1, 0, 1,  0]
dc = [ 0, 1, 0, -1]

def f(s):
    G = [list(row) for row in s.split('/')]
    n = len(G)
    for r in range(n):
        for c in range(n):
            if G[r][c] == 'Y':
                sr, sc = r, c

    seen = [[[False] * len(dr) for _ in range(n)] for _ in range(n)]

    def rec(r, c, d):
        if seen[r][c][d]:
            return
        seen[r][c][d] = True
        nd = d
        if G[r][c] == '0':
            nd = [3, 2, 1, 0][d]
        elif G[r][c] == '1':
            nd = [1, 0, 3, 2][d]
        elif G[r][c] == 'x':
            seen[r][c][d] = False
            return
        nr = r + dr[nd]
        nc = c + dc[nd]
        if 0 <= nr < n and 0 <= nc < n:
            rec(nr, nc, nd)

    rec(sr, sc, 0)
    res = ''
    for r in range(n):
        for c in range(n):
            if any(seen[r][c]):
                res += lower[r * n + c]
    return res

###
from collections import namedtuple
import unittest

T = namedtuple('T', 'func, iD, inntak, expected')

test_cases = [
    T(f, 0, "x...x/.1.0./..0../.Y.../0..x.", "ghilnqs" ),
    T(f, 1, "..Y../...../...../...../.....", "c" ),
    T(f, 2, "..x../..Y../...../...../.....", "h" ),
    T(f, 3, "..Y.x/..1x0/11.../....0/1..1.", "c" ),
    T(f, 4, "....1/....Y/...../...../.....", "ej" ),
    T(f, 5, ".10../x.1../x.1x./.Y.1./...0.", "bcghlq" ),
    T(f, 6, "0.x10/00..x/x0x.0/....0/...Y1", "deinsx" ),
    T(f, 7, "1.01./01Y.1/..1.1/..10./0.0..", "abcfgh" ),
    T(f, 8, "x..../x1x../0...0/....Y/.1..0", "klmnot" ),
    T(f, 9, "...../..10./.1Y1./.01../.....", "hilmnqr" ),
    T(f, 10, "...../..10./x.11./...../..Y..", "hilmnrw" ),
    T(f, 11, "...../x.10x/...../x.Y1x/.....", "himnqrs" ),
    T(f, 12, "..010/...Y1/..0../0.x../.....", "defghij" ),
    T(f, 13, "1.0../...../.0x../Y.1x./..1..", "abcfhkp" ),
    T(f, 14, "...../101../0.0../..Y../.....", "fgklmqrv" ),
    T(f, 15, "1.0../00.../.x..0/0.Y1./...10", "abcfghmr" ),
    T(f, 16, "x101./1..../.Y.x./..01./.00.1", "bcghlmrs" ),
    T(f, 17, "x11../x.x../.0.01/..x../...Y.", "bcglmnsx" ),
    T(f, 18, "..1.0/x0.x./0.0../x...Y/.10.1", "cdehjmnot" ),
    T(f, 19, "..x.0/.0.../1..0x/1..1./Y.00.", "klmnpqrsu" ),
    T(f, 20, "0.1.0/.0.xY/0...0/01..1/x00.x", "cdehjmrwx" ),
    T(f, 21, "...0./.0.0./..101/...10/..01Y", "mnpqrstwxy" ),
    T(f, 22, "10..0/.Y.0./0..1./....x/000..", "abfghiklmn" ),
    T(f, 23, "10..1/...../.1010/110.1/x..Yx", "lmnopqrstx" ),
    T(f, 24, "110../....1/x1..x/0.0.0/....Y", "bcghlmrsty" ),
    T(f, 25, "x.101/1..../..001/010Yx/..1.1", "cdehijmnos" ),
    T(f, 26, "x.111/x10../...0./00.1x/x.Y.1", "ghklmnqrsw" ),
    T(f, 27, "11.../....0/11..1/1.1../.Y..1", "fghijlmnoqv" ),
    T(f, 28, "...x1/.1.0./11.1./.01../Y..x.", "cghiklmnpqru" ),
    T(f, 29, ".0.../110x./11..0/01.x./..Y.x", "ghklmnopqrtw" ),
    T(f, 30, ".01.0/.110x/0...0/.01Y./x.1x.", "cdeghilmnqrs" ),
    T(f, 31, ".1100/..1.0/1.11Y/0..1./.0..0", "hijklmnopqrs" ),
    T(f, 32, "1..00/..11./.100./1..Y1/.....", "abcdfhikmnps" ),
    T(f, 33, "1.0../.11x0/.00.x/Y.10./.10x0", "abcfghklmpqr" ),
    T(f, 34, "11110/11.../.x.../.0111/0.Y0.", "deijnorstwxy" ),
    T(f, 35, "...1./.1.0x/10..0/0Y.11/.0.x0", "ghiklmnopqrst" ),
    T(f, 36, "...10/x111./0x.11/.0.../0.0Y.", "dehijmnorswxy" ),
    T(f, 37, ".1x../.x1.0/0x.x./x11.1/x0Y.1", "hijmoqrstvwxy" ),
    T(f, 38, "x.x../x110./1.1.0/0.Y.1/0.00x", "hiklmnopqrstx" ),
    T(f, 39, "...0./11.00/10..x/..0.1/Y0.10", "ghiklmnpqsuvwx" ),
    T(f, 40, ".110./....0/x..../.0001/11.Y.", "cdfghijmnorstx" ),
    T(f, 41, "1.00./....1/.1.../0...0/0..1Y", "abcfhkmpqrstwy" ),
    T(f, 42, ".1.01/..x../..100/..Y../...01", "bcdgilmnoqrstvxy" ),
    T(f, 43, "1...0/Y..../...../...../0...1", "abcdefjkoptuvwxy" ),
    T(f, 44, "x1..0/1..0./.Yx../0...1/.0.1.", "bcdefghijklnopqrstvwx" ),
    T(f, 45, "1...0/.1.0./..1../..01./Y0..1", "abcdefghijklmnopqrstuvwxy" ),
]

class TestSequence(unittest.TestCase):
    pass

def test_generator(func, _, inntak, expected):
    def _test(self):
        self.assertEqual(func(inntak), expected)
    return _test

for case in test_cases:
    name = 'test-{}-{}-{}'.format(case.func.__name__, case.iD, case.inntak)
    test = test_generator(*case)
    setattr(TestSequence, name, test)
suite = unittest.TestLoader().loadTestsFromTestCase(TestSequence)
testresult = unittest.TextTestRunner().run(suite)
assert testresult.wasSuccessful()
    

(ΦωΦ)<おしまい