ABC039 C - ピアニスト高橋君

備忘録

問題

atcoder.jp

回答

import sys
import os

ii = lambda: int(sys.stdin.buffer.readline().rstrip())
il = lambda: list(map(int, sys.stdin.buffer.readline().split()))
fl = lambda: list(map(float, sys.stdin.buffer.readline().split()))
iln = lambda n: [int(sys.stdin.buffer.readline().rstrip()) for _ in range(n)]

iss = lambda: sys.stdin.buffer.readline().decode().rstrip()
sl = lambda: list(map(str, sys.stdin.buffer.readline().decode().split()))
isn = lambda n: [sys.stdin.buffer.readline().decode().rstrip() for _ in range(n)]

MOD = 10 ** 9 + 7


def main():
    if os.getenv("LOCAL"):
        sys.stdin = open("input.txt", "r")

    S = iss()[0:12]
    p = "白黒白黒白白黒白黒白黒白".replace("白", 'W').replace("黒", "B") * 2
    ret = "ド ド# レ レ# ミ ファ ファ# ソ ソ# ラ ラ# シ"\
        .replace("#", "")\
        .replace("ド", "Do")\
        .replace("レ", "Re")\
        .replace("ミ", "Mi")\
        .replace("ファ", "Fa")\
        .replace("ソ", "So")\
        .replace("ラ", "La")\
        .replace("シ", "Si")\
        .split(" ")
    print(ret[p.find(S)])


if __name__ == '__main__':
    main()

考え方

文字列Sはスタート地点から右20個の鍵盤の色が書かれている。
しかし、鍵盤は「白黒白黒白白黒白黒白黒白」の12個の並びを繰り返している。
そのため、鍵盤の並びを十分に(20文字以上)用意し、
文字列Sの12文字と一致する箇所の始点を探索することで、
音階(ド ド# レ レ# ミ ファ ファ# ソ ソ# ラ ラ# シ)の開始地点がわかる。