テトリスの揃った列を消す - Bit Tetris

問題

Bit Tetris 〜 横へな 2012.7.25

16進数文字列で表現されたテトリスのフィールドを受け取って揃っている列を消す問題。

解答

zip(*list)が便利すぎる。

def bit_tetris(notation):
    xbits = notation.split("-")
    bbits = map(lambda x: bin(int(x, 16))[2:].zfill(8), xbits)
    lanes = map(lambda x: "".join(x), zip(*bbits))
    newl = filter(lambda a: any(map(lambda b: int(b)!=1, a)), lanes)
    for i in range(len(lanes) - len(newl)):
        newl.insert(0, "0"*len(newl[0]))
    return "-".join(map(lambda x: hex(int("".join(x), 2))[2:].rjust(2, "0"), zip(*newl)))

テスト

import nose
from nose.tools import eq_

def test_bit_tetris():
    eq_(bit_tetris('ff-2f-23-f3-77-7f-3b'), '1f-03-00-1c-0d-0f-06')
    eq_(bit_tetris('01'), '00')
    eq_(bit_tetris('00'), '00')
    eq_(bit_tetris('7a-4e'), '0c-02')
    eq_(bit_tetris('56-b6'), '08-14')
    eq_(bit_tetris('12-12-12'), '00-00-00')
    eq_(bit_tetris('de-ff-7b'), '0a-0f-05')
    eq_(bit_tetris('95-be-d0'), '05-1e-20')
    eq_(bit_tetris('7c-b0-bb'), '1c-20-2b')
    eq_(bit_tetris('7a-b6-31-6a'), '3a-56-11-2a')
    eq_(bit_tetris('32-0e-23-82'), '18-06-11-40')
    eq_(bit_tetris('ff-7f-bf-df-ef'), '0f-07-0b-0d-0e')
    eq_(bit_tetris('75-df-dc-6e-42'), '35-5f-5c-2e-02')
    eq_(bit_tetris('62-51-ef-c7-f8'), '22-11-6f-47-78')
    eq_(bit_tetris('0c-47-8e-dd-5d-17'), '04-23-46-6d-2d-0b')
    eq_(bit_tetris('aa-58-5b-6d-9f-1f'), '52-28-2b-35-4f-0f')
    eq_(bit_tetris('ff-55-d5-75-5d-57'), '0f-00-08-04-02-01')
    eq_(bit_tetris('fe-fd-fb-f7-ef-df-bf'), '7e-7d-7b-77-6f-5f-3f')
    eq_(bit_tetris('fd-fb-f7-ef-df-bf-7f'), '7e-7d-7b-77-6f-5f-3f')
    eq_(bit_tetris('d9-15-b5-d7-1b-9f-de'), '69-05-55-67-0b-4f-6e')
    eq_(bit_tetris('38-15-fd-50-10-96-ba'), '18-05-7d-20-00-46-5a')
    eq_(bit_tetris('fe-fd-fb-f7-ef-df-bf-7f'), 'fe-fd-fb-f7-ef-df-bf-7f')

if __name__ == "__main__":
    nose.main()