Hier ist ein Programmierpuzzle für Sie:
Wenn Sie beispielsweise eine Liste mit Paaren von Zeichenfolgen und entsprechenden Zahlen angeben, [[A,37],[B,27],[C,21],[D,11],[E,10],[F,9],[G,3],[H,2]]
geben Sie eine weitere Liste aus, die nur die Zeichenfolgen enthält:
Die Gesamtanzahl aller Zeichenfolgen sollte genau der entsprechenden Anzahl in den Eingabedaten entsprechen.
In der Sequenz sollte keine Zeichenfolge nebeneinander wiederholt werden, und jede Zeichenfolge sollte in der Ausgabeliste angezeigt werden.
Die Auswahl der nächsten Zeichenfolge sollte nach dem Zufallsprinzip erfolgen, sofern nicht mehr als zwei Regeln verletzt werden. Jede Lösung sollte mit einer Wahrscheinlichkeit ungleich Null ausgewählt werden.
Wenn keine Kombination möglich ist, sollte die Ausgabe gerade sein
0
.
Die Eingabeliste kann in beliebiger Reihenfolge (sortiert oder unsortiert) angegeben werden, und die Zeichenfolgen in der Liste können beliebig lang sein.
Sample Output für den obigen Sample Input 1
[A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,B,A,C,A,C,A,C,A,C,A,C,A,C,A,C,A,C,A,C,A,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,D,C,E,F,E,F,E,F,E,F,E,F,E,F,E,F,E,F,E,F,E,G,H,G,H,G]
Eingabebeispiel 2:
[[A,6],[B,1],[C,1]]
Ausgang für zweiten Eingang:
0
da keine liste nach regeln möglich.
Beispieleingang 3:
[[AC,3],[BD,2]]
gültige Ausgabe: [AC,BD,AC,BD,AC]
ungültige Ausgabe: [AC,BD,AC,AC,BD]
Wenn weitere Klarstellungen erforderlich sind, zögern Sie bitte nicht, mich in den Kommentaren darauf hinzuweisen, und ich werde unverzüglich entsprechend handeln.
Das ist Code-Golf , also gewinnt der kürzeste Code in Bytes für jede Sprache!
Antworten:
Gelee , 11 Bytes
Probieren Sie es online!
quelle
Œṙ
nicht vektorisieren würde es funktionieren ohne'
Gelee , 17 Bytes
Probieren Sie es online!
quelle
["A", 100], ["B", 3]
, gibt es nichts aus, ich denke es steckt fest.Œ!
9902900716486180407546715254581773349090165822114492483005280554699876684168416223214144107107388353826535163859772920932228821344151498915840000000000000000.O(n!)
aber kurz und Geschwindigkeit spielt keine Rolle. Versuchen Sie es nicht mit etwas, bei dem die Zahlen mehr als etwa 6-8 ergeben: PŒṙ
helfen?["AT", 3], ["B", 3]
und dieTBATATBAB
als Ausgabe falsch sindPython 2 ,
114189185174 BytesProbieren Sie es online!
Autsch! Viel schwieriger mit Regel 3 ... :). Ich versuche immer noch, das zu vermeiden
O(n!)
Ansatz , damit er alle Testfälle irgendwann vor dem Hitzetod des Universums bewältigen kann ...Algorithmus: Angenommen, die Gesamtsumme der Zeichenfolgenanzahl ist
t
. Wenn eine beliebige Zeichenfolge eine Zählung hatn
mit2*n>t+1
, dann ist es nicht möglich , die Auflagen zu erfüllen. Deshalb, wenn eine beliebige Zeichenfolge ( mit Ausnahme der zuvor Auserwählte) Zahl hatn
mit2*n=t+1
, dann müssen wir als nächstes die Zeichenfolge wählen. Andernfalls können wir zufällig eine beliebige Zeichenfolge auswählen, die nicht die zuvor ausgewählte Zeichenfolge ist.quelle
R ,
148141 BytesProbieren Sie es online! (Ich habe es kopiert
combinat::permn
und genanntcombinatXXpermn
dort .)Brute Force O (n!) Lösung.
Verwendet
permn
aus demcombinat
Paket, um alle möglichen Bestellungen zu generieren. Überprüfen Sie dann, ob die Regeln eingehalten werden, und wählen Sie eine davon nach dem Zufallsprinzip aus.quelle
n<-sum(n|1)
ist ein Byte kürzer, glaube ich. Aber die Eigenheitsample
einer Eingabe mit der Länge eins ist hier ziemlich frustrierend.JavaScript, 112 Bytes
Beim ersten Durchgang folgt (hoffentlich) noch mehr Golf.
Probieren Sie es online aus
quelle
J
6053 Bytes-7 danke an FrownyFrog
Original
ungolfed
Verbesserungsvorschläge willkommen.
Probieren Sie es online!
quelle
[:*/2~:/\|:
ist zwei kürzerJavaScript (ES6), 160 Byte
Probieren Sie es online!
quelle
Holzkohle , 38 Bytes
Probieren Sie es online!Link ist eine ausführliche Version des Codes. Erläuterung:
Wiederholen, solange mindestens eine Zählung ungleich Null vorliegt.
Finden Sie eine Zahl, die mehr als die Hälfte des Restes ausmacht.
Wenn es keinen gab, nehmen Sie einfach die früher gefilterten Zählungen ungleich Null.
Filtern Sie den zuletzt ausgegebenen String heraus.
Ordnen Sie der letzten Ausgabezeichenfolge ein zufälliges Element aus der ersten nicht leeren der beiden obigen Listen zu. Beachten Sie, dass das Programm an dieser Stelle abstürzt, wenn eine unmögliche Kombination eingegeben wird.
Drucken Sie die Zeichenfolge.
Verringern Sie die Anzahl.
quelle
["h4x0r", 1337]
als Zeichenfolge eingeschlossen.Ruby , 85 Bytes
Der Brute-Force-Ansatz (danke Jonah für die Idee).
Probieren Sie es online!
Rubin ,
108 10096 BytesBisher der Bogosort-Ansatz
Probieren Sie es online!
quelle
Rust 633 Bytes
Was dies ein wenig anders macht als die anderen, ist die Idee, die Strings durch Simulation eines physikalischen Systems neu anzuordnen. Jede Zeichenfolge wird zuerst die entsprechende Anzahl von Malen dupliziert. Dann wird jede einzelne Zeichenfolge als ein Teil in einem Raum behandelt. Zwei Partikel mit demselben String-Wert "stoßen" sich gegenseitig ab, während sich zwei Partikel mit unterschiedlichen Werten gegenseitig anziehen. Wenn wir zum Beispiel mit AAAAAAABBBBCC beginnen, hebt sich das As gegenseitig auf, entfernt sich voneinander und ermöglicht den Bs, sich zwischen ihnen zu bewegen. Mit der Zeit entsteht eine schöne Partikelmischung. Nach jeder Iteration der 'Partikelbewegung' prüft das Programm, ob keine Partikel nebeneinander liegen, stoppt und gibt den Status des Systems aus, bei dem es sich einfach um die Liste der Zeichenfolgen in der angegebenen Reihenfolge handelt, wie sie im eindimensionalen Raum erscheinen.
Wenn es nun darum geht, dieses physikalische System tatsächlich zu implementieren, wurde zunächst die altmodische PC-Demo / Spieltechnik verwendet, um die Position und Geschwindigkeit der einzelnen Partikel als Zahlen zu speichern und dann durch Iterationen zu aktualisieren, um Position und Geschwindigkeit zu aktualisieren. Bei jeder Iteration addieren wir Geschwindigkeit zu Position (Bewegung) und Beschleunigung zu Geschwindigkeit (Änderung der Bewegungsrate) und berechnen die Beschleunigung (Ermittlung der Kraft auf das Teilchen). Zur Vereinfachung berechnet das System nicht die Kraft auf jedes Partikel basierend auf allen anderen Partikeln, sondern überprüft nur die Partikel, die unmittelbar benachbart sind. Es gab auch einen "Dämpfungseffekt", damit Partikel nicht zu stark beschleunigen und ins Unendliche fliegen (Geschwindigkeit wird zum Beispiel bei jedem Schritt um x Prozent verringert).
Durch den Prozess des Golfspiels wurde das Ganze jedoch drastisch reduziert und vereinfacht. Jetzt "teleportieren" sie sich einfach, anstatt dass zwei Teilchen sich gegenseitig abstoßen. Verschiedene Partikel "scooten" einfach ein bisschen, um Stagnation im System zu verhindern. Wenn beispielsweise A neben A steht, wird es teleportiert. Wenn A neben B steht, verschiebt es sich nur geringfügig. Anschließend wird geprüft, ob die Bedingungen erfüllt sind (keine ähnlichen Partikel nebeneinander), und die Zeichenfolgen werden in der Reihenfolge gedruckt, basierend auf ihrer Position im 1-d-Raum. Es ist fast eher ein Sortieralgorithmus als eine Simulation - andererseits könnte man Sortieralgorithmen als eine Form des simulierten "Driftens" auf der Basis von "Masse" sehen. Ich schweife ab.
Wie auch immer, dies ist eines meiner ersten Rust-Programme, also habe ich nach einigen Stunden Golfspielen aufgegeben, obwohl es dort immer noch Gelegenheiten geben könnte. Das Parsing-Bit ist schwierig für mich. Es liest die Eingabezeichenfolge von der Standardeingabe. Falls gewünscht, könnte dies durch "let mut s =" [[A, 3], [B, 2]] "ersetzt werden. Aber im Moment mache ich ein Echo [[A, 3], [B, 2]] cargo run 'in der Kommandozeile.
Die Berechnung des Anhaltens ist ein kleines Problem. Wie kann festgestellt werden, ob ein gültiger Status des Systems niemals erreicht wird? Der erste Plan bestand darin, festzustellen, ob der 'aktuelle' Zustand jemals einen alten Zustand wiederholt hat, beispielsweise wenn sich ACCC in CACC ändert, aber dann wieder in ACCC, wissen wir, dass das Programm niemals beendet wird, da es nur pseudozufällig ist. Es sollte dann aufgeben und 0 ausgeben, wenn das passiert ist. Dies schien jedoch eine enorme Menge an Rust-Code zu sein. Stattdessen entschied ich, dass es wahrscheinlich hängen bleibt und niemals einen stabilen Zustand erreichen wird, wenn es eine große Anzahl von Iterationen durchläuft. Daher gibt es 0 aus und stoppt. Wie viele? Die Anzahl der Partikel im Quadrat.
Code:
quelle
regex
Kiste verfügt.JavaScript (Node.js) , 249 Byte
Probieren Sie es online!
quelle
Java (JDK 10) , 191 Byte
Probieren Sie es online!
Dies kehrt niemals zurück, wenn es keine Lösungen gibt.
quelle