Let's take tea break | Code Puzzle解題

Let's take tea break | Code Puzzle
任天堂のクイズのやつ。

first_code.py

if pow(m, 17) % 3569 == 915: return str(m)

となる自然数 m を探す問題。range(10000)ぐらいまでとって総当たりすればよい。数学的に解けるかも?

second_code.py

あるルールに則って、与えられた文字列を変換するSimpleBarsというクラスを実装する。SimpleBarsはnext()というメソッドによって変換を行う。
この問題にはヒントが存在する。見ると実装のコツやテストコードをもらえる。下のコードはヒントを見ずに解いていたのでSimpleBarsにlistを継承することを思いつかなかった。

class SimpleBars:
    def __init__(self, bar):
        self.bar = bar

    def __setitem__(self, i, c):
        x = list(self.bar)
        x[i] = c
        self.bar = "".join(x)

    def __len__(self):
        return len(self.bar)

    def __str__(self):
        return self.bar

    def next(self):
        bar = list(self.bar)
        next_bar = [' ' for _ in list(self.bar)]

        for index, _ in enumerate(bar):
            # bar[index-1], bar[index], bar[index+1]の値により
            # bar_next[index]の値を決める分岐処理をちまちま書く
            # 例:
            # if bar[index-1] == "i" and bar[index-1] == "T" and bar[index-1] == "i":
            #     next_bar[index] = "i"

        self.bar = "".join(next_bar)
        return self.bar

この書き方だとbar[index+1]は index == len(bar)-1 のときList index out of rangeエラーになるので境界判定をつける(適宜indexも一時変数に置き換える)。
bar[index-1]のほうはindex==0のときbar[-1]であるが、Pythonにおいてこの記法は配列の末尾の要素を取ってくれるので問題ない。

third_code.py

まずsecond_code.pyにルールを加えて書き直す必要がある。
この問題もテストコードがもらえる。が、テストから推測して愚直に実装しようなんて考えちゃいけない。自分は数分手を動かしてやる気が失せた。
ちょっと休憩を入れてからおもむろにページのソースコードを読むと幸せになれた。
decode_morseはモールス符号 - Wikipediaを見ながら辞書を地道に打ち込んで用意した。

{"iI": "A", "Iiii": "B", "IiIi": "C", "i": "E", "iiIi": "F", "IIi": "G", "iiii": "H", "ii": "I", "iIII": "J", "IiI": "K", "iIii":"L", "II": "M", "Ii": "N", "III": "O", "iIIi": "P", "IIiI": "Q", "iIi": "R", "iii": "S", "I": "T", "iiI": "U", "iiiI": "V", "iII": "W", "IiiI": "X", "IiII": "Y", "IIii": "Z"}

fourth_code.py

与えられた文字列に対してnextを繰り返すとそのうち元に戻る。
だから元に戻るいっこ前のやつを記録しておけばよい。
以下パズルのネタバレ:

invrseという通り文字列反転が必要。
Pythonの文字列反転はinput_string = input_string[::-1]によって行う。
decode_morse(input_string[::-1])で答えが出る。

これが通るとCongratulations!!と出るんだけど罠です。まだあります。

Do you really "take tea break"?

全然分からない。ヒントもないしうぎゃー

感想

クイズ要素が大きくてプログラミングあんま関係ない気がする(裏問題解けてない口が何を言うか)。模様を描けた時が一番テンション上がった。お茶でも飲みながら気軽に楽しめということですね!

おまけ

        i               
       iTi              
      iTiTi             
     iTiTiTi            
    iTiTiTiTi           
   iTiTiTiTiTi          
  iTiTiTiTiTiTi         
 iTiTiTiTiTiTiTi        
iTiTiTiTiTiTiTiTi       
TiTiTiTiTiTiTiTiTi     i
iTiTiTiTiTiTiTiTiTi   iT
TiTiTiTiTiTiTiTiTiTi iTi
iTiTiTiTiTiTiTiTiTiT TiT
TiTiTiTiTiTiTiTiTiT   Ti
iTiTiTiTiTiTiTiTiT     T
TiTiTiTiTiTiTiTiT       
 TiTiTiTiTiTiTiT        
  TiTiTiTiTiTiT         
   TiTiTiTiTiT          
    TiTiTiTiT           
     TiTiTiT            
      TiTiT             
       TiT              
        T               
        i               
       iTi              
      iTiTi             
     iTiTiTi            
    iTiTiTiTi           
   iTiTiTiTiTi