解答
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()