Escribir un programa, dada una entrada n , generará todas las n-tuplas posibles usando números naturales.
n=1
(1),(2),(3),(4),(5),(6)...
n=2
(1,1),(1,2),(2,1),(2,2),(1,3),(3,1),(2,3),(3,2),(3,3)...
n=6
(1,1,1,1,1,1) (1,1,1,1,2,1) (1,1,1,2,1,1)...
- La salida puede estar en cualquier orden que no rompa ninguna otra regla.
- El programa debe escribirse para ejecutarse para siempre y enumerar todas las tuplas aplicables exactamente una vez, en teoría.
- En realidad, su programa alcanzará el límite y el bloqueo de su tipo entero. Esto es aceptable siempre y cuando el programa se ejecute infinitamente si su tipo entero fuera ilimitado.
- Cada tupla válida se debe enumerar dentro de un tiempo finito, si solo se permitiera que el programa se ejecutara tanto tiempo.
- La salida puede, a su elección, incluir ceros además de los números naturales.
- Puede elegir el formato de salida de su programa para su conveniencia, siempre que la separación entre tuplas y números dentro de cada tupla sea clara y consistente. (Por ejemplo, una tupla por línea).
- La entrada (n) es un número entero de uno a seis. El comportamiento requerido no está definido para entradas fuera de este rango.
- Se aplican las reglas del código de golf, gana el programa más corto.
Gracias a "Artemis Fowl" por sus comentarios durante la fase de sandbox.
Respuestas:
Casco , 2 bytes
Pruébalo en línea!
Explicación
N
es la lista infinita de números naturales[1,2,3,4,..
.π
Es el poder cartesiano. El resultado es una lista infinita de listas. Cada lista de la longitud deseada ocurre exactamente una vez porqueπ
es genial así. La entrada y la salida son implícitas.fuente
n
- las tuplas se obtienen tomando el producto cartesiano de la lista original y la lista den-1
-tuplas, en orden ascendente de suma de índices.2,2,2
viene después4,1,2
y5,1,1
.N
. Para 2-tuplas, toma un producto cartesianoN
ordenado por suma de índices. En ambas listas, cada númeron
está en el índice,n
por lo que para la longitud 2 el resultado se ordena por suma. Para obtener 3 tuplas, tome el producto cartesianoN
y la lista de 2 tuplas, ordenadas por la suma de los índices de los elementos en estas listas. No mira la suma de las tuplas, mira su posición en la lista de tuplas.Haskell , 62 bytes
Pruébalo en línea!
n!s
genera todas lasn
tuplas que sumans
.Entonces la respuesta es
([1..]>>=).(!)
, es decir\n -> [t | s<-[1..], t<-n!s]
.Esta es una función que asigna un entero
n
a una infinita lista perezosa de tuplas (listas de enteros).fuente
Haskell , 50 bytes
Pruébalo en línea!
Listas
n
-tuplas ordenadas por suma.mapM
realiza el trabajo pesado para generar todas lasn
tuplas de números del 0 al k. El<$f
truco es explica aquí .Haskell , 51 bytes
Pruébalo en línea!
n-1
Extiende recursivamente todos los -tuples en todosn
-tuples dividiendo el primer númeroa
de cadan-1
-tupla en dos númerosa-k,k
que suman, de todas las formas posibles.fuente
Pyth - 9 bytes
Gracias a @FryAmTheEggman por el golf
Recorre todo x, y toma [1..x] ^ n. Esto hace duplicados, por lo que solo mantiene los que son nuevos para esa x, es decir, contienen x en ellos. El formato es un poco extraño, pero puede hacerse estándar con un byte más,
.V1j}#b^Sb
Pruébalo en línea .
fuente
f}bT
->}#b
Además, ¿tu conteo de bytes parece ser incorrecto en este momento?j(b)
. Además, gracias por el golf.Brachylog (v2), 9 bytes
Pruébalo en línea!
Este es un generador infinito que genera todas las tuplas posibles. El enlace TIO tiene un encabezado que usa el generador para generar 1000 elementos y los imprime (pero el generador podría continuar indefinidamente si lo pidiera en su lugar; los enteros de Brachylog son ilimitados).
Parece que debería haber una manera más terser, pero hay muchas restricciones y esta es la mejor prueba que puedo incluir en un solo programa.
Explicación
Por cierto, me parece interesante cuán diferentes son mis explicaciones de los dos
≜
, a pesar de que hacen exactamente lo mismo desde el punto de vista de Brachylog. El primero≜
es el primer predicado no determinista en el programa, por lo que establece el orden de los resultados; en este caso, calcula todos los valores explícitos posibles para la suma de la lista en el orden 0, 1, 2, 3 ..., y se está utilizando para garantizar que las listas se emitan en orden de su suma (esto asegura que cada posible la lista aparece después de una cantidad finita de salida). El segundo≜
se utiliza para calcular todas las posibilidades explícitas de la lista (en lugar de generar una fórmula que especifique cómo se relacionan entre sí los elementos de la lista).fuente
↰₁ẉ⊥
También es un buen encabezado, para imprimir infinitamente.ᶠ
o⊥
el encabezado.Perl 6 , 37 bytes
Pruébalo en línea!
Esencialmente se ejecuta
polymod
con tantas entradas como sea necesario, donde el módulo siempre es mayor que la entrada, es decir, 0.polymod (1,1,1), 1.polymod (2,2,2) etc. De esa manera el dígito siempre está dentro de el rango. Perl6 no me deja modulo infinito ...fuente
(0, 1, 0, 0)
no aparece en la lista).Wolfram Language (Mathematica) , 62 bytes
Pruébalo en línea!
-3 bytes con separación inconsistente (eliminar
@#&
)Pruébalo en línea!
fuente
C # (compilador interactivo de Visual C #) , 148 bytes
Pruébalo en línea!
-3 bytes gracias a @ASCIIOnly!
fuente
Write
con, por ejemplo,'<literal tab>'
o|
tiene la misma longitud y ocupa muchas menos líneas: PGelatina , 10 (9?) Bytes
9 si podemos generar una separación no consistente (sobre la que he preguntado) - eliminación de
€
.Pruébalo en línea!
¿Cómo?
fuente
€
es obligatorio, pero esperemos lo que OP tiene que hacer. decir.05AB1E ,
1511 bytes-4 bytes creando un puerto de @Maltysen Pyth respuesta 's .
Pruébalo en línea.
Explicación:
fuente
MATL , 16 bytes
Las tuplas se ordenan por suma creciente, y dentro de una suma dada se ordenan lexicográficamente.
Pruébalo en línea!
fuente
Python 2,
12611210610110083 bytesTry it online!
5 bytes thx to mypetlion; 1 byte from the eagle eye of ArBo; 17 bytes from xnor!
Construct the ordered partitions of
m
inton
bins, form = 0,1,2,3,...
by selecting for binary numbers withn-1
0
s andm
1
s.fuente
if i==p:i=0;p*=2
can becomei%=p;p<<=i<1
to save 5 bytes.print b
is not needed :Di+p
is just counting up 1, 2, 3... in a convoluted way and so can just be a single variable.C # (.NET Core) ,
608 570567 bytesPruébalo en línea!
my god what have I done (so many loops, that's what I've done)
¡Debería funcionar, sin embargo!
Si mueve el bucle de impresión hacia atrás un soporte, le mostrará la lista a medida que se construye, cada vez que se repite. (Recomiendo agregar una nueva línea o algo para distinguir cada ciclo si lo hace).
Honestamente, pasé gran parte de mi tiempo luchando con el lenguaje ... sin matrices bonitas, comportamientos variados de == ...
Esperemos que esta versión sea más fácil de leer.
fuente
Perl 6, 50 bytes
Try it online!
Anonymous code block that returns a lazy infinite list. This uses the same strategy as Chas Brown's answer.
Explanation:
fuente
VDM-SL, 51 bytes
Recursive set comprehension with sequence concatenation..
Not on TIO, you could run in a program (if you turn on limits for nat type or it wont terminate):
Includes the optional 0s in answer otherwise it would be 52 bytes binding on nat1
fuente
Wolfram Language (Mathematica), 131 bytes
Try it online!
fuente
perl -M5.010 122 bytes
Added some newlines for readabilities sake (not counted in the byte count)
fuente
Python 2, 120 bytes
Try it online!
A bit longer than most other answers, but I liked the idea behind it.
fuente
Stax, 6 bytes
Run and debug it
For input
n
the procedure is roughlyfuente
JavaScript (V8), 98 bytes
Try it online!
Hooray! Finally got it under 100 :) Basically a port of my C# answer.
fuente