毎朝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)
- ord(c) は文字cのUnicodeコードポイントを返し、chr(i)は コードポイントが i である文字を返す。i は 0 から 0x10FFFF の整数値で、範囲外だと ValueError になる。
- 前段で、ASCIIコード値と書いたが、実際には Unicodeコードポイント と呼ぶらしい。
>>> hex(ord('A')) '0x41' >>> chr(0x41) 'A'
ところで、ord とは何の略なんだろう?
ordinary(序数) だという説もあれば、 order(順序)だろうという人もいる。いずれにしてもpythonのみならず様々なプログラム言語に登場する昔から使われてきた関数名のようだ。UnicodeとASCIIコードと、UTF-8などのエンコーディングと。。。ざっと目を通したぐらいではそれぞれの関係が理解できずorz...(後日の宿題) docs.python.org