Ist es zu schwer , Sudoku zu lösen ? Auch die Brute-Force- Version? Hier ist eine Codierungsübung, die etwas einfacher ist. Ich hoffe. :-P
Schreiben Sie die kürzeste Funktion, um Bogosort zu implementieren. Im Einzelnen sollte Ihre Funktion:
- Nehmen Sie ein Array (oder das Äquivalent Ihrer Sprache) als Eingabe
- Überprüfen Sie, ob die Elemente sortiert sind. Wenn ja, geben Sie das Array zurück
- Wenn nicht, mische die Elemente und beginne erneut
Der kürzeste Eintrag gewinnt. Bei einem Unentschieden wird eine Funktion bevorzugt, die einen benutzerdefinierten Komparator (und / oder einen Pseudozufallszahlengenerator) unterstützt. Verbleibende Bindungen werden durch Bevorzugung der früheren Einreichung gelöst.
Erläuterungen: Sie können jeden gewünschten Elementtyp verwenden, sofern Sie diese natürlich auf irgendeine Weise bestellen können. Auch das Mischen muss gleichmäßig sein; nichts davon "Ich werde es nur schnell sortieren und es gemischt nennen". :-)
Antworten:
APL (Dyalog), 20
Erläuterung
⍵
ist das (rechte) Argument⍵≡⍵[⍋⍵]
: Prüft, ob⍵
sortiert gleich⍵
ist:⍵
: Wenn ja, dann gebe zurück⍵
∇⍵[?⍨⍴⍵]
: Andernfalls generiere ein Array von 1 bis⍴⍵
(Länge von⍵
) in zufälliger Reihenfolge, ordne⍵
danach neu (⍵[...]
) und wende die Funktion darauf an (∇
)Plötzlich wieder dieses Problem und ...
APL (Dyalog), 19
Wenn man nur darüber nachdenkt, ein Array in der Prüfung zu sortieren, macht es irgendwie sinnlos (nicht zu sagen, dass Bogosort sinnvoll ist), wäre dies eine genauere Implementierung
∧/2≤/⍵
, und das senkt zufällig die Anzahl der Zeichen.quelle
Perl 6: 23 Zeichen
quelle
[<=]
überprüfen Sie, ob eine Liste sortiert ist:[<=] (1, 2, 3,) == (1 <= 2 <= 3) == (1 <= 2) and (2 <= 3)
und wählen Sie.pick(n)
n zufällige Elemente aus einer Liste aus..pick(*)
Perl wählt dann alle Elemente aus. use.perl.org/~masak/journal/40459pick
verwendetes gesehen , geschweige denn[<=]
. Wo in der Dokumentation sind diese?[]
ist der Reduktionsoperator, der den Operator in eckige Klammern setzt. Zum Beispiel[<=] 1, 2, 3
ist1 <= 2 <= 3
(und ja, Sie haben Bereiche wie diesen in Perl 6). In diesem Fall wird bestimmt, ob die Elemente in Ordnung sind..pick(*)
Methode mischt die Liste (pick(N)
wähltN
Elemente aus der Liste aus)..=
ruft die Methode auf und weist das Ergebnis der Variablen zu. Was die Dokumentation anbelangt , gibt es im Moment nur die Perl 6-Spezifikation feather.perl6.nl/syn , aber es gibt sie.APL (22)
Verwendung:
Erläuterung:
⍋⍵
: Gibt die Indizes der Elemente in sortierter Reihenfolge, so⍋30 10 20
gibt2 1 3
(⍳X←⍴⍵)≡⍋⍵:⍵
Speichern Sie die Länge der Eingabeliste in X. Wenn der Bereich[1..X]
der sortierten Indexreihenfolge entspricht, wird die Liste sortiert. Geben Sie sie daher zurück.⋄∇⍵[X?X]
: Wenn dies nicht der Fall ist, verwenden Sie ein gemischtes Array.quelle
Ruby - 33 Zeichen
quelle
g=proc{|l|0until l.sort==l.shuffle!}
f=->l{l.sort!=l.shuffle!?redo:l}
(Ruby 1.9)redo
mit einerproc
aber nicht mit einer klassischen methode gearbeitet wirddef...end
? Ich dachteredo
, funktioniert nur mit Schleifen?redo
[…] überträgt die Kontrolle zurück an den Anfang des Prozesses oder Lambdas". Es ist einfach so.Mathematica ,
4037Mit Leerzeichen:
quelle
#//.l_/;Sort@l!=l:>RandomSample@l&
J -
3427z.B:
Der Teil {~? ~ @ # Mischt die Eingabe:
quelle
Python 61
Sortiert an Ort und Stelle.
quelle
from random import*
kann ein Zeichen retten.Python 94
Andere Python-Antworten verwenden random.shuffle (). In der Dokumentation des Python-Zufallsmoduls heißt es:
quelle
return[x...
im Gegensatz zu tun könnenreturn [x...
. Gleiches gilt fürpermutations(a) if
- es könnte seinpermutations(a)if
.lambda a: [x for x in __import__("itertools").permutations(a) if x==tuple(sorted(a))][0]
ist 88 BytesK
31,25{while[~x~x@<x;x:x@(-#x)?#x];x}
.
.
quelle
Python (69 Zeichen)
Sortiert ganze Zahlen in aufsteigender numerischer Reihenfolge. Beachten Sie, dass rekursive Lösungen wie
from random import*;f=lambda a:a>sorted(a)and(shuffle(a)or f(a))or a
schlägt aufgrund eines Stapelüberlaufs auch bei kleinen Eingaben (z. B. N> 5) fehl, da Python keine Tail-Call-Optimierung durchführt.
quelle
D ohne benutzerdefinierten Komparator: 59 Zeichen
Mehr leserlich:
D mit benutzerdefiniertem Komparator: 69 Zeichen
Mehr leserlich:
quelle
Scala 73:
In Scala können wir überprüfen, ob der Compiler eine Tail-Call-Optimierung durchgeführt hat:
und ja, das tat es. Für eine kurze Liste von 100 Werten:
Die Fertigstellung dauerte fast 4 Monate. ;)
quelle
C # (184 Zeichen)
Es ist nicht wirklich schön, dies in C # zu tun. Sie müssen Generika unterstützen, um sowohl Wert- als auch Referenztypen zu unterstützen. Es gibt keine Funktion zum Mischen von Arrays oder zum Überprüfen, ob etwas sortiert ist.
Hat jemand Tipps, um dies zu verbessern?
Edit Version, die nur int sortiert (134 Zeichen):
quelle
GNU / BASH 65
quelle
C ++ 11, 150 Zeichen
Nur zum Spaß gemacht.
quelle
Python - 61 Zeichen
Rekursiv
quelle
from random import*
könnte kürzer sein.PowerShell ,
8582565552 Byte-26 Bytes dank mazzy-Vorschlägen
-1 Bytes dank AdmBorkBork
-3 Bytes dank mazzy
Probieren Sie es online!
PowerShell bietet einen relativ günstigen Array-Vergleich, indem sie in Strings umgewandelt und diese verglichen werden.
quelle
param
Initialisierung in Ihrefor
Initialisierung, um ein Byte zu speichern. -for($l=$args;
-ne
wandelt den rechten Operator in einen skalaren Typ des linken Operators um. So können Sie ein paar Bytes sparen: Probieren Sie es online!Javascript 291 Zeichen
Mindest
un-min
quelle
var
s entfernen . Machen Sie sie einfach alle implizit global, es geht nur darum, den Code so kurz wie möglich zu halten.Matlab, 59 Bytes
Relativ unkomplizierter Ansatz:
quelle
J, 22 Bytes
Dies ist eine rekursive, stillschweigende Monade, die eine Agenda verwendet. So funktioniert das:
Sei
y
unsere Liste. Erstens ist das Verb auf der rechten Seite der Tagesordnung-:/:~
. Dieses Verb wurde uns freundlicherweise von Leaky Nun zur Verfügung gestellt . Es stimmt überein (-:
), ob die Eingabe/:~
mit einem monadischen Hook sortiert ( ) ist oder nicht . ((f g) y = y f (g y)
) Dies gibt dementsprechend eine Eins oder eine Null zurück. Die linke Seite der Agenda besteht aus zwei Gerundien: Auf der rechten Seite befindet sich das Identitätsverb]
und auf der linken Seite findet die Rekursion statt. Die Agenda wählt entweder die Identität Verb in der Position ,1
wenn die Liste wird sortiert, und je länger Verb in der Position ,0
wenn die Liste ist nicht sortiert.$:@({~?~@#)
Calls$:
(das längste Verb, in dem es enthalten ist) auf dem Ergebnis von{~?~@#
ony
. Dies mischt die Liste, wobei?~@#
die Permutationen der Länge vony
zufällig sortierten Indizes von genommen werdeny
.{~
Gibt in einem monadischen Hook eine Liste zurück,y
deren Indizes das richtige Argument sind. Diese gemischte Liste wird dann mit der Agenda erneut aufgerufen und wiederholt, bis sie sortiert ist.quelle
C ++ 14, 158 Bytes
quelle
Jelly , 6 Bytes, Sprachnachstellung
Probieren Sie es online!
Erläuterung
Œ¿
weist jeder Permutation einer Liste eine Nummer zu; 1 ist sortiert, 2 hat die letzten beiden Elemente ausgetauscht usw., bis zur Fakultät der Listenlänge (die die Liste in umgekehrter Reihenfolge ist). Für eine sortierte Liste hat diese den Wert 1, und wir können sie mit dekrementieren’
, um einen "nicht sortierten" Test zu erstellen, der als Boolescher Wert in einer while-Schleifenbedingung verwendet werden kann. Das$
ist auf Grund der Zustand als eine Gruppe zu analysieren.quelle
Brachylog (v2), 5 Bytes, Sprachnachstellung
Probieren Sie es online!
Funktionsübergabe. (Die TIO-Verknüpfung verwendet ein Befehlszeilenargument, das eine Funktion automatisch in ein vollständiges Programm umschließt.)
Erläuterung
Prolog (die Sprache, in die Brachylog kompiliert) ist rekursiv, sodass diese Funktion in einer engen Schleife kompiliert wird.
quelle
C ++, 166 Bytes
Meh.
Dies sollte für alle STL-Container mit
begin()
und funktionierenend()
.Ungolfed:
quelle
APL (Dyalog Extended) , 15 Byte
Probieren Sie es online!
quelle
?⍨∘≢⍛⊇⍨⍣{⍺≡∧⍺}
Brachylog , 5 Bytes
Probieren Sie es online!
Als ich zum ersten Mal die Brachylog-Antwort von ais523 sah (im Gegensatz zu seiner Jelly-Antwort, denn wenn ich mich nicht irre, war user62131 auch er), fragte ich mich, was passiert, wenn Backtracking anstelle von Rekursion verwendet wird? Also versuchte ich es zuerst
ṣ≤₁
. Es stellt sich heraus, dass das Shuffle-Prädikatṣ
nicht rückverfolgt werden kann, da die zufällige Auswahl von etwas weniger mehrere Ausgaben erzeugt, als dass es nur eine Ausgabe erzeugt, die nicht deterministisch ist. Wenn Sie das Glück haben, es richtig zu mischen, schlägt die Ausführung einfach fehl beim ersten versuch. Danach habe ich versuchtpṣ≤₁
, was die meiste Zeit funktioniert hat, aber da eine endlich lange Liste endlich viele Permutationen hat, ist sie manchmal immer noch nach dem Zufallsprinzip gescheitert. Nachdem ich das Ziel der Längenreduzierung aufgegeben hatte, kam ich zu folgendem Schluss:(Demonstration der Zufälligkeit)
Obwohl es tatsächlich etwas kürzer sein kann, wenn wir uns mit I / O ein paar Freiheiten nehmen ...
Brachylog , 4 Bytes
Probieren Sie es online!
Damit die Ausgabe nützlich ist, darf die Eingabe keine doppelten Elemente enthalten, da dieses falsche Prädikat zusätzlich zur Sortierung der Eingabe eine zufällige Anzahl doppelter Elemente und Nullen hinzufügt. (Hypothetisch könnte es alles ergänzen, aber es tut es einfach nicht.) Normalerweise würde ich nicht die Mühe machen, etwas zu erwähnen, das nicht richtig funktioniert, aber ich denke, es ist im Geiste der Herausforderung.
quelle
Perl 6 , 28 Bytes
Probieren Sie es online!
Anonymer Codeblock, der die Liste mischt, bis sie sortiert ist. Beachten Sie, dass die Liste mindestens einmal sortiert wird, was zulässig ist. Und nein, das
{.pick(*)}
kann man nicht ersetzen*.pick(*)
quelle
Pyth , 11 Bytes
Ziemlich zufrieden damit, kann wahrscheinlich ein bisschen mehr golfen werden
Erläuterung
Probieren Sie es online!
quelle
Japt ,
119 BytesVersuch es
quelle
C (203 Zeichen, keine Eingabeschleife: nur die Funk)
Dies ist dasselbe wie im Folgenden, wo wir auch das Array von stdin lesen und das sortierte Array ausschreiben. Da hat der Q nach der Funktion gefragt und nicht ein ganzes Programm ...
C (296 Zeichen)
Das Kompilieren kann eine Warnung geben (implizite Deklarationen). Beschränkung der Größe des hartcodierten Arrays auf 999 Elemente. Zerbrechlich.
Wenn es nicht erforderlich ist, vorab zu prüfen, ob das Array sortiert ist, kann dies in 284 erfolgen.
C (251 Zeichen, war 284)
(Verwenden von Globalen anstelle von Funktionsargumenten).
quelle