d=lambda y:sum(i+1for i in range(y)if y%-~i<1)
f=lambda x:min((j,d(j))for j in range(x+1)if x<=d(j))
Pruébalo en línea!
Gracias a Jonathan Frech comentario de sobre el intento anterior de python 3, acabo de ampliar mi conocimiento de la sintaxis de python. Nunca hubiera pensado en el truco - ~ i para i + 1, que ahorra dos personajes.
Sin embargo, esa respuesta es 1) no mínima y 2) no funciona para x = 1 (debido a un error off-by-one que es fácil de hacer mientras se trata de brevedad; sugiero que todos los demás verifiquen sus respuestas para esta ventaja ¡caso!).
Explicación rápida:
sum(i+1for i in range(y)if y%-~i<1)
es equivalente sum(i for i in range(1,y+1)if y%i<1)
pero guarda dos caracteres. Gracias de nuevo al Sr. Frech.
d=lambda y:sum(i+1for i in range(y)if y%-~i<1)
por lo tanto, devuelve los divisores de y.
f=lambda x:min((j,d(j))for j in range(x+1)if x<=d(j))
es donde realmente trabajé. Como comparar una tupla funciona en el orden del diccionario, podemos comparar j, d (j) tan fácilmente como podemos comparar j, y esto no nos permite encontrar el mínimo j, almacenarlo en una variable y / luego / calcular el tupla en una operación separada. Además, tenemos que tener <=, no <, in x<=d(j)
, porque d (1) es 1, por lo que si x es 1 no se obtiene nada. Por eso también necesitamos range(x+1)
y no range(x)
.
Anteriormente había devuelto la tupla, pero luego tengo que subíndicela en f, por lo que se necesitan tres caracteres más.
n
s divisores? Probablemente querrá declarar eso explícitamente.n
yf(n)
, pero no lo dice en ninguna parte de la especificación.f(1000) = 48
? La suma del divisor48
es124