Tengo curiosidad si estoy Code Golfing correctamente. Me propuse el desafío de hacer un pequeño programa de hash en una sola declaración en Python. Primero comencé 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()
Luego hice la función recursiva:
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))
Intenté acortarlo con un lambda para repetir el código (no funcionó):
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)
Finalmente terminé 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))
Quería que el programa fuera una declaración, así que primero se me ocurrió:
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")
Y finalmente terminé 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")())
¿Es así como se resuelven los problemas de codegolf? Realmente nunca he hecho este tipo de cosas, así que ahora solo quiero saber si lo estoy haciendo bien.
Enmienda: este programa hace todo el trabajo por usted; así que aquí me referiré a la función: como entrada, el programa toma todas las permutaciones de una cadena dada; aquí la cadena tiene nueve caracteres elegidos al azar ascii_lowercase
. La salida es una cadena legible por humanos que define si el resultado de cada permutación de la cadena dada es un duplicado de otro resultado para una cadena diferente. Si no hay duplicados para todas las permutaciones, el programa indica éxito. Se seleccionaron nueve caracteres como la mayor longitud de caracteres que se calcularon fácilmente repetidamente en mi caja.
Enmienda II Como lo señaló un lector estudioso, el propósito previsto descrito no se obtiene a través del código adjunto. El caso de prueba es obviamente inadecuado.
print"x"
en lugar deprint("x")
list()
?