Reto
Dado un número entero positivo N
que es 28 o por encima de, la salida de una lista de números de suma a N
que los usos cada dígito 1
a través de 7
exactamente una vez. Puedes dar como un programa o función.
Los dígitos pueden aparecer solos o concatenados, siempre que los use una vez sin repeticiones. Por ejemplo, [12, 34, 56, 7]
es válido, como es [1, 27, 6, 4, 35]
y [1234, 567]
, pero no [123, 34567]
o [3, 2, 1476]
. El orden en que se enumeran los números no importa.
Si N
no se puede hacer con 1-7, no devuelve ni genera nada.
Otra información
Este es el código de golf, por lo que gana el código más corto en bytes para el jueves 15 de octubre.
Haga cualquier pregunta en los comentarios.
Cualquier cosa que no especifique en el desafío depende de usted.
Las lagunas estándar no están permitidas.
Ejemplos
Estos pueden aclarar cualquier confusión:
Entrada
28
Salida
[1, 2, 3, 4, 5, 6, 7]
Entrada
100
Salida
[56, 7, 4, 31, 2]
Entrada
1234567
Salida
[1234567]
Entrada
29
Salida
Nada, 29 no es válido.
Entrada
1891
Salida
[1234, 657]
Entrada
370
Salida
[15, 342, 7, 6]
Haré más si es necesario.
Aquí hay una lista de todos los números posibles creados con estos siete números, cortesía de FryAmTheEggman.
29
?(N/A)
como salida.[1234566, 1]
no es una salida válida, porque 6 se repite. No puede repetir números en la salida.1, ..,, 7
modo que haya al menos tantos1
's como10
' s, al menos tantos10
's como100
' s, y así sucesivamente.Respuestas:
Pyth,
1814 bytesGracias a @isaacg por jugar 2 bytes y allanar el camino para 2 más.
El código se bloqueará si no produce salida, lo que hace que no se produzca ninguna salida.
Esto funcionará para entradas pequeñas si es lo suficientemente paciente, y para las más grandes si se le da suficiente tiempo y memoria.
Para verificar que el código funciona como está previsto, que puede sustituir a la
7
de una3
de las sumas de los dígitos 1 a 3 . Haga clic aquí para obtener un conjunto de pruebas.Ejecuciones de ejemplo
Cómo funciona
fuente
r\1\8
. También@ .. 0
es lo mismo queh
.h
, pero no tenía idea de que podría usarlo deS
esa manera. (La referencia de char en el intérprete en línea no lo menciona)jkS7
parece ser aún más corto, ya que no necesitos
más.Pitón 3, 109
Una función que toma un número y genera una tupla similar
123,4567,
. Sí, esta es una tupla válida.La idea es generar todas las secuencias posibles como la
43,126,7,5,
que tienen los dígitos1
a través7
separados por comas, sin comas dos consecutivos. Evalúe esta expresión como una tupla, y su suma es igualn
, imprímala y termine con error.Para construir todas esas cadenas,
s
rastreamos el conjunto de caracteres a usar e intentamos agregar cada uno con una coma, lo que hace que el dígito finalice la entrada, o sin él, en cuyo caso los dígitos futuros se concatenarán en él.El cortocircuito se usa para verificar que
s
está vacío porque la lista de compilación está vacía, y quen==sum(eval(l))
, en cuyo caso imprimimosl
y terminamos con un error al tomar~
elNone
devuelto imprimiendo (gracias a Sp3000 por esto).Creo que en Python 3.5, se pueden guardar dos caracteres escribiendo
s={*'1234567'}
(gracias Sp3000).Hay algunas pequeñas molestias que se comen los caracteres. Una es que, en el caso de que
l
parezca1234567
sin comas, se analiza como un número único y las llamadassum
dan un error. Esto se maneja con el truco de comenzarl
con el elemento0
y quitarlo al imprimir. Esto cuesta 6 caracteres.Iterar
c
sobre la coma y la cadena vacía es molestamente prolijofor c in(',','')
, ya que Python 3 no permite que esta tupla esté desnuda. Me gustaría que haya algunos caracteres?
que se ignoren en los números para hacer',?'
4 caracteres menos, pero no parece haber tal carácter.Antiguo método:
Pitón 2, 117
Define una función que toma un número e imprime una lista.
La idea es utilizar la recursividad para probar cada rama. Las variables de seguimiento son
n
necesarias
restantes para usarl
de números hecha hasta ahorap
Cuando
n==0
ys
está vacío, imprimal
y finalice por error.Si el número actual parcialmente formado
p
no es cero, intente agregarlo a la lista y eliminarlo de la suma restante.Para cada dígito
x
que podamos usars
, intente agregarlop
y eliminarlos
.fuente
Pyth, 23
La fuerza bruta ingenua, demasiado lenta en línea, tarda aproximadamente un minuto en mi computadora. Utiliza el patrón común de "bucle para siempre hasta excepción" de pyth golfs donde el acceso a la lista de combinaciones filtradas resultante causa un error para números imposibles, como
29
.Salidas como una lista pitónica, p. Ej.
Aquí hay una pasta de todos los números 10136 que se pueden hacer de esta manera.
fuente
Python 2.7,
178172169 bytesTenga en cuenta que se supone que las últimas tres líneas están sangradas con pestañas, pero no puedo entender cómo hacerlo en este editor.
Editar: aplanó una capa de anidamiento con la ayuda de Sp3000
fuente
JavaScript (ES6),
165196Editar acortado un poco. Podría ser más corto usando
eval
, pero me gusta que sea rápidoFuerza bruta, vergonzosamente más larga que la versión Pith, pero más rápida. Pruebe a ejecutar el fragmento a continuación en un navegador compatible con EcmaScript 6.
fuente
Python 2,
270268 bytesTodavía trabajando en golf.
Esto se repite hasta que se encuentra una coincidencia.
fuente
import as
rara vez es necesario - puedes hacerlofrom itertools import*;P=permutations
map(str,i)
que la comprensión de la lista, y puede construir la lista r directamente en lugar de aplanar una lista anidadar=[int(''.join(map(str,i)))for j in x for i in P(x,j)]
, y algo similar para t.`n`
lugar destr(n)
, yan
que nunca estará por encima del número entero máximo.Haskell (145 bytes)
Utiliza la recursividad.
Sin golf (337 bytes):
fuente
Scala, 195 bytes
Este no es el más eficiente y tardó más de 15 minutos en obtener la salida para 29, pero funciona
Aquí hay algo de salida
fuente
Ruby, 105 bytes
¡Fuerza bruta! Comprueba cada subconjunto de longitudes entre 0 y 7 de los enteros entre 1 y 7654321 y ve si alguno de ellos coincide con nuestros criterios. Probablemente no quieras esperar a que esto termine.
Para ejecutar y verificar el algoritmo, puede reducir el espacio de búsqueda reemplazando
7654321
con el número más grande que sabe que estará en la respuesta. Por ejemplo, 56 para n = 100, o 1234 para n = 1891. Aquí hay una prueba de este último:fuente