Il existe un théorème bien connu selon lequel toute permutation peut être décomposée en un ensemble de cycles . Votre travail consiste à écrire le programme le plus court possible pour le faire.
Contribution:
Deux lignes. Le premier contient un nombre N
, le second contient N
des entiers distincts dans la plage [0,N-1]
séparée par des espaces. Ces entiers représentent une permutation d' N
éléments.
Production:
Une ligne pour chaque cycle de la permutation. Chaque ligne doit être une liste d'entiers séparés par des espaces dans l'ordre des cycles.
Les cycles peuvent être émis dans n'importe quel ordre et chaque cycle peut être émis à partir de n'importe quelle position.
Exemple 1:
8
2 3 4 5 6 7 0 1
Cette entrée code la permutation 0-> 2, 1-> 3, 2-> 4, 3-> 5, 4-> 6, 5-> 7, 6-> 0, 7-> 1. Cela se décompose en cycles comme celui-ci:
0 2 4 6
1 3 5 7
Une sortie tout aussi valide serait
5 7 1 3
2 4 6 0
Exemple 2:
8
0 1 3 4 5 6 7 2
sortie valide:
0
1
4 5 6 7 2 3
la source
>C.
Réponses:
C
145134 Caractèreshttp://www.ideone.com/BrWJT
la source
int
?gets(&i)
idée de me débarrasser de cette première ligne inutile, mais cela ne fonctionnerait clairement pas sur les systèmes 16 bits si plus de 10 éléments sont passés. Mais encore une fois, si les règles sont "trouver au moins un programme qui prétend être un compilateur C qui crée un exécutable où dans au moins un cas semble - au moins pour moi - donner une réponse valide" alors c'est une amélioration: - )Python 131 caractères
la nouvelle ligne de fin n'est pas nécessaire
la source
Haskell, 131 caractères
>=
est devenu>
, éliminé deuxtail
appels grâce à la correspondance de modèles et à la pré-application dea!!
.la source
C (en quelque sorte), 139 caractères
La nouvelle ligne finale n'est pas incluse.
J'ai dit "en quelque sorte" parce que l'AFAIK par exemple
int
ne peut pas être omis pour la déclaration de variable (je n'ai pas trouvé où il est dit qu'il peut être omis et la déclaration de type implicite n'est décrite que pour les fonctions. La spécification de grammaire dans la norme est fondamentalement inutile car accepte beaucoup plus que les déclarations C valides, par exempledouble double void volatile x;
)mais le code ci-dessus compilé avec
gcc -ocycles cycles.c
fonctionne apparemment de toute façon.la source
scanf
sans#include <stdio.h>
même si les paramètres sont corrects et ne nécessitent pas de conversions ):<<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 et 32)
Je ne suis pas tout à fait clair sur le format d'E / S, mais je pense que ce
C.
serait le cas si la sortie suivante était acceptée:(Il semble mieux dans le terminal J.)
S'il doit s'agir d'une fonction nommée conforme à ma meilleure compréhension du format d'E / S, ce serait 32 caractères, dont 30 pour la conversion du format de sortie ...
En action:
Explication:
J est exécuté de droite à gauche (pratiquement).
@
est une «fonction» (pas techniquement une fonction, mais c'est assez proche) pour combiner des fonctions.i.&LF
- trouver le premier index deLF
, une variable prédéfinie contenant le caractère ASCII numéro 10, le saut de ligne.>:
- trouver le premierLF
, et incrémenter son index de un. Nous ne voulons pas réellement le saut de ligne, nous voulons le tableau qui le suit.}.~
- Sélectionne la partie de l'entrée que nous voulons.".
- Puisque le format d'entrée est valide J ( * \ õ / * ), nous pouvons simplement utiliser leeval
verbe (je sais qu'il n'est pas réellement appeléeval
.) Pour le transformer en un tableauC.
- Magie pure. Je n'ai vraiment aucune idée de ce que cela fait, mais cela semble fonctionner!":L:0
- Représentation. Transforme la sortie deC.
en une séquence encadrée de chaînes>
- Déballer. La sortie réelle est en fait un tableau de chaînes (il y a des espaces derrière le premier pour les numéros de l'exemple).la source
Clojure, 145
Quelque peu non golfé et divisé en une fonction (l'entrée doit être un vecteur, ce que produit (vec (lecture répétée)) d'en haut):
(Wow, je viens de remarquer que ce défi a plus de 3 ans. Oh bien, amusez-vous quand même!)
la source