LoginSignup
1
0

More than 3 years have passed since last update.

第15回オフラインリアルタイムどう書くの問題をpythonで解いてみた

Last updated at Posted at 2013-11-01

問題内容等についてはこちら。
http://qiita.com/Nabetani/items/cba03c96d1ea55f6e861

事前にいくつかの過去問題に挑戦していたおかげで、辞書を作るのがいいだろうとすぐに思いつき、電光文字のドットパターンの黒(点灯)を1、白(消灯)を0として上段と下段を並べたのをキーとし、文字を値として辞書を作りました。
入力された16進数文字列を32文字の2進数文字列に変換し、上段と下段の先頭から数文字ずつ取り出して辞書を引きます。
ただし、取り出す文字数に注意する必要がありました。上下3ドットずつの’U'のドットパターンがあったとき、上下2ドットずつを取り出して辞書を引いてしまうと'L'のドットパタンと一致してしまいます。ですので、最初に3ドットパターンか調べ、次に2ドットパターンか調べ、最後にどれにもヒットしない場合には区切りの1ドットパターン(00)かを調べるようにしました。

parts = {'1011':'L', '1110':'R', '0111':'J', '111010':'T', '101111':'U',
         '111101':'N', '011110':'S', '110011':'Z', '00':'' }

def solve(text):
    upper, lower = (format(int(t,16),'032b') for t in text.split('/'))
    answer = ''
    while len(upper) > 0:
        for n in xrange(3, 0, -1):
            part = upper[:n] + lower[:n]
            if part in parts:
                answer += parts[part]
                upper, lower = upper[n:], lower[n:]
                break
    return answer

def test(text, answer):
    result = solve(text)
    print '%s\t%s\t%s' % ('OK' if result == answer else 'NG', text, result)

if __name__ == '__main__':
    0, test( "2ed8aeed/34b0ea5b", "LTRSUNTSJ" );
    1, test( "00000200/00000300", "L" );
    2, test( "00018000/00010000", "R" );
    3, test( "00002000/00006000", "J" );
    4, test( "00000700/00000200", "T" );
    5, test( "01400000/01c00000", "U" );
    6, test( "00003800/00002800", "N" );
    7, test( "000c0000/00180000", "S" );
    8, test( "00003000/00001800", "Z" );
    9, test( "132eae6c/1a64eac6", "LRJTUNSZ" );
    10, test( "637572d0/36572698", "ZSNUTJRL" );
    11, test( "baddb607/d66b6c05", "LTJZTSSSN" );
    12, test( "db74cd75/6dac6b57", "ZZZTJZRJNU" );
    13, test( "3606c2e8/1b0d8358", "ZZSSLTJ" );
    14, test( "ad98c306/e6cc6183", "UZZZZZZ" );
    15, test( "4a4aaee3/db6eeaa6", "JJLLUUNNS" );
    16, test( "ecd9bbb6/598cd124", "TSSZZTTRR" );
    17, test( "e0000002/40000003", "TL" );
    18, test( "a0000007/e0000005", "UN" );
    19, test( "c0000003/80000006", "RS" );
    20, test( "40000006/c0000003", "JZ" );
    21, test( "01da94db/00b3b6b2", "TSUJLRSR" );
    22, test( "76eeaaea/24aaeeae", "TRNNUUNU" );
    23, test( "1dacaeee/1566e444", "NRJZUTTT" );
    24, test( "26c9ac60/6c6d66c0", "JSZLRJZS" );
    25, test( "6c977620/36da5360", "ZZLLTNZJ" );
    26, test( "069aeae6/0db34eac", "SJSLTUNS" );
    27, test( "06d53724/049da56c", "RRULRNJJ" );
    28, test( "069b58b0/04d66da0", "RLRSLZJR" );
    29, test( "1b6eced4/11b46a9c", "RZZTZNRU" );
    30, test( "522e8b80/db6ad900", "JLLJNLJT" );
    31, test( "6546cdd0/376c6898", "ZULSZRTL" );
    32, test( "4e6d5b70/6ad9d620", "LNSSURST" );
    33, test( "37367772/65635256", "SNSZNTNJ" );
    34, test( "25535d58/377669cc", "LUUSLTUZ" );
    35, test( "0ae6a55d/0eacedcb", "UNSUJUTJ" );
    36, test( "76762edc/23536a88", "TZNZJNRT" );
1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0