Aufgabe
Die Aufgabe besteht darin, ein Programm zu schreiben, das eine konsistente, aber ansonsten willkürliche positive Ganzzahl ausgibt (also streng größer als 0). Hier ist der Haken: Wenn die Quelle mal wiederholt wird (der Code wird an sich selbst angehängt / verkettet ), sollte das Programm eine -Wahrscheinlichkeit für die Ausgabe von und die verbleibende Wahrscheinlichkeit von haben der Ausgabe von unverändert.
Beispiel
Nehmen wir an, Ihre ursprüngliche Quelle ist XYZ
und erzeugt die Ganzzahl 3
. Dann:
Für : sollte auch mit einer Wahrscheinlichkeit von (50% der Zeit) und mit einer Wahrscheinlichkeit von ausgegeben werden (50 % der ganzen Zeit).
XYZXYZ
Für : sollte mit einer Wahrscheinlichkeit von (66,666% der Zeit) und mit einer Wahrscheinlichkeit von (33,333% der Zeit) ausgegeben werden die Zeit)
XYZXYZXYZ
Für : sollte mit einer Wahrscheinlichkeit von (75% der Zeit) und mit einer Wahrscheinlichkeit von (25% der Zeit) ausgegeben werden die Zeit)
XYZXYZXYZXYZ
und so weiter....
Regeln
Sie müssen ein vollständiges Programm erstellen . Die Ausgabe muss auf STDOUT gedruckt werden.
Ihr Programm sollte theoretisch jeden möglichen Wert mit den oben angegebenen Wahrscheinlichkeiten ausgeben. Eine geringfügige Abweichung hiervon aufgrund der Implementierung von random ist jedoch in Ordnung ( vorausgesetzt, die Implementierung weist keine andere Verteilung auf - Sie können a nicht verwenden Normalverteilung, um Bytes zu sparen ) .
Das Programm sollte (theoretisch) für einen beliebig großen Wert von funktionieren , aber technische Einschränkungen aufgrund der Genauigkeit sind für große Ordnung .
Die Ausgabe muss in der Basis 10 erfolgen (die Ausgabe in einer anderen Basis oder mit wissenschaftlicher Notation ist verboten). Nachgestellte / führende Leerzeichen und führende Nullen sind zulässig.
Die ursprüngliche Quelle muss (natürlich) mindestens 1 Byte lang sein. Sie dürfen keinen Zeilenumbruch zwischen Kopien Ihrer Quelle annehmen. Das Programm sollte keine Eingaben annehmen (oder eine unbenutzte, leere Eingabe haben).
Dies ist Codegolf , daher ist die Punktzahl einer Antwort die Länge der (ursprünglichen) Quelle in Bytes, wobei eine niedrigere Punktzahl besser ist.
Anmerkung: Diese Herausforderung ist eine (viel) schwierigere Version von dieser .
quelle
Antworten:
R ,
6635 Bytes-29 Bytes dank digEmAll .
-2 Bytes dank Giuseppe .
Probieren Sie es online!
Überprüfen Sie die Verteilung auf N = 4.
Der Schlüssel ist die rechte ZuordnungN - mal, wobei die erste N- 1 Anruf
->
. Wenn der Code multipliziert wird ,sample
zugewiesen wirdA
, und nur der letzte Anruf wird gedruckt.Originelle, komplexere Lösung:
R , 66 Bytes
Probieren Sie es online!
Probieren Sie es online aus (3-mal wiederholt)!
Verwendet zwei Tricks: 1) Rufe die Hauptfunktion von Interesse auf
?
, damit wir sie aufrufen können, ohne das Programm mit einer Klammer zu beenden, und 2) verwende VariablenT
undTT
mit Code, der mit beginntT
und mit endet?T
.F
ist der Iterationszähler.?
neu definiert als eine Funktion , die ein Booleschen Argument: wenn der Eingang von?
istTRUE
(oderT
), hat es die erforderlichen Stichproben; Wenn die EingabeFALSE
(oder0
) ist, wird nichts ausgeführt. Der Wert vonTT
ist definiert als0
, damit?T
die Abtastung aber?TT
nichts tut.Wenn die Quelle wiederholt wird, sieht es so aus:
Der mittlere Aufruf
?TT
gibt also nichts aus, als der letzte Aufruf?T
gibt das zufällige Ergebnis aus.quelle
->
Code-Golf in einer Situation gesehen habe, in der<-
das nicht möglich war. Das ist so cool!!Python 3 ,
8179 BytesProbieren Sie es online!
-1 Byte dank @Nishioka
Dies ist eine Python 3-Lösung, die nicht direkt auf die Programmquelle zugreift. Dies in Python 3 zu tun, ist schwieriger als in Python 2, da normale Druckanweisungen mit einer schließenden Klammer enden, sodass es nicht viele Möglichkeiten gibt, das Verhalten im nächsten Block der ursprünglichen Quelle zu ändern. Es wäre interessant, kreativere Lösungen in Python 3 zu sehen.
quelle
+0 if[]else 1
Bash , 31 Bytes
Probieren Sie es online!
trap ... 0
Führt den Code aus, der beim Beenden enthalten ist. Wiederholtestrap
s überschreibt alte. Das nicht zitierte Objekt$[arithmetic expansion]
wird jedes Mal ausgeführt, wenn eine neue Falle gesetzt wird.Zsh kann ein Byte speichern mit
<<<
:quelle
Gelee , 7 Bytes
Probieren Sie es online!
quelle
05AB1E , 7 Bytes
Probieren Sie es online!
quelle
Python 3 ,
787675 BytesUnter Verwendung des gleichen Trick wie bei der Verbindung , die gebucht wurde, ist hier ein Python ein (mit x = 1).
Probieren Sie es online!
-2 Bytes danke an Herrn Xcoder für seine
(n-1)
Formel,~-n
die*
dank Nishioka eine höhere Priorität hat als -1 Bytes
quelle
import random;n=len(*open(__file__))//76;print(1+~-n*(random.random()<1/n))#
sollte für -2 Bytesrandom()<1/n
;-)Dyalog APL,
2524232221 BytesProbieren Sie es online!
quelle
Gaia ,
17151413 BytesProbieren Sie es online!
Ich habe zufällig das Verhalten von
Øg
gestern bemerkt, als ich in den Dokumenten nachgesehen habe, was immens geholfen hat.quelle
Perl 5,
2826 Bytes-2 Bytes dank @Grimy
TIO
quelle
1 if!++$x;say 1<rand$x||$x
Ruby , 40 Bytes
Probieren Sie es online!
Probieren Sie es online aus (3-mal kopiert)!
Eine rubinrote Portierung dieser Python-Antwort .
Ruby , 38 Bytes
2 Bytes beim Lesen der Datei gespeichert:
Probieren Sie es online!
quelle
Runenverzauberungen , 31 Bytes
Probieren Sie es online!
Verwendet dieselbe Struktur wie diese Antwort, um zu zählen, wie oft die Quelle dupliziert wurde:
Anstatt nur die n-te Zahl in einer Liste auszugeben, verwenden wir diesen Wert, um zufällig eine Zahl zu generieren. Wenn das Ergebnis nicht 0 ist, geben Sie 1 aus, andernfalls geben Sie diese Zahl aus.
quelle
Japt ,
98 BytesTesten Sie es | Verdoppelt | Verdreifacht
Überprüfen Sie die Verteilung von 10000 Läufen nach 10 Wiederholungen
Original,
1311109 BytesNotieren Sie sich den hinteren Raum.
Testen Sie es | Verdoppelt | Verdreifacht
Überprüfen Sie die Verteilung von 10000 Läufen nach 10 Wiederholungen
quelle
JavaScript ( JavaScript-Shell 71 ), 78 Byte
Kein tio Link, Spidermonkey auf tio ist zu alt ...
Firefox (Spidermonkey) betrachtet den Kommentar als Teil der Funktion
f
. Als Ergebnis(''+f).length
wird ,b+79n
wenn b <78, und (n + 1) die Zeiten des Quellcodes wiederholt.Dieser Fehler ( ich bin mir nicht sicher. Ich würde es vorziehen, wenn es sich um einen Fehler in der JavaScript-Spezifikation handelt, anstatt um einen Interpreter ) wurde von einer anderen Person direkt nach dem Absenden dieser Antwort an BMO gesendet: https://bugzilla.mozilla.org/ show_bug.cgi? id = 1579792 . (Weder der BMO Faden noch die tweet ist von mir geschrieben.)
quelle
(async x=>x)()
? Warum ist es async?async
hronous. So ist der Rückrufx=>f(...)
wird aufgerufen, nachdem Funktionf
definiert.C # (Visual C # Interactive Compiler) ,
133114112 ByteDies ist das erste (und hoffentlich letztes) Mal, dass ich C # Präprozessordirektiven verwendet habe.
Probieren Sie es online!
quelle
Kohle , 12 Bytes
Probieren Sie es online! Basierend auf meiner Antwort auf die verknüpfte Frage. Ansonsten
n
mit Wahrscheinlichkeit¹/ₙ
ausgeben1
. Erläuterung:quelle