Ihre Aufgabe hier ist es, eine Funktion 1 zu implementieren , die eine Permutation auf die positiven Ganzzahlen bildet (eine Bijektion von den positiven Ganzzahlen auf sich selbst). Dies bedeutet, dass jede positive Ganzzahl in der Permutation genau einmal vorkommen sollte. Der Haken ist, dass Ihre Funktion eine größere Wahrscheinlichkeit haben sollte, eine ungerade Zahl als eine gerade Zahl auszugeben.
Nun mag dies seltsam oder unmöglich erscheinen. Sicher gibt es genauso viele ungerade Zahlen wie gerade Zahlen? Und während diese Intuition für endliche Mengen korrekt ist, gilt sie tatsächlich nicht für unendliche Mengen. Nehmen Sie zum Beispiel die folgende Permutation:
1 3 2 5 7 4 9 11 6 13 15 8 17 19 10 21 23 12 25 27 14 29 31 16 33 35 18 37 39 20 41 43 22 45 47 24 49 51 26 53 55 ...
Wenn Sie einen Unterabschnitt der Sequenz mit einer Größe größer als Sie mindestens so viele ungerade Zahlen wie gerade Zahlen haben, so dass die Wahrscheinlichkeit, dass ein zufälliger Ausdruck ungerade ist, größer ist als die Wahrscheinlichkeit, dass er gerade ist. Sie werden auch feststellen, dass jede ungerade oder gerade Zahl irgendwann in der Sequenz erscheint und nur einmal vorkommen kann. Somit ist die Sequenz eine echte Permutation.
Definition der Wahrscheinlichkeit
Um Unklarheiten oder Unklarheiten zu vermeiden, werde ich deutlich machen, was mit Wahrscheinlichkeit in dieser Frage gemeint ist.
Nehmen wir an, wir haben eine Funktion . Die Wahrscheinlichkeit, dass eine Zahl ungerade ist, wird als die Grenze des Verhältnisses ungerader Elemente der Menge zur Größe der Menge da gegen unendlich tendiert.
Zum Beispiel würde die oben erwähnte Funktion eine Wahrscheinlichkeit von haben, ungerade zu sein .
Dies ist Codegolf, daher werden die Antworten in Bytes bewertet, wobei weniger Bytes besser sind.
Zusätzliche Herausforderungen
Hier einige lustige Ideen, mit denen Sie herumspielen und vielleicht versuchen können, sie umzusetzen. Diese dienen nur zum Spaß und haben keinerlei Einfluss auf die Wertung. Einige davon sind nicht einmal gültige Lösungen für diese Herausforderung, und eine Antwort, die nur Lösungen für die Herausforderungen 2 oder 3 enthält, ist keine gültige Antwort und kann gelöscht werden .
Schreiben Sie eine Permutation mit einer ungeraden Wahrscheinlichkeit von . (Das ist möglich)
Schreiben Sie eine Permutation mit mehr ungeraden als geraden Zahlen in für jedes aber einer ungeraden Wahrscheinlichkeit von .
Schreiben Sie eine Permutation ohne definierte Wahrscheinlichkeit (dh es gibt kein Limit).
1: Funktion bedeutet hier Programm oder Funktion. Es ist nur ein Teil des Codes, der Eingaben entgegennimmt und Ausgaben erzeugt.
Schale ,
11 bis10 Bytes-1 Byte dank Leo und einer etwas anderen Funktion
Dies hat eine merkwürdige Wahrscheinlichkeit von
1
Probieren Sie es online!
Es indiziert die Sequenz:
Erläuterung
quelle
Haskell,
353432 BytesImplementiert die Beispielsequenz
[1,3,2,5,7,4,9,11,6,13,15,8,17,19,10,21,...]
.Probieren Sie es online!
Als Referenz: alte Version, 34 Bytes (-1 Bytes dank @xnor):
Probieren Sie es online!
quelle
(!!)$do ...
Schale , 8 Bytes
Probieren Sie es online!
Dies implementiert die Beispielsequenz (
1,3,2,5,7,4...
).Erläuterung
quelle
Jeder macht Challenge 1, also machen wir die anderen beiden.
Perl 6 , 26 Bytes - Herausforderung 2
Probieren Sie es online!
Es ist nur
1 3 2 5 4 7 6...
in einer geraden Anzahl von Begriffen, gibt es immer 2 mehr ungerade Zahlen als gerade. In einer ungeraden Zahl 1 mehr. Dies hat jedoch eindeutig Grenzen(n+2)/(2n+2) -> ½
.Perl 6 , 70 Bytes - Herausforderung 3
Probieren Sie es online!
Zugegeben, das ist schrecklich golfen. Es indiziert eine Sequenz, die 2⁰ ungerade Zahlen, dann 2¹ gerade, dann 2² ungerade, dann 2³ gerade usw. enthält.
Die Wahrscheinlichkeit nach n solcher "Blöcke" ist (2 n + 2² + 2⁴ + ... + 2ⁿ⁻¹) / (2ⁿ-1), wenn n ungerade ist. Die Summe im Zähler ist gleich ⅓ (4 ½ (n + 1) - 1) = ⅓ (2 n + 1 - 1). Die Wahrscheinlichkeit nach einer ungeraden Anzahl von Blöcken ist also ⅔ (in der Grenze).
Wenn wir einen weiteren Block hinzufügen (und eine gerade Anzahl von ihnen n + 1 anschlagen), haben wir jedoch keine ungeraden Zahlen hinzugefügt (Zähler bleibt gleich), aber es gibt jetzt insgesamt (2 n + 1 - 1) Zahlen . Die Klammern löschen sich und wir erhalten die Wahrscheinlichkeit von ⅓ (im Limit).
Dies soll anscheinend 2 verschiedene Clusterpunkte haben, ⅓ und ⅔, um sicherzustellen, dass das Limit nicht existiert, aber das beweist es nicht wirklich. Mein Versuch, einen soliden, strengen Beweis zu erbringen, ist in dieser Math.SE-Antwort zu finden: https://math.stackexchange.com/a/2416990/174637 . Schlagfehler sind willkommen.
Perl 6 , 39 Bytes - Die Kernherausforderung.
Probieren Sie es online!
Obwohl ich diese Antwort aufgrund der Herausforderungen 2 und 3 gepostet habe, die ein angenehmes kleines mathematisches Rätsel boten, müssen alle Antworten eine Lösung für die Kernherausforderung enthalten. Hier ist es dann.
Dies ist die Beispielsequenz.
quelle
Brain-Flak , 120 Bytes
Probieren Sie es online!
Führt die folgende Funktion aus:
Diese Funktion generiert die Sequenz
Die Funktion hat eine ungerade Wahrscheinlichkeit von
1
quelle
R, 82 Bytes (Extra Herausforderung 1)
Probieren Sie es online!
Wenn die Eingabe ein perfektes Quadrat ist, wird eine gerade Zahl angegeben. Ansonsten ergibt sich eine ungerade Zahl. Die perfekten Quadrate haben eine natürliche Dichte von 0, was bedeutet, dass diese Folge mit Wahrscheinlichkeit 1 ungerade Zahlen ergibt.
quelle
C (gcc) , 29 Bytes
Probieren Sie es online!
Jede vierte Zahl ist gerade:
Zusätzliche Herausforderung 1, 52 Bytes
Probieren Sie es online!
Gibt 2 * (x + 1) zurück, wenn n 2 x entspricht, andernfalls ungerade aufeinanderfolgende Zahlen:
quelle
Brain-Flak ,
140138136 BytesProbieren Sie es online!
Erläuterung
Dies hat eine ähnliche Funktion wie die in der Frage vorgeschlagene.
Es funktioniert hauptsächlich auf der Grundlage eines Schnipsel, das ich erstellt habe, um den Stapel für Stapel der Größe 3 zu rollen.
Wir richten zwei Stapel ein, einen mit Akkumulatorwerten (zwei ungerade gerade) und einen mit den Zahlen
4 4 2
. Bei jeder Iteration rollen wir beide Stapel und fügen den oberen Rand des linken Stapels zum oberen Rand des rechten Stapels hinzu.Dies erhöht jede ungerade Zahl um 4 und die eine gerade Zahl um 2. Während wir durchlaufen, erhalten wir ein Muster von 2 ungeraden 1 geraden, wobei jede positive ganze Zahl getroffen wird. Also schleifen wir einfach
n
mal mitn
der Eingabe. Dies hat eine asymptotische Wahrscheinlichkeit von 2/3 .quelle
Gelee , 10 Bytes
Die Wahrscheinlichkeit einer Quote beträgt 2/3 .
Probieren Sie es online!
Wie es funktioniert
quelle
C 80 Bytes
Implementierung der Beispielpermutation aus der Frage.
Probieren Sie es online!
quelle
Batch, 36 Bytes
Implementiert die in der Frage angegebene Reihenfolge.
quelle
JavaScript, 23 Byte
Ausgabe: 1, 3, 5, 2, 7, 9, 11, 4, 13, 15, 17, 6, 19, 21, 23, 8 ...
Herausforderung 2:
Ausgabe: 1, 3, 2, 5, 4, 7, 6, 9, 8, 11, 10, 13, 12, 15, 14
quelle
n=>n%4?1.5*n|1:n/2
ist 5 Bytes kürzer.CJam (21 Bytes)
Online-Demo mit den ersten 32 Ausgängen. Dies ist ein anonymer Block (Funktion).
Dies ist auch eine Lösung, um 1 herauszufordern: Die auf gerade Zahlen abgebildeten Zahlen sind die Potenzen von 2, sodass die Dichte der geraden Zahlen in den ersten n Ausgaben lg (n) / n ist, was gegen Null tendiert.
Präparation
quelle
Perl 40 Bytes
quelle
Brain-Flueue , 88 Bytes
Probieren Sie es online!
Erläuterung
Dies implementiert die gleiche Funktion wie meine letzte Antwort , verwendet jedoch das FIFO-Modell von Brain-Flueue, um einige Ecken zu kürzen. Hier sind die ersten Begriffe, die es generiert.
Der erste Teil des Codes ist nur ein bisschen Setup, wir legen
0,-1,-3
den ersten Stapel und2,4,4
den zweiten Stapel auf. Mit dem2,4,4
werden gerade und ungerade Zahlen durchlaufen, so wie ich es in meiner Brain-Flak-Antwort getan habe.Dann wiederholen wir n-mal, wobei wir jeweils den oberen Rand des linken Stapels zum rechten Stapel addieren. Da in Brain-Flueue Warteschlangen anstelle von Stapeln verwendet werden, rollen die Werte beim Berühren auf natürliche Weise, sodass kein zusätzlicher Code erforderlich ist.
quelle
-lflueue
Argument.Python 2 ,
4610455 BytesProbieren Sie es online!
Verstehen Sie die Frage falsch, und implementieren Sie jetzt ordnungsgemäß eine Funktion, mit der eine Sequenz generiert werden kann, anstatt einer, die eine Sequenz generiert. Ebenfalls
0
aus der Reihe der möglichen Ausgaben ausgeschlossen.Die Wahrscheinlichkeit, eine ungerade positive ganze Zahl zu finden, konvergiert jetzt gegen
1
.quelle
0
.Gelee , 9 Bytes
Probieren Sie es online!
Anbaugeräte
1, 3, 2, 5, 7, 4, 9, 11, 6, ...
(Wahrscheinlichkeit 2/3).quelle
05AB1E , 11 Bytes
Probieren Sie es online!
quelle
Pyth , 9 Bytes
Probieren Sie es hier aus! oder Testen Sie mehr auf einmal!
Mit diesem Code können Sie das Verhältnis von ungeraden Zahlen bis zu einem bestimmten Punkt überprüfen. Ersetzen Sie
10000
durch Ihr gewünschtes Limit (stellen Sie es nicht viel höher ein, da es Speicherfehler gibt).Probieren Sie es hier aus .
Das obige ergibt ungefähr 0,667 . Die wahre Wahrscheinlichkeit für seltsame Vorkommnisse liegt bei 2/3 . Dieser Ansatz ist eine äquivalente Umsetzung der Antwort von Dennis .
Erläuterung
quelle
Java 8, 20 Bytes
Port of @nwellnhofs C Antwort .
Einige Dinge, die ich selbst ausprobiert habe, waren ein paar Bytes länger oder etwas falsch.
Anbaugeräte:
1,3,5,2,7,9,11,4,13,15,17,6,19,21,23,8,25,27,29,10,31,33,35,12,37,...
mit einer Wahrscheinlichkeit von
3/4
.Probieren Sie es hier aus.
quelle
Lua,
6753 BytesErklärung kommt, wenn ich damit fertig bin :)Dieses Programm verwendet eine Ganzzahl über Befehlszeilenargumente als Eingabe und gibt das n-te Element der Beispielsequenz an STDOUT aus
Erklärungen
Die geraden Zahlen dieser Folge sind sowohl die
n
gerade Zahl als auch dasn
Vielfache von 3, daher ist die Formeln%3*2
ausreichend, um sie zu erzeugen.Bei ungeraden Zahlen ist es etwas schwieriger. Basierend auf der Tatsache, dass wir sie abhängig von der Stromstärke finden können
n
, haben wir die folgende Tabelle:Nennen wir den Wert
target-n
i
, können wir sehen , dass jedes Maln%3==2
,i
erhöht wird. Da geht unsere Formel:Die ungeraden Zahlen basieren
n
auf denen wir hinzufügeni
.Der Wert von
i
Inkrementen mit der gleichen Rate wie die euklidische Division durch 3 mit einem Versatz.math.floor(n/3)
gibt uns die Rate der Zunahme undn%3-1
gibt uns den Versatz, so dass es auf geschiehtn%3==2
stattn%3==0
.quelle
...and (n/...
).and n/3*2or
genauso gut