Python
コードゴルフ
ショートコーディング
codefights

python ショートコーディングでよく使うテクニック(メモ帳)

More than 1 year has passed since last update.

最近 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__