今日の昼ごはん(括弧個数ゴルフ)

いつも昼ごはんを一緒に食べている二人がお休みだったので

[10/08/26 13:05:30]: カッコの話ってこれか
[10/08/26 13:05:31]: http://e-arrows.sakura.ne.jp/2010/08/is-lisp-really-has-too-many-parenthesis.html
[10/08/26 13:07:51]: factをlambdaにすれば仮引数の周りの括弧は取り除けるけど
[10/08/26 13:07:59]: 関数のコールの括弧は取り除けないなぁ
[10/08/26 13:08:28]: printの括弧は取り除けるってtwitterで既出だけど
[10/08/26 13:08:47]: タプルの括弧は"%d, %%d" % x % yにすれば取り除ける
[10/08/26 13:09:02]: あとrange使わないでwhileにすれば
[10/08/26 13:09:54]: intとfactの呼び出し2回で6つか
[10/08/26 13:10:36]: intのほうを取り除くのは難しいなぁ。factがなんとかならないかなぁ
[10/08/26 13:11:30]: 再帰呼び出しをやめるか。

[10/08/26 13:16:34]: 2個になった>括弧

ご飯を買いに行く。intの括弧を取り除くのは難しいなぁ。0+"10"とかできればいいけどできないし、正規表現も括弧がいるし…

[10/08/26 13:24:14]: あっ
[10/08/26 13:25:06]: evalするにも括弧がいるなぁとか思っていたがexecなら括弧いらないな

というわけで括弧は全部なくなった。

import sys

exec "N = " + sys.argv[1]
mem = [[1, 1]]
n = 1
while n < N:
    n += 1
    mem += [[n, mem[-1][1] * n]]

for i, f in mem:
    print "%s! = %%s" % i % f

一般に関数をカッコなしで呼び出す方法があれば「もう括弧ゴルフとか飽きたし」っていえるなーと思って少し考えてみたが、タプルがカッコなしで作成できることを利用すれば簡単だった。

>>> x = 1, 2
>>> x
(1, 2)
>>> `x`
'(1, 2)'
>>> exec "y = max" + `x`
>>> y
2

引数を取らない関数を呼ぶときはスライシングで空のタプルを作ればいい。

>>> x[:0]
()

もう括弧ゴルフ飽きたし。まだ昼休み20分くらい残ってるし。