Tôi tò mò nếu tôi chơi Golf đúng cách. Tôi tự đặt ra thử thách để biến một chương trình băm nhỏ thành một câu lệnh duy nhất trong Python. Lần đầu tiên tôi bắt đầu với:
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()
Sau đó tôi đã thực hiện chức năng đệ quy:
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))
Tôi đã thử rút ngắn nó bằng lambda để lặp lại mã (nó không hoạt động):
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)
Cuối cùng tôi đã kết thúc với một lambda:
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))
Tôi muốn chương trình là một tuyên bố, vì vậy trước tiên tôi đã nghĩ ra:
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")
Và cuối cùng tôi đã kết thúc với:
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")())
Đây có phải là cách các vấn đề codegolf được giải quyết? Tôi chưa bao giờ thực sự làm điều này, vì vậy ngay bây giờ tôi chỉ muốn biết liệu tôi có làm đúng hay không.
Sửa đổi: Chương trình này thực hiện tất cả các công việc cho bạn; Vì vậy, ở đây tôi sẽ đề cập đến chức năng: Là đầu vào, chương trình có tất cả các hoán vị của một chuỗi nhất định; ở đây chuỗi có chín ký tự được chọn ngẫu nhiên ascii_lowercase
. Đầu ra là một chuỗi có thể đọc được bằng con người xác định xem kết quả của mỗi lần hoán vị của chuỗi đã cho có trùng lặp với kết quả khác cho một chuỗi khác không. Nếu không có sự trùng lặp cho tất cả các hoán vị, chương trình chỉ ra thành công. Chín ký tự được chọn là độ dài lớn nhất của các ký tự dễ dàng được tính toán lặp lại trên hộp của tôi.
Sửa đổi II Như được chỉ ra bởi một người đọc hiếu học, mục đích dự định được mô tả không có được thông qua mã đi kèm. Các trường hợp thử nghiệm rõ ràng là không đầy đủ.
print"x"
thay vìprint("x")
list()
?