最近 codefights というサイトで始めたショーコーディングで覚えたテクニックを随時まとめて更新していきます
ショートコーディング考察
- 基本の基本としてまずコーディングを始める前にアルゴリズムなどを調べて最適な解き方について把握しておくことが大事 (数字根をゴリ押しで解いた後公式を知ったとき特に痛感した)
- 答えの決め打ち勝負になるパターンもある.
- 例えば Input が 1 <= n <= 10 で計算量がどうしても膨大になる時は, ローカルで答えのリストを作ってからショートコーディングが始まる
- 1文字の省略に命をかける世界
- のめり込みすぎると頭おかしくなる
基本
< と <=
比較演算子の <= は基本的に省略が出来て1文字減らせる
# long
a <= 3
# short (aが整数の時)
a < 4
~- と -~
それぞれ - 1 と + 1 に相当します
ただし 乗算演算子 より優先順位が高いため括弧の省略で2文字減らせる
# long
b * (a - 1) * 5
# short
b * ~-a * 5
三項演算子
:(コロン)や代入の左辺を省略出来る
# long
if a < b:
c = 4
else:
c = 2
# short
c = 4 if a < b else 2
repr リテラル
(Python2 のみ)
string への変換は `` を使う
# long
str(1600)
# short
`1600`
True, False 定数
厳密に論理値を返したい場合は True, False を使わずに論理演算を使う
# long
b = False
# short
b = 0 > 1
# long
return True
# short
return 1 > 0
import as
import する module も短縮する
# long
import math
math.sqrt(10)
# short
import math as m
m.sqrt(10)
一括等価チェック
複数の文字列比較をつなげて一度に行う
# 最初の文字と最後の文字両方が一致する
# long
a[0] == b[0] and a[-1] == b[-1]
# short
a[0] + a[-1] == b[0] + b[-1]
# a と b, c と d の長さが同じ(または結合しても一意である)場合
# long
a == b and c == d
# short
a + c == b + d
関数など
codefights の Challenge だと関数の形式で解答したものをテストされる
lambda
出来れば関数からlambda式に治すと4文字減らせる
# long
def Hoge(n):
return n * 2
# short
Hoge = lambda n: n * 2
引数名
引数名は明示呼び出しされていないケースが多いので1文字に出来る
# long
def Hoge(arg):
return arg ** arg
# short
def Hoge(a):
return a ** a
再帰関数
再帰を使用している場合は1文字の変数に代入
# long
def LongLongHoge(a):
if a < 3:
return a
return LongLongHoge(a - 2) * LongLongHoge(a - 1)
# short
def LongLongHoge(a):
if a < 3:
return a
return t(a - 2) * t(a - 1)
t = LongLongHoge
lambda と同時代入を使うとさらに短くなる
# short
LongLongHoge = t = lambda a: a if a < 3 else t(a - 2) * t(a - 1)
応用
リストで条件分け
# long
t = a % 3
if t == 0:
a = a * 2
elif t == 1:
a = 0
elif t == 2:
a = t * 2
# short
a = [a * 2, 0, (a % 3) * 2][a % 3]
# short
t = a % 3
a = [a * 2, 0, t * 2][t]
条件式を上手に使う
(a < b) は True, False を返すが それぞれ 1, 0 として演算に使える
それを利用すると省略できるパターンが多い
# long
c = 4 if a < b else 2
# short
c = 2 + 2 * (a < b)
他のメソッドをそのまま入れた関数を作る
# long
myhex = lambda n: '%X' % n
# short
myhex = '{:X}'.format
myhex = '%X'.__mod__