毎朝ちびちびCodewars。
Coloured Triangles www.codewars.com
今日のお題:
"""RGBで三角形を書く 各行RGBで構成される文字列。次行の文字列は、すぐ上の行で隣り合う2文字が同じならその文字を、異なる場合はその2文字以外の第3の文字を置く。 例えば、 R R G B R G B B R B R G B R B G G B R G G G R G B G B B R R B G R R B G Args: row (str): 先頭行の文字列。RGBの組み合わせで構成される。 Returns: 最終行の1文字 (str) """
コード
me
import pysnooper @pysnooper.snoop() def triangle(row): colours = { 'RR': 'R', 'GG': 'G', 'BB': 'B', 'RG': 'B', 'GR': 'B', 'GB': 'R', 'BG': 'R', 'BR': 'G', 'RB': 'G' } while len(row) > 0: if len(row) == 1: return row next = '' for i in range(len(row)-1): next += colours[row[i:i+2]] row = next return None
- 隣り合う2文字をキー、そのバリューとして次行の文字をdictで持たせて表引きする方式。
- dictの表引きの代わりに、
set('RGB') - set(隣の2文字)
で算出してもいいかもしれない。
me2
import pysnooper # @pysnooper.snoop() def triangle(row): while len(row) > 0: if len(row) == 1: return row next = '' for s0,s1 in zip(row, row[1:]): if s0 == s1: next += s0 else: next += (set('RGB') - set(s0+s1)).pop() row = next return None
set('RGB') - set(隣の2文字)
で第3の文字を算出する方式
文法、関数・メソッドnote
PySnooper デバッグ用ライブラリ
- デバッグしたい関数に @pysnooper.snoop() デコレータをつけると、「新しい変数が宣言されたとき」「変数が書き換わったとき」「関数が呼び出されたとき」「値が関数から返されたとき」に値を出力してくれる。
- Sublime Text上でビルド機能で実行してもちゃんと動く。Sublime Textは、Python用の良いデバッガPlugInがないため開発環境をVS Codeに乗り換え検討しかけていた。コレを見つけて、ひとまず乗り換えを延期した。
- 参考にした記事:
blog.ikedaosushi.com
備忘≫ strオブジェクトでpop()は使えない
raw = 'RBRGBRBGGRRRBGBBBGG' raw.pop() # --------------------------------------------------------------------------- # AttributeError Traceback (most recent call last) # <ipython-input-26-ab07b2d41d11> in <module> # 1 raw = 'RBRGBRBGGRRRBGBBBGG' # ----> 2 raw.pop() # # AttributeError: 'str' object has no attribute 'pop'