Code Golfing이 제대로되어 있는지 궁금합니다. 나는 작은 해싱 프로그램을 파이썬에서 하나의 문장으로 만들기 위해 도전했다. 나는 처음부터 시작했다.
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))
나는 프로그램이 하나의 진술이되기를 원했기 때문에 먼저 다음을 생각해 냈습니다.
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 Studious 독자가 지적한 바와 같이, 기술 된 의도 된 목적은 첨부 된 코드를 통해 얻을 수 없다. 테스트 사례가 분명히 부적절합니다.
print"x"
대신print("x")
list()
합니까?