acokikoy's notes

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

毎朝Codewars@2019.06.10(月): Find the missing letter

毎朝ちびちびCodewars。

Find the missing letter [6級] www.codewars.com

引き続き、レベルを下げて脊髄反射を鍛える系チャレンジで数をこなす (`ω´)キリッ。

今日のお題:

"""
与文字列は連続したアルファベットからなるリストだが1文字抜けがある。その文字を探して返す。

Example:

['a','b','c','d','f'] -> 'e'
['O','Q','R','S'] -> 'P'

def square_sum(numbers):
Args:  
    chars (list):  連続したアルファベットからなるリスト(全部大文字、ないしは全部小文字)
Returns:  
    抜けてる文字 (str):  
"""

コード

me

def find_missing_letter(chars):
    first = ord(chars[0])
    for i,c in enumerate(chars):
        if chr(first+i) != c:
            return chr(first+i)
  • 先頭から一文字ずつとって正解と比較する。
  • 一続きのアルファベットという想定なので、正解はASCIIコード値ベースで考えれば簡単に得られる。つまり先頭文字のASCIIコード値にNを足したものが、N番目の正解(のASCIIコード値)。
  • 最初のうちは先頭文字を ord(min(chars)) で求めていたが、よくよく読んだら入力の時点で連続した文字列と書いてあり、わざわざmin( ) を使う必要なかった。問題はよく読みましょう ^^;;
  • 何通りかの書き方を試して処理時間を計ったが enumerate 使う方が効率が良かった。

文法、関数・メソッドnote

組み込み関数 ord(c) <-> chr(i)
>>> hex(ord('A'))
'0x41'
>>> chr(0x41)
'A'