Inspirado en Tomado de una pregunta en Stack Overflow .
El reto
Dado un número entero n>1
, genera todas las matrices que se pueden obtener intercambiando exactamente dos entradas en la matriz [1, 2, ..., n]
.
Las matrices se pueden producir en cualquier orden.
Puede usar constantemente [0, 1, ..., n-1]
(basado en 0) en lugar de [1, 2, ..., n]
(basado en 1).
Reglas adicionales
La entrada y la salida son flexibles como de costumbre .
Se permiten programas o funciones , en cualquier lenguaje de programación . Las lagunas estándar están prohibidas.
El código más corto en bytes gana.
Casos de prueba
La entrada 2
da salida (se supone basada en 1)
2 1
La entrada 3
da salida (tenga en cuenta que las tres matrices podrían estar en cualquier orden)
1 3 2
2 1 3
3 2 1
La entrada 4
da salida
1 2 4 3
1 3 2 4
1 4 3 2
2 1 3 4
3 2 1 4
4 2 3 1
La entrada 7
da salida
1 2 3 4 5 7 6
1 2 3 4 6 5 7
1 2 3 4 7 6 5
1 2 3 5 4 6 7
1 2 3 6 5 4 7
1 2 3 7 5 6 4
1 2 4 3 5 6 7
1 2 5 4 3 6 7
1 2 6 4 5 3 7
1 2 7 4 5 6 3
1 3 2 4 5 6 7
1 4 3 2 5 6 7
1 5 3 4 2 6 7
1 6 3 4 5 2 7
1 7 3 4 5 6 2
2 1 3 4 5 6 7
3 2 1 4 5 6 7
4 2 3 1 5 6 7
5 2 3 4 1 6 7
6 2 3 4 5 1 7
7 2 3 4 5 6 1
code-golf
number
combinatorics
integer
Luis Mendo
fuente
fuente
[0 ... n-1]
vs[1 ... n]
! Siempre me siento un poco molesto cuando tengo que añadir un1+
porque J índices cero.Respuestas:
Jalea ,
118 bytesPruébalo en línea!
Cómo funciona
fuente
y
? Siempre ha sido un misterio para mí.[1,2],[4,3]y1,2,3
reemplaza cada 1 en [1, 2, 3] con 4 , y cada 2 con 3 .R , 54 bytes
Pruébalo en línea!
Devuelve una matriz donde cada columna es una permutación.
combn(n,k)
genera todas las combinaciones de tamañok
de la listan
, o de1:n
sin
es un solo entero. También opcionalmente toma una funciónFUN
para ser aplicada a las combinaciones resultantes. Entonces escribimos una función que realiza el intercambio y devuelve la lista intercambiada. Los resultados se acumulan en unaarray
, que en este caso es bidimensional y, por lo tanto, una matriz.fuente
Python 2 , 71 bytes
Pruébalo en línea!
Utiliza este consejo .
fuente
Haskell , 62 bytes
Pruébalo en línea!
Solo genero la permutación, dada la
x
yy
para intercambiar, para cadax,y
fuente
Python 2 , 72 bytes
Pruébalo en línea!
fuente
Wolfram Language (Mathematica) , 43 bytes
Pruébalo en línea!
Explicación:
Subsets[Range@#,{2}]
genera todos los subconjuntos de{1,2,...,n}
tamaño 2, luego, para cada subconjunto,/.
intercambia esas dos cosas en la lista{1,2,...,n}
.Ese enfoque es decepcionantemente similar a muchos de los otros envíos, pero aquí hay uno que es más exclusivo de Mathematica, para 3 bytes adicionales:
Pruébalo en línea!
fuente
ReplaceList[Range@#,{a___,b_,c___,d_,e___}:>{a,d,c,b,e}]&
. Me gusta lo simple que es (o qué tan directamente codifica el problema), pero desafortunadamente la sintaxis de coincidencia de patrones es tan detallada que termina siendo 57 bytes.Haskell, 62 bytes
Pruébalo en línea!
fuente
Haskell , 71 bytes
Pruébalo en línea!
Esto agrega el número actual al final de todas las permutaciones de último y luego calcula todos los intercambios que incluyen el nuevo número.
fuente
MATL , 12 bytes
Pruébalo en línea!
fuente
:tY@wy=~!s2=Y)
. El mismo enfoque que la respuesta Octave de rahnema1, creoC, 93 bytes
Pruébalo en línea!
fuente
Octava, 38 bytes
Pruébalo en línea!
Genera todas las permutaciones de 1: ny selecciona de ellas aquellas que tienen dos elementos diferentes de 1: n.
fuente
JavaScript (ES6), 81 bytes
Imprime matrices indexadas en 0.
Manifestación
alert()
se reemplaza conconsole.log()
en este fragmento para facilitar su uso.Mostrar fragmento de código
fuente
Python 2 , 75 bytes
Pruébalo en línea!
fuente
Limpio ,
9082 bytesSe puede hacer en 80 bytes, pero se convierte en una traducción directa de las respuestas de Haskell.
Pruébalo en línea!
fuente
05AB1E ,
159 bytesPruébalo en línea!
Explicación
fuente
Casco , 9 bytes
Pruébalo en línea!
Explicación
fuente
Ruby ,
5553 bytesPruébalo en línea!
Solución basada en 0
El truco aquí es que el bucle interno siempre "omite" una iteración: la primera vez que no se ejecuta, luego solo una vez en la segunda pasada, y así sucesivamente.
Estaba contento con 55 bytes hasta que vi que R podía reducirse a 54, así que tuve que llegar a 53.
fuente
Python 2 , 90 bytes
Pruébalo en línea!
fuente
Pyth, 9 bytes
Demostración
La forma más fácil de intercambiar dos valores es usar
.r
, que es la función de traducción rotativa de Pyth..r<list>[A, B]
intercambiará todas las ocurrencias deA
yB
enlist
.Por lo tanto, al aplicar la función de traducción a
UQ
, la lista de0
an-1
con cada lista de dos elementos de diferentes números en la lista, generaremos el resultado deseado.Q
es la entrada,n
yU
es la función de rango.La manera fácil de hacer esto sería:
.cUQ2
genera las 2 combinaciones de elementos de elementos distintos en el rango y.rLUQ
asigna la.r
función sobre ellos y la listaUQ
.Sin embargo, eso sería 10 bytes.
En lugar de hacer
.cUQ2
los distintos pares ordenados, podemos hacer todos los pares con*=U
. Esto es implícitamente equivalente a*=UQQ
. Comienza sobrescribiendoQ
conUQ
, luego tomando el producto cartesiano deUQ
yUQ
. Esto proporciona todos los pares de números en el rango, no necesariamente ordenados o distintos..rLQ
intercambia utilizando cada lista. Recuerde queQ
ahora es igual a la lista de0
an-1
, non
.Debido a que los pares no fueron ordenados, hay duplicados.
{
elimina duplicados Debido a que los pares no eran distintos, la lista sin cambios está presente. Esta lista siempre será la primera después de la deduplicación, porque{
conserva el orden de la primera aparición y la lista sin cambios se produce al rotar por[0,0]
.t
elimina el primer elemento, dando la lista deseada de intercambios.fuente
Pyth, 11 bytes
Pruébelo en línea
No tan corto como el enfoque de Isaac, pero lo suficientemente diferente como para publicar.
Explicación
fuente
Java 8,
109105bytesEstoy oxidado ... No he codificado golf en meses ... Terminé portando la respuesta de @Steadybox 'C ... Probablemente se pueda jugar un poco más.
Pruébalo aquí
fuente
Ruby , 66 bytes
Pruébalo en línea!
fuente
Rubí , 80 bytes.
-12 bytes gracias a Unihedron.
Pruébalo en línea!
Tenía un enfoque en mente que se traducía mejor a Ruby por alguna razón, así que ... Ni siquiera conozco a Ruby ...
fuente
1..n
a una variable de un carácter y reutilizarla (declaraciones separadas con nueva línea o punto y coma), 2. sin corchetes en las declaraciones de termary:i==x ?y:i==y ?x:i
(tenga en cuenta dónde tengo los espacios para separar el shebang potencial ) y 3. enuniq[1,n]
lugar deuniq[1..-1]
.