Sono curioso di sapere se sto giocando a Code Golf. Mi sono posto la sfida di trasformare un piccolo programma di hashing in un'unica istruzione in Python. Ho iniziato con:
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()
Ho quindi reso la funzione ricorsiva:
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))
Ho provato ad accorciarlo con un lambda per ripetere il codice (non ha funzionato):
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)
Alla fine ho finito con una 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))
Volevo che il programma fosse una dichiarazione, quindi per prima cosa ho escogitato:
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")
E infine ho finito con:
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")())
È così che vengono risolti i problemi di codegolf? Non ho mai fatto questo genere di cose, quindi in questo momento voglio solo sapere se lo sto facendo bene.
Emendamento: questo programma fa tutto il lavoro per te; quindi farò qui riferimento alla funzione: Come input, il programma accetta tutte le permutazioni di una determinata stringa; qui la stringa è composta da nove caratteri scelti casualmente ascii_lowercase
. L'output è una stringa leggibile dall'uomo che definisce se il risultato di ciascuna permutazione della stringa data è un duplicato di un altro risultato per una stringa diversa. Se non ci sono duplicati per tutte le permutazioni, il programma indica il successo. Nove personaggi sono stati scelti come la più grande lunghezza di personaggi facilmente calcolati ripetutamente sulla mia scatola.
Emendamento II Come sottolineato da un lettore studioso, lo scopo previsto descritto non è ottenuto attraverso il codice allegato. Il caso di prova è ovviamente inadeguato.
print"x"
invece diprint("x")
list()
?