ฉันอยากรู้อยากเห็นถ้าฉันเป็นรหัสกอล์ฟอย่างถูกต้อง ฉันตั้งความท้าทายสำหรับตัวเองในการสร้างโปรแกรมแฮชขนาดเล็กเป็นคำสั่งเดียวใน 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))
ฉันต้องการให้โปรแกรมเป็นประโยคเดียวดังนั้นก่อนอื่นเลยฉันมาด้วย:
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 หรือไม่? ฉันไม่เคยทำสิ่งนี้มาก่อนเลยตอนนี้ฉันแค่อยากรู้ว่าฉันทำถูกไหม
การแก้ไข:โปรแกรมนี้ทำงานให้คุณทั้งหมด; ดังนั้นฉันจะอ้างถึงฟังก์ชั่นที่นี่: เป็นอินพุตโปรแกรมใช้ในการเรียงสับเปลี่ยนทั้งหมดของสตริงที่กำหนด; ascii_lowercase
นี่สตริงเก้าตัวอักษรสุ่มเลือกจาก เอาต์พุตเป็นสตริงที่มนุษย์สามารถอ่านได้ซึ่งกำหนดว่าผลลัพธ์ของการเปลี่ยนลำดับของสตริงที่กำหนดแต่ละรายการจะซ้ำกันกับผลลัพธ์อื่นสำหรับสตริงอื่น หากไม่มีการซ้ำซ้อนสำหรับการเรียงสับเปลี่ยนทั้งหมดโปรแกรมจะระบุว่าสำเร็จ ตัวละครเก้าตัวถูกเลือกว่าเป็นความยาวของตัวละครที่ใหญ่ที่สุดที่คำนวณได้ง่าย ๆ บนกล่องของฉัน
การแก้ไข IIตามที่ผู้ชี้แนะผู้ชี้แนะวัตถุประสงค์ที่อธิบายไว้ไม่ได้รับผ่านรหัสที่มาพร้อมกัน กรณีทดสอบไม่เพียงพออย่างเห็นได้ชัด
print"x"
แทนprint("x")
list()
?