Existe un teorema bien conocido de que cualquier permutación puede descomponerse en un conjunto de ciclos . Su trabajo es escribir el programa más corto posible para hacerlo.
Entrada:
Dos lineas. El primero contiene un número N
, el segundo contiene N
enteros distintos en el rango [0,N-1]
separados por espacios. Estos enteros representan una permutación de N
elementos.
Salida:
Una línea para cada ciclo en la permutación. Cada línea debe ser una lista de enteros separados por espacios en orden de ciclo.
Los ciclos se pueden generar en cualquier orden, y cada ciclo se puede generar comenzando en cualquier posición.
Ejemplo 1:
8
2 3 4 5 6 7 0 1
Esta entrada codifica la permutación 0-> 2, 1-> 3, 2-> 4, 3-> 5, 4-> 6, 5-> 7, 6-> 0, 7-> 1. Esto se descompone en ciclos como este:
0 2 4 6
1 3 5 7
Una salida igualmente válida sería
5 7 1 3
2 4 6 0
Ejemplo 2
8
0 1 3 4 5 6 7 2
salida válida:
0
1
4 5 6 7 2 3
fuente
>C.
Respuestas:
C
145134 Personajeshttp://www.ideone.com/BrWJT
fuente
int
?gets(&i)
idea de deshacerme de esa primera línea inútil, sin embargo, esto claramente no funcionaría en sistemas de 16 bits si se pasan más de 10 elementos. Pero una vez más, si las reglas son "encontrar al menos un programa que dice ser un compilador de C que crea un ejecutable donde, al menos en un caso, parece, al menos para mí, dar una respuesta válida", entonces esta es una mejora: )Python 131 caracteres
la nueva línea final no es necesaria
fuente
Haskell, 131 personajes
>=
convirtió>
, eliminó dostail
llamadas a través de la coincidencia de patrones y la pre-aplicación dea!!
.fuente
C (más o menos), 139 caracteres
La nueva línea final no está incluida.
Dije "algo así" porque AFAIK por ejemplo
int
no se puede omitir para la declaración de variables (no encontré dónde se dice que se puede omitir y la declaración de tipo implícita solo se describe para funciones. La especificación gramatical en el estándar es básicamente inútil ya que acepta mucho más que declaraciones C válidas, por ejemplodouble double void volatile x;
)pero el código anterior compilado
gcc -ocycles cycles.c
aparentemente funciona de todos modos.fuente
scanf
sin#include <stdio.h>
ni siquiera si los parámetros son correctos y no se requiere conversiones ):<<If the function is defined with a type that includes a prototype, and the types of the arguments after promotion are not compatible with the types of the parameters, or if the prototype ends with an ellipsis ( ", ..." ), the behavior is undefined.>>
J (entre 2 y 32)
No tengo muy claro el formato de E / S, pero creo que
C.
lo haría si se aceptara la siguiente salida:(Se ve mejor en la terminal J.)
Si necesita ser una función con nombre que cumpla con mi mejor comprensión del formato de E / S, serían 32 caracteres, de los cuales 30 son para la conversión del formato de salida ...
En acción:
Explicación:
J se ejecuta de derecha a izquierda (prácticamente).
@
es una 'función' (técnicamente no es una función, pero está lo suficientemente cerca) para combinar funciones.i.&LF
- encuentre el primer índice deLF
, una variable predefinida que contiene el número de caracteres ASCII 10, el avance de línea.>:
- encuentre el primeroLF
e incremente su índice en uno. En realidad no queremos el salto de línea, queremos la matriz que lo sigue.}.~
- Selecciona la parte de la entrada que queremos.".
- Dado que el formato de entrada es válido J ( * \ õ / * ) podemos usar eleval
verbo (sé que en realidad no se llamaeval
) para convertirlo en una matrizC.
- Magia pura. Realmente no tengo idea de lo que hace, ¡pero parece funcionar!":L:0
- Representación. Convierte la salida deC.
en una secuencia de cadenas en caja>
- Unbox. El resultado real es en realidad una matriz de cadenas (hay espacios detrás del primero a los números del ejemplo).fuente
Clojure, 145
Algo sin golf y dividido en una función (la entrada debe ser un vector, que es lo que produce (vec (repetidamente (leer) leer)) desde arriba):
(Wow, acabo de notar que este desafío tiene más de 3 años. ¡Oh, bueno, me divertí haciéndolo de todos modos!)
fuente