私はコードゴルフをきちんとやっているのか興味があります。Pythonで小さなハッシュプログラムを単一のステートメントにするという課題を自分自身に設定しました。私は最初に始めました:
from itertools import permutations
from string import ascii_lowercase
from random import sample
def test():
chars = sample(ascii_lowercase, 9)
sums = list(map(h, permutations(chars)))
if len(set(sums)) == len(sums):
print("unique results for permutations of given string")
else:
print("duplicate entries present in test results")
def h(s):
r = 0
for i in range(len(s)):
r += ord(s[i]) << (i * len(s))
return r
test()
次に、関数を再帰的にしました。
def h(s, i=0):
if i < len(s) - 1: return h(s, i+1) + ord(s[i]) << (i * len(s))
else: return ord(s[i]) << (i * len(s))
コードを繰り返すためにラムダで短縮しようとしました(動作しませんでした):
def h(s, i=0, f=lambda s,i: ord(s[i]) << (i * len(s))):
if i < len(s) - 1: return h(s, i+1) + f(s,i)
else: return f(s,i)
最後に、ラムダになりました:
h=lambda s,i=0:h(s,i+1)+ord(s[i])<<(i*len(s))if i<len(s)-1 else ord(s[i])<<(i*len(s))
プログラムを1つのステートメントにしたかったので、最初に思いつきました。
def test():
chars = sample(ascii_lowercase, 9)
sums = list(map((lambda s,i=0,f=lambda s,i,f:f(s,i+1,f)+ord(s[i])<<(i*len(s))if i<len(s)-1 else ord(s[i])<<(i*len(s)):f(s,i,f)), permutations(chars)))
if len(set(sums)) == len(sums):
print("unique results for permutations of given string")
else:
print("duplicate entries present in test results")
そして最後に:
print((lambda x=list(map((lambda s,i=0,f=lambda s,i,f:f(s,i+1,f)+ord(s[i])<<(i*len(s))if i<len(s)-1 else ord(s[i])<<(i*len(s)):f(s,i,f)), permutations(sample(ascii_lowercase, 9)))): "unique results for permutations of given string" if len(set(x)) == len(x) else "duplicate entries present in test results")())
これはcodegolfの問題の解決方法ですか?私はこのようなことを実際にやったことがないので、今私はちょうどそれをやっているかどうかを知りたいだけです。
修正:このプログラムはすべての作業を行います。したがって、ここでは関数を参照します。入力として、プログラムは指定された文字列のすべての順列を取り込みます。ここでは、文字列はからランダムに選択された9文字ascii_lowercase
です。出力は、特定の文字列の各順列の結果が異なる文字列の別の結果の複製であるかどうかを定義する人間が読み取れる文字列です。すべての順列に重複がない場合、プログラムは成功を示します。9個の文字が、ボックスで繰り返し計算されやすい最大文字数として選択されました。
修正II専門家の読者が指摘したように、記載されている意図された目的は、付随するコードからは得られません。テストケースは明らかに不十分です。
print"x"
代わりにprint("x")
list()
ますか?