Ihre Aufgabe ist es, ein Computerprogramm so zu schreiben, dass jede Anordnung der Zeilen eine andere Zahl zwischen 1 und n ausgibt, wenn es in Zeilen aufgeteilt wird (aufgeteilt auf das Zeilenumbruchzeichen) ! (wobei n die Gesamtzahl der Zeilen ist). Es sollte keine Nummer von zwei verschiedenen Arrangements ausgegeben werden und jedes Arrangement sollte eine Nummer in diesem Bereich ausgeben. Da gibt es n! Möglichkeiten, um die Zeilen eines Programms anzuordnen, bedeutet dies, dass jede Nummer durch eine Neuanordnung ausgegeben werden sollte.
Zum Beispiel das Python-Programm
print 1;"""
print 2;"""
Hat zwei Arrangements
print 1;"""
print 2;"""
und
print 2;"""
print 1;"""
Die ersten Ausgänge 1
und die zweiten Ausgänge 2
.
Sie können beliebige Ausgabeformate verwenden, die in der von Ihnen verwendeten Sprache Standard sind. Sie dürfen keine Art von Boilerplate annehmen. Ich denke, diese Herausforderung ist interessanter, wenn Sie die Formate umgehen müssen, auf denen die Sprache besteht.
Wertung
Ihre Punktzahl ist die Anzahl der Zeilen in Ihrem Programm, wobei eine höhere Punktzahl besser ist. Sie können Zahlen von 0 bis n! -1 ausgeben, wenn Sie möchten.
quelle
n
? Sind sie alle bei einer Punktzahl von ∞ gebunden?Antworten:
CJam , Ergebnis: ∞
Jede Zeile hat die Form
wo
x
ist eine nummer von0
bisn-1
. Das Ergebnis liegt im Bereich0
bisn!-1
.Probieren Sie es online! (Für
n=3
.)Danksagung an jimmy23013 für den Code, der den tatsächlichen Permutationsindex berechnet. Ich habe nur das Bit ersetzt, das die Eingabe liest, mit
];Lx+:L
der das Ergebnis aus der vorherigen Zeile verworfen wird, und dann den Index der aktuellen Zeile zur Variablen hinzugefügtL
(die anfänglich ein leeres Array ist).quelle
0+:+
) Ich denke, Sie können eine viel kürzere Version mit bekommen,m!#
.Perl: ∞
Erweitern Sie auf eine beliebige Länge
Der Speicher wird schnell knapp, da die Speichernutzung gleich O (n ^ n) ist. Es wäre jedoch einfach, den Permutationsindexer durch O (n) Code zu ersetzen, nur länger. Ich zeige nur, wie Sie
END{}
diese Aufgabe in Perl ausführen können. AlleEND{}
Blöcke werden zur Exit-Zeit ausgeführt, aber nur der erste, der aufgerufen wird (der letzte im Code), gibt aufgrund des/A/
Tests etwas aus, was nur einmal wahr istBeachten Sie, dass der
$m
Zähler als Zeichenfolge zählen muss, da er als Zahl überlaufen würde (später als das Ende des Universums, aber es ist das Prinzip, das zählt). Aus dem gleichen Grund "zähle" ich die Anzahl der Zeilen, indem ichA
anstelle eines echten Zählers eine Zeichenfolge von s aufbaue, obwohl dieser Überlauf auch später auftreten würde.Eine andere Möglichkeit, dies in Perl zu tun:
Dies nutzt die Tatsache, dass in
foo = bar
bar
nach ausgeführt wirdfoo
. Diese Version ist übrigens zeitlich und räumlich nicht verrückt, aber das verlängert den CodeEs ist noch eine andere Idee zu verwenden,
DESTROY
die den Vorteil hat, dass nur eine von ihnen ausgeführt wird. Ich werde den Permutationsindexcode, für den ich bereits zwei Beispiele gegeben habe, nicht wiederholen.Oder mit
BEGIN
:quelle
Gelee , ∞
(Beispiel mit
n=3
.)Probieren Sie es online!
231311 Bytes pro Zeile.Bei einem Programm mit
n
Zeilen haben die Zeilen das Format;
<i>
ÇQŒ¿$⁼Q$?
wobei
<i>
für die Zahl Literali
und jede Zeile einen anderen Wert für die imi
Bereich von1
bisn
. (Die Werte füri
müssen nicht unbedingt diese spezifischen Zahlen sein, sondern nur eindeutige positive Werte.) Dieses Programm wirdn
in der Zeilenstruktur nicht mehr verwendet .Wie?
0
.;1
hängt1
an0
oder an die aktive Liste.⁼Q$
ist die bedingte Monade für die if-Anweisung (?
), die prüft, ob die Elemente der Liste eindeutig sind. Wenn dies der Fall ist, wird der obige Link mit (Ç
) bezeichnet und eine weitere Nummer an die Liste angehängt. Wenn sie nicht eindeutig sind, haben wir uns um den ersten Link gekümmert. Das wiederholte Element wird aus der Liste entfernt (Q
) und der Index der Permutation wird gefunden (Œ¿
). Beachten Sie, dass sich0
am Anfang der Liste einŒ¿
befindet, wenn sie aufgenommen wird, dies hat jedoch keine Auswirkungen auf die Ausgabe, da die Werte füri
alle positiv sind.Neue Jelly-Funktion
Mit dem neu hinzugefügten
Ƒ
Quick können wir⁼Q$
aufQƑ
ein Byte reduzieren .10 Bytes / Zeile (für einzelne Ziffern)
Probieren Sie es online!
quelle
Brain-Flak , 3
Probieren Sie es online!
Ich habe dies früher im Chat gepostet, aber hoffentlich können die Leute es daraus machen, indem sie es hier posten.
Erläuterung
Wir beginnen mit dem Grundprogramm
Dies ergibt 2 für sich. Um in die nächste Ebene aufzusteigen, möchte ich eine neue Zeile hinzufügen. Meine anfängliche Vermutung war
Dies setzt die TOS auf,
2
wenn sie Null ist und macht sonst nichts. Das ist eigentlich ein guter Anfang. Mit den anderen beiden Zeilen können wir alle Zahlen von1
bis6
außer abrufen4
, da es verschiedene2
Möglichkeiten gibt, sie auszugeben2
:und
Um dem abzuhelfen, machen wir unsere Linie auch so eingestellt
2
, dass sie ist4
. Dies kann mit erfolgenAus Gründen der Übersichtlichkeit implementiert dies im Wesentlichen die Haskell-Funktion
Dies behebt unser Problem, da eines der Programme, die zuvor ausgegeben wurden,
2
jetzt ausgegeben wird,4
ohne dass ein anderes Programm geändert wird.quelle
Java 7, Kerbe: ∞
Probieren Sie es online!
Dies kann 0 bis n! -1 ausgeben . Zusätzliche Zeilen haben das folgende Format (wobei INDEX eine Zahl von 1 bis n! -1 ist ):
Bei dieser Methode wird die eigene Quelle gelesen, um zu bestimmen, welche Ordnungsklassen darin aufgeführt sind. Leider gab es keine coolere Methode, die ich finden konnte, wenn ich die kompilierte Datei analysierte oder einen benutzerdefinierten ClassLoader erstellte, da Java die JIT-Kompilierung ausführte. Ich nehme an, ich könnte jede weitere Klasse einfach eine statisch festgelegte Zahl ausdrucken lassen, aber das schien mehr Spaß zu machen. Das würde auch dazu führen, dass ich die
B
Schnittstelle entfernen könnte, aber die Bewertung basiert nicht auf Bytes, also lasse ich das zum Spaß.Wie es funktioniert (hohes Niveau):
Liest seinen eigenen Quellcode zeilenweise. Da jede Zeile eine neue Klasse deklariert, erstellen wir mit Reflection eine Instanz der neuen Klasse und rufen die
a
Methode auf, die sie benötigt, um dieB
Schnittstelle zu implementieren .quelle
Ruby , Punktzahl: ∞
Probieren Sie es online!
Dieses Programm hat 61 Bytes pro Zeile (für n <10). Es hat das gleiche Grundformat wie Dylnans Lösung . Die erste Zahl in jeder Zeile ist ein anderer Wert zwischen
1
undn
, und die zweite Zahl in jeder Zeile ist ein anderer Wertn
.Ich hatte gehofft, einen Weg zu finden, um eine Aufnahme
n
in das Programm zu vermeiden , aber ich konnte keinen finden.quelle
Brain-Flak , 2 (mit
-d
)Probieren Sie es online!
quelle
2
Sie können({}())
und verwenden(({}){})
.05AB1E , Score: 1.114.112
Probieren Sie es online! 0-indiziert. Das ˆ am Anfang jeder Zeile verschiebt die einzelnen Zeichen in das globale Array. Der Rest des Codes wird sinnlos ausgeführt, außer in der letzten Zeile, in der die Werte zu einer Zeichenfolge verkettet werden und der Permutationsindex ermittelt wird. 1.114.112 ist die Anzahl der möglichen Unicode-Zeichen zum Zeitpunkt des Schreibens (die Codepunkte 48-57 sind natürlich am einfachsten zu demonstrieren).
quelle