acokikoy's notes

最近気になる=[NoCode, Shopify], I am..=[Python, ウクレレ, マニュアル車, CMS] LoveなWebディレクター

毎朝Codewars@2019.05.04(土): Coloured Triangles

毎朝ちびちび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'