Über die Serie
Ich werde eine kleine Reihe von Code-Golf-Herausforderungen durchführen, die sich um das Thema Zufälligkeit drehen. Dies wird im Grunde ein 9-Loch- Golfplatz sein , der sich jedoch über mehrere Fragen erstreckt. Sie können an jeder Herausforderung einzeln teilnehmen, als wäre es eine normale Frage.
Ich werde jedoch über alle Herausforderungen hinweg eine Rangliste führen. Die Serie wird (vorerst) über 9 Herausforderungen laufen, die alle paar Tage veröffentlicht werden. Jeder Benutzer, der an allen 9 Herausforderungen teilnimmt, hat Anspruch auf den Gewinn der gesamten Serie. Ihre Gesamtpunktzahl ist die Summe ihrer kürzesten Einsendungen bei jeder Herausforderung. Wenn Sie also zweimal auf eine Herausforderung antworten, wird nur die bessere Antwort für die Punktzahl gewertet. Wenn jemand 28 Tage lang den ersten Platz in dieser Rangliste belegt, werde ich ihm eine Prämie von 500 Wiederholungen gewähren .
Obwohl ich eine Menge Ideen für die Serie habe, sind die zukünftigen Herausforderungen noch nicht in Stein gemeißelt. Wenn Sie Vorschläge haben, teilen Sie mir dies bitte auf dem entsprechenden Sandbox-Post mit .
Loch 1: Mische ein Array
Die erste Aufgabe ist ziemlich einfach: Wenn Sie ein nicht leeres Array von Ganzzahlen haben, mischen Sie es nach dem Zufallsprinzip. Es gibt jedoch ein paar Regeln:
- Jede mögliche Permutation muss mit der gleichen Wahrscheinlichkeit zurückgeführt werden (so die Shuffle eine gleichmäßige Verteilung haben soll). Sie können überprüfen, ob Ihr Algorithmus einheitlich / unparteiisch ist, indem Sie ihn in JavaScript auf Will it Shuffle implementieren. Dadurch wird eine Matrix der Verzerrungen erstellt. Das Ergebnis sollte so einheitlich aussehen wie die eingebauten Fisher-Yates oder die Sortierung (zufällige Reihenfolge) .
- Sie dürfen keine integrierte Methode oder Methode eines Drittanbieters verwenden, um das Array zu mischen oder eine zufällige Permutation zu generieren (oder alle Permutationen aufzulisten). Insbesondere integrierte in dem einzigen Zufallsfunktion können Sie eine einzelne Zufallszahl zu einer Zeit bekommen . Sie können davon ausgehen, dass eine integrierte Zufallszahlenmethode in O (1) ausgeführt wird und über das angeforderte Intervall vollkommen einheitlich ist (mathematisch gesehen - Sie können hier Details der Gleitkommadarstellung ignorieren). Wenn Sie in Ihrer Sprache eine Liste mit m Zufallszahlen auf einmal erhalten können, können Sie diese Funktion verwenden, vorausgesetzt, die m Zahlen sind unabhängig voneinander und Sie zählen sie als O (m).
- Ihre Implementierung darf eine zeitliche Komplexität von O (N) nicht überschreiten , wobei N die Größe des zu mischenden Arrays ist. Beispielsweise können Sie nicht nach Zufallszahlen sortieren.
- Sie können das Array entweder an Ort und Stelle mischen oder ein neues Array erstellen (in diesem Fall kann das alte Array geändert werden, wie Sie möchten).
Sie können ein vollständiges Programm oder eine Funktion schreiben und Eingaben über STDIN, Befehlszeilenargument, Funktionsargument oder Eingabeaufforderung vornehmen und Ausgaben über Rückgabewerte oder durch Drucken an STDOUT (oder die nächstgelegene Alternative) erzeugen. Wenn Sie eine Funktion schreiben, die das Array an Ort und Stelle mischt, müssen Sie sie natürlich nicht zurückgeben (vorausgesetzt, Sie können in Ihrer Sprache nach der Rückkehr der Funktion auf das geänderte Array zugreifen).
Die Ein- und Ausgabe kann in einem beliebigen Listen- oder Zeichenfolgeformat erfolgen, muss jedoch beliebige Ganzzahlen im Bereich -2 31 ≤ x <2 31 unterstützen . Grundsätzlich sollte Ihr Code für Arrays mit einer Länge von bis zu 2 31 funktionieren, obwohl dies nicht unbedingt in Ihren Speicher passen oder innerhalb eines angemessenen Zeitraums vervollständigt werden muss. (Ich möchte einfach keine willkürlichen Größenbeschränkungen für Hardcode-Schleifen oder ähnliches sehen.)
Dies ist Codegolf, daher gewinnt die kürzeste Übermittlung (in Bytes).
Bestenliste
Das folgende Snippet generiert eine Rangliste für alle Herausforderungen der Serie.
Um sicherzustellen, dass Ihre Antworten angezeigt werden, beginnen Sie jede Antwort mit einer Überschrift. Verwenden Sie dazu die folgende Markdown-Vorlage:
# Language Name, N bytes
Wo N
ist die Größe Ihres Beitrags? Wenn Sie Ihren Score zu verbessern, Sie können alte Rechnungen in der Überschrift halten, indem man sich durch das Anschlagen. Zum Beispiel:
# Ruby, <s>104</s> <s>101</s> 96 bytes
(Die Sprache wird derzeit nicht angezeigt, das Snippet erfordert sie jedoch und analysiert sie. In Zukunft werde ich möglicherweise eine Bestenliste nach Sprachen hinzufügen.)
sortby(random)
(der Grund für die zeitliche Beschränkung) oder einfach .shuffle()
(der Grund für die eingebaute Beschränkung) lautet, was meiner Meinung nach weitaus weniger klug ist, als Fisher-Yates oder eine andere zu implementieren Ansatz.
shuffle(array)
anstatt schreiben newArray=shuffle(array)
?