Über die Serie
Zunächst einmal können Sie dies wie jede andere Code-Golf-Herausforderung behandeln und beantworten, ohne sich Gedanken über die Serie zu machen. Es gibt jedoch eine Rangliste für alle Herausforderungen. Sie finden die Rangliste zusammen mit einigen weiteren Informationen über die Serie im ersten Beitrag .
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 4: Das Bertrand-Paradoxon
Das Bertrand-Paradoxon ist ein interessantes Problem, das zeigt, wie verschiedene Methoden zum Auswählen zufälliger Akkorde in einem Kreis unterschiedliche Verteilungen von Akkorden, deren Mittelpunkten und Längen ergeben können.
In dieser Herausforderung sollst du zufällige Akkorde des Einheitskreises mit der "richtigen" Methode erzeugen, dh mit einer Verteilung der Akkorde, die unter Skalierung und Übersetzung unveränderlich ist. In dem verlinkten Wikipedia-Artikel ist "Methode 2" eine solche Methode.
Hier sind die genauen Regeln:
- Sie sollten eine positive Ganzzahl verwenden,
N
die angibt, wie viele Akkorde zurückgegeben werden sollen. Die Ausgabe sollte eine Liste vonN
Akkorden sein, die jeweils als zwei Punkte auf dem Einheitskreis angegeben sind und durch ihren Polarwinkel im Bogenmaß angegeben werden. - Ihr Code sollte mindestens 2 20 verschiedene Werte für jeden der beiden Winkel zurückgeben können . Wenn Ihr verfügbares RNG eine geringere Reichweite hat, müssen Sie entweder zuerst ein RNG mit einer ausreichend großen Reichweite über dem eingebauten aufbauen oder Sie müssen Ihr eigenes geeignetes RNG implementieren . Diese Seite kann hilfreich sein.
- Die Verteilung der Akkorde muss nicht von der Verteilung nach "Methode 2" im verlinkten Wikipedia-Artikel zu unterscheiden sein. Wenn Sie einen anderen Algorithmus zur Auswahl von Akkorden verwenden, legen Sie bitte einen Korrektheitsnachweis bei. Unabhängig davon, welchen Algorithmus Sie implementieren, muss er theoretisch in der Lage sein, einen gültigen Akkord im Einheitskreis zu generieren (abgesehen von Einschränkungen des zugrunde liegenden PRNG- oder Datentyps mit begrenzter Genauigkeit).
- Ihre Implementierung sollte entweder Gleitkommazahlen (mindestens 32 Bit breit) oder Festkommazahlen (mindestens 24 Bit breit) verwenden und zurückgeben, und alle arithmetischen Operationen sollten innerhalb von höchstens 16 ulp genau sein .
Sie können ein vollständiges Programm oder eine Funktion schreiben und Eingaben über STDIN (oder die nächstgelegene Alternative), ein Befehlszeilenargument oder ein Funktionsargument vornehmen und Ausgaben über STDOUT (oder die nächstgelegene Alternative), einen Funktionsrückgabewert oder einen Funktionsparameter (out) erzeugen.
Die Ausgabe kann in einem beliebigen Listen- oder Zeichenfolgeformat erfolgen, sofern die einzelnen Zahlen klar voneinander zu unterscheiden sind und ihre Gesamtzahl immer gerade ist.
Dies ist Codegolf, daher gewinnt die kürzeste Übermittlung (in Bytes). Und natürlich wird die kürzeste Einreichung pro Benutzer auch in die Gesamt-Bestenliste der Serie aufgenommen.
Visualisierung
Sie können das folgende Snippet verwenden, um die generierten Linien zu rendern und ihre Verteilung zu überprüfen. Fügen Sie einfach eine Liste von Winkelpaaren in den Textbereich ein. Das Snippet sollte mit fast jedem Listenformat umgehen können, solange die Zahlen einfache Dezimalzahlen sind (keine wissenschaftliche Notation). Ich empfehle Ihnen, mindestens 1000 Zeilen zu verwenden, um eine gute Vorstellung von der Verteilung zu erhalten. Ich habe auch einige Beispieldaten für die verschiedenen Methoden bereitgestellt, die im folgenden Artikel vorgestellt werden.
Beispieldaten, die mit Methode 1 generiert wurden.
Beispieldaten, die mit Methode 2 generiert wurden .
Beispieldaten, die mit Methode 3 generiert wurden.
Bestenliste
Der erste Beitrag der Serie generiert eine Rangliste.
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. Ich füge möglicherweise in Zukunft eine Bestenliste nach Sprachen hinzu.)
Pyth,
252322 BytesEine Portierung der C ++ 11-Antwort von rcrmn. Dies ist meine erste Verwendung von Pyth, und ich hatte viel Spaß!
23-Byte-Version:
Schneiden Sie ein Byte aus, indem Sie das Programm so ändern, dass es Falten + Summen verwendet, und setzen Sie J auf ein Tupel, indem Sie K entfernen.
Original:
Schneiden Sie 2 Bytes dank @orlp ab.
Erläuterung:
quelle
*2_
ist das gleiche wiey_
. Die VariableZ
ist anfangs 0, sodass Sie das Leerzeichen.tO0 4
durch Schreiben entfernen können.tOZ4
.,+JK-JK
y
und habe es vergessenZ
. Fest; Vielen Dank!Julia, 48 Bytes
Dies verwendet den Algorithmus der Methode 2, wie die meisten bisherigen Antworten. Es erstellt eine Lambda-Funktion, die eine Ganzzahleingabe akzeptiert und ein nx 2-Array zurückgibt. Um es zu nennen, geben Sie ihm einen Namen, z
f=n->...
.Ungolfed + Erklärung:
Mir gefällt wirklich, wie die Visualisierungen aussehen, also werde ich eine einfügen. Es ist das Ergebnis von
f(1000)
.quelle
Pyth, 22 Bytes
Ein Port der C ++ Antwort.
Ich hatte noch eine 23-Byte-Lösung(jetzt 22!), Aber es war fast eine Kopie von @ kirbyfan64sos 'Pyth-Antwort mit Optimierungen, also musste ich ein wenig über den Tellerrand hinaus denken und kreativ (ab) den Fold-Operator verwenden.Beachten Sie, dass dies derzeit aufgrund eines Fehlers im Fold-Operator nach der Einführung von nicht funktioniert
reduce2
. Ich stelle eine Pull-Anfrage.Aus Referenzgründen war dies meine andere Lösung, die auf die gleiche Weise funktioniert:
VQKy*.nZOZJ.tOZ4,+KJ-KJ
quelle
IDL, 65 Bytes
Offensichtlich ist dies derselbe Algorithmus wie @rcrmn, obwohl ich ihn unabhängig abgeleitet habe, bevor ich ihre Antwort gelesen habe.
Die IDL-Zufallsfunktion verwendet den Mersenne-Twister mit einer Periode von 2 19937 -1.
BEARBEITEN: Ich habe 1000 Akkorde über den obigen Visualizer gespielt. Hier ist ein Screenshot des Ergebnisses:
quelle
C ++ 11, 214 Bytes
Dies ist also eine direkte Implementierung des richtigen Algorithmus von der Wikipedia-Seite. Das Hauptproblem beim Golfen sind die ach so verdammt langen Namen, die die Klassen der Zufallsgeneratoren haben. Aber im Gegensatz zum guten alten Rand ist es zumindest richtig gleichmäßig.
Erläuterung:
quelle
M_PI_2
sieht verdächtig aus. Ich denke, es sollte stattdessen 1 sein.APL, 46 Bytes
Mein erstes APL-Programm überhaupt! Sicherlich kann es stark verbessert werden (da mein allgemeines Verständnis von APL fehlt), also wären alle Vorschläge fantastisch. Dadurch wird eine Funktion erstellt,
f
die eine Ganzzahl als Eingabe verwendet, die Akkordpunktpaare nach Methode 2 berechnet und jedes Paar durch eine neue Linie getrennt ausgibt.Sie können es online ausprobieren !
Erläuterung:
Hinweis: Meine vorherige 19-Byte-Lösung war ungültig, da sie (x, y) und nicht (x + y, xy) zurückgab. Traurigkeit gibt es zuhauf.
quelle
Java, 114 Bytes
Grundlegende Implementierung in Java. Verwendung als Lambda-Ausdruck.
Anwendungsbeispiel
quelle
Math
irgendwo aufbewahren? Oder so? (Ich bin kein Java-Programmierer)Math
Shows zu reduzieren . Was sagt das Meta über die Verwendung eines Codes zur Generierung eines anderen Codes zur Behebung des Problems?Ruby, 72 Bytes
Mein erster Golf hier! Ich habe den gleichen Code wie alle anderen benutzt, ich hoffe das ist okay
quelle
Java, 115
123Dies ist im Grunde das gleiche wie bei den meisten anderen, aber ich benötige einen Java-Score für dieses Loch.
1000 Beispielakkorde sind im Pastebin zu finden , hier sind die ersten fünf aus einem Lauf:
quelle
CJam,
2422 BytesÄhnlich wie bei anderen Algorithmen ist hier eine Version in CJam.
Eine Eingabe von 1000 ergibt eine Verteilung wie:
Wie es funktioniert
Der Algorithmus ist einfach
x = 2 * Pi * rand(); print [x, x + 2 * acos(rand())]
Aktualisieren : 2 Bytes gespart dank Martin!
Probieren Sie es hier aus
quelle
Python 3,
144117 Bytes(Danke an Blckknght für das
lambda
Zeiger)Verwenden Sie die gleiche Methode wie andere:
Aus der Python-Dokumentation:
Ausgabe
Und so weiter.
Visualisierung
quelle
f=lambda n:[(x,x+2*m.acos(r()))for x in(2*m.pi*r()for _ in range(n))]
Perl, 60
quelle
R,
60565349 BytesWeitere 4 Bytes dank @JayCe und der Umwandlung in eine Funktion.
Verwenden Sie die gleiche Grundformel wie die anderen. R verwendet standardmäßig die Mersenne-Twister-Methode, andere können jedoch festgelegt werden. Gibt eine durch Leerzeichen getrennte Liste aus.
Probieren Sie es online!
quelle
SmileBASIC, 62 Bytes
quelle