Es gibt einen bekannten Satz, dass jede Permutation in eine Reihe von Zyklen zerlegt werden kann . Ihre Aufgabe ist es, das kürzestmögliche Programm dafür zu schreiben.
Eingang:
Zwei Linien. Die erste enthält eine Zahl N
, die zweite enthält N
verschiedene Ganzzahlen in dem [0,N-1]
durch Leerzeichen getrennten Bereich . Diese Ganzzahlen repräsentieren eine Permutation von N
Elementen.
Ausgabe:
Eine Zeile für jeden Zyklus in der Permutation. Jede Zeile sollte eine durch Leerzeichen getrennte Liste von Ganzzahlen in Zyklusreihenfolge sein.
Zyklen können in beliebiger Reihenfolge ausgegeben werden, und jeder Zyklus kann von einer beliebigen Position aus ausgegeben werden.
Beispiel 1:
8
2 3 4 5 6 7 0 1
Dieser Eingang codiert die Permutation 0-> 2, 1-> 3, 2-> 4, 3-> 5, 4-> 6, 5-> 7, 6-> 0, 7-> 1. Dies zerfällt in Zyklen wie folgt:
0 2 4 6
1 3 5 7
Eine ebenso gültige Ausgabe wäre
5 7 1 3
2 4 6 0
Beispiel 2:
8
0 1 3 4 5 6 7 2
gültige Ausgabe:
0
1
4 5 6 7 2 3
quelle
>C.
Antworten:
C
145134 Zeichenhttp://www.ideone.com/BrWJT
quelle
int
?gets(&i)
Idee, diese nutzlose erste Zeile loszuwerden, aber dies würde auf 16-Bit-Systemen eindeutig nicht funktionieren, wenn mehr als 10 Elemente übergeben werden. Aber noch einmal, wenn die Regeln lauten, dass "mindestens ein Programm gefunden wird, das behauptet, ein C-Compiler zu sein, der eine ausführbare Datei erstellt, auf die in mindestens einem Fall - zumindest für mich - eine gültige Antwort zu geben scheint", dann ist dies eine Verbesserung: )Python 131 Zeichen
Die letzte Zeile wird nicht benötigt
quelle
Haskell, 131 Zeichen
>=
wurde>
, eliminierte zweitail
Aufrufe durch Pattern Matching & Pre-Application vona!!
.quelle
C (Art von), 139 Zeichen
Die letzte Zeile ist nicht enthalten.
Ich sagte "irgendwie", weil AFAIK zum Beispiel
int
kann bei Variablendeklaration nicht weggelassen werden (Ich habe nicht gefunden, wo es heißt, dass es weggelassen werden kann, und die implizite Typdeklaration wird nur für Funktionen beschrieben. Die Grammatikspezifikation in der Norm ist im Grunde genommen nutzlos, da sie zum Beispiel viel mehr als gültige C-Deklarationen akzeptiert.double double void volatile x;
)aber der obige mit kompilierte code
gcc -ocycles cycles.c
funktioniert anscheinend trotzdem.quelle
scanf
ohne einen Aufruf auskommen,#include <stdio.h>
auch wenn die Parameter korrekt sind und keine Konvertierungen erfordern ):<<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 (zwischen 2 und 32)
Ich bin mir nicht ganz
C.
sicher , was das I / O-Format angeht, aber ich denke, es wäre gut, wenn die folgende Ausgabe akzeptiert würde:(Im J-Terminal sieht es besser aus.)
Wenn es sich um eine benannte Funktion handeln muss, die meinem besten Verständnis des E / A-Formats entspricht, sind dies 32 Zeichen, von denen 30 für die Ausgabeformatkonvertierung bestimmt sind ...
In Aktion:
Erläuterung:
J wird (praktisch) von rechts nach links ausgeführt.
@
ist eine 'Funktion' (technisch gesehen keine Funktion, aber das ist nah genug), um Funktionen zu kombinieren.i.&LF
- Ermitteln Sie den ersten IndexLF
einer vordefinierten Variablen mit dem ASCII-Zeichen 10 und dem Zeilenvorschub.>:
- finde den erstenLF
und erhöhe seinen Index um eins. Wir wollen eigentlich keinen Zeilenvorschub, wir wollen das Array, das darauf folgt.}.~
- Wählt den gewünschten Teil der Eingabe aus.".
- Da das Eingabeformat J ( * \ õ / * ) ist, können wir einfach daseval
Verb (ich weiß, dass es nicht wirklich aufgerufen wirdeval
) verwenden, um es in ein Array zu verwandelnC.
- Pure Magie. Ich habe wirklich keine Ahnung, was das macht, aber es scheint zu funktionieren!":L:0
- Vertretung. Wandelt die Ausgabe vonC.
in eine Folge von Strings um>
- Unbox. Die eigentliche Ausgabe ist eigentlich ein String-Array (es gibt Leerzeichen hinter den ersten bis zu den Zahlen des Beispiels).quelle
Clojure, 145
Etwas ungolfed und in eine Funktion zerlegt (Eingabe muss ein Vektor sein, was (vec (wiederholt (lesen) lesen)) von oben ergibt):
(Wow, habe gerade bemerkt, dass diese Herausforderung über 3 Jahre alt ist. Na ja, es hat trotzdem Spaß gemacht!)
quelle