Ich multipliziere die Quelle, du multiplizierst (wahrscheinlich) die Ausgabe!

18

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.xNN-11NNxN-1Nx

Beispiel

Nehmen wir an, Ihre ursprüngliche Quelle ist XYZund 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).N=2XYZXYZ31223=612

  • Für : sollte mit einer Wahrscheinlichkeit von (66,666% der Zeit) und mit einer Wahrscheinlichkeit von (33,333% der Zeit) ausgegeben werden die Zeit)N=3XYZXYZXYZ32333=913

  • Für : sollte mit einer Wahrscheinlichkeit von (75% der Zeit) und mit einer Wahrscheinlichkeit von (25% der Zeit) ausgegeben werden die Zeit)N=4XYZXYZXYZXYZ33443=1214

und so weiter....

Regeln

Anmerkung: Diese Herausforderung ist eine (viel) schwierigere Version von dieser .

Mr. Xcoder
quelle
Kann das Programm seinen Quellcode lesen?
Mein Pronomen ist monicareinstate
3
@jemand Ja, das ist erlaubt.
Mr. Xcoder

Antworten:

16

R , 66 35 Bytes

-29 Bytes dank digEmAll .

-2 Bytes dank Giuseppe .

+0->A
x=!0:F
F=F+1
sample(F*x+!x,1)

Probieren Sie es online!

Überprüfen Sie die Verteilung auf N = 4.

Der Schlüssel ist die rechte Zuordnung ->. Wenn der Code multipliziert wird , N - mal, wobei die erste N-1 Anruf samplezugewiesen wird A, und nur der letzte Anruf wird gedruckt.

Originelle, komplexere Lösung:

R , 66 Bytes

T->TT
F=F+1
TT=0
`?`=function(x)if(x)sample(c(1,F),1,,c(1,F-1))
?T

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 Variablen Tund TTmit Code, der mit beginnt Tund mit endet ?T.

Fist der Iterationszähler. ?neu definiert als eine Funktion , die ein Booleschen Argument: wenn der Eingang von ?ist TRUE(oder T), hat es die erforderlichen Stichproben; Wenn die Eingabe FALSE(oder 0) ist, wird nichts ausgeführt. Der Wert von TTist definiert als 0, damit ?Tdie Abtastung aber ?TTnichts tut.

Wenn die Quelle wiederholt wird, sieht es so aus:

T->TT
F=F+1
TT=0
`?`=function(x)if(x)sample(c(1,F),1,,c(1,F-1))
?TT->TT
F=F+1
TT=0
`?`=function(x)if(x)sample(c(1,F),1,,c(1,F-1))
?T

Der mittlere Aufruf ?TTgibt also nichts aus, als der letzte Aufruf ?Tgibt das zufällige Ergebnis aus.

Robin Ryder
quelle
5
Ich glaube nicht, dass ich jemals ->Code-Golf in einer Situation gesehen habe, in der <-das nicht möglich war. Das ist so cool!!
Giuseppe
PS: Ich werde das irgendwann belohnen.
Giuseppe
2
Absolut klasse!
digEmAll
@digEmAll Viel ordentlicher, danke!
Robin Ryder
11

Python 3 , 81 79 Bytes

+0if[]else 1
from random import*
try:n+=1
except:n=1
print([1,n][random()*n<1])

Probieren 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.

Joel
quelle
-1 Byte:+0 if[]else 1
Nishioka
@ Nishioka Danke. Aktualisiert.
Joel
11

Bash , 31 Bytes

trap echo\ $[RANDOM%++n?1:n] 0;

Probieren Sie es online!

trap ... 0Führt den Code aus, der beim Beenden enthalten ist. Wiederholtes traps ü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 <<<:

trap "<<<$[RANDOM%++n?1:n]" 0;
GammaFunktion
quelle
4

Python 3 , 78 76 75 Bytes

Unter Verwendung des gleichen Trick wie bei der Verbindung , die gebucht wurde, ist hier ein Python ein (mit x = 1).

from random import*;n=len(*open(__file__))//75;print(1+~-n*(random()<1/n))#

Probieren Sie es online!

-2 Bytes danke an Herrn Xcoder für seine (n-1)Formel, ~-ndie *
dank Nishioka eine höhere Priorität hat als -1 Bytes

Pâris Douady
quelle
1
Sieht gut für mich aus! import random;n=len(*open(__file__))//76;print(1+~-n*(random.random()<1/n))#sollte für -2 Bytes
funktionieren
1
Ich hatte noch nie gesehen, wie man n-1 macht! Ich mag es, danke :)
Pâris Douady
1
-1 Byte: tio.run/##K6gsycjPM/7/…
Nishioka
Ein weiteres -1 Byte, aber mit etwas anderem Ansatz: tio.run/##K6gsycjPM/7/…
Nishioka
ja das mache ich wegen dem random()<1/n;-)
Pâris Douady
3

Gaia , 17 15 14 13 Bytes

Øgl13÷:(1w&+ṛ

Probieren Sie es online!

Ich habe zufällig das Verhalten von Øggestern bemerkt, als ich in den Dokumenten nachgesehen habe, was immens geholfen hat.

Giuseppe
quelle
3

Perl 5, 28 26 Bytes

-2 Bytes dank @Grimy

1 if!++$x;say 1<rand$x||$x

TIO

Nahuel Fouilleul
quelle
26:1 if!++$x;say 1<rand$x||$x
Grimmy
Danke, nette Abwechslung
Nahuel Fouilleul
2

Runenverzauberungen , 31 Bytes

UwR'10<;$\
I+:'RA0)?/1$;
1
l;
y

Probieren Sie es online!

Verwendet dieselbe Struktur wie diese Antwort, um zu zählen, wie oft die Quelle dupliziert wurde:

Ausführungsablauf

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.

Draco18s
quelle
2

Japt , 9 8 Bytes

(°Tö)ΪT

Testen Sie es | Verdoppelt | Verdreifacht
Überprüfen Sie die Verteilung von 10000 Läufen nach 10 Wiederholungen

(°Tö)ΪT
(            :Prevent the operator that follows from being implicitly applied to the first input variable, U
 °T          :Increment T (initially 0) by 1
   ö         :Random element in the range [0,T)
    )        :Closing the parentheses here instead of after the T saves a byte as there would need to be a space here to close the random method
     Î       :Sign - 0 (falsey) or 1 (truthy)
      ªT     :Logical OR with current value of T

Original, 13 11 10 9 Bytes

Notieren Sie sich den hinteren Raum.

NoÎp°T ö 

Testen Sie es | Verdoppelt | Verdreifacht
Überprüfen Sie die Verteilung von 10000 Läufen nach 10 Wiederholungen

NoÎp°T ö 
N             :Initially, the (empty) array of inputs
 o            :Replace the last element with
  Î           :  Its sign (always 1)
   p          :Push
    °T        :  T (initially 0) incremented
       ö      :Random element of N
Zottelig
quelle
2

JavaScript ( JavaScript-Shell 71 ), 78 Byte

(async x=>x)().then(x=>f((''+f).length/78));f=x=>print(1-~x*Math.random()|0)//

Kein tio Link, Spidermonkey auf tio ist zu alt ...

Firefox (Spidermonkey) betrachtet den Kommentar als Teil der Funktion f. Als Ergebnis (''+f).lengthwird , b+79nwenn 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.)

tsh
quelle
Was ist mit dem (async x=>x)()? Warum ist es async?
Tomáš Zato - wieder einzusetzen Monica
@ TomášZato Es ist buchstäblich asynchronous. So ist der Rückruf x=>f(...)wird aufgerufen, nachdem Funktion fdefiniert.
Dienstag,
1

C # (Visual C # Interactive Compiler) , 133 114 112 Byte

Dies ist das erste (und hoffentlich letztes) Mal, dass ich C # Präprozessordirektiven verwendet habe.

#if!I
#define I
static int i;
class p{~p()=>Console.Write(new Random().Next(i)<1?i:1);}p s=new p();
#endif
i++;

Probieren Sie es online!

Mein Pronomen ist monicareinstate
quelle
1

Kohle , 12 Bytes

⎚I⎇‽L⊞Oυω¹Lυ

Probieren Sie es online! Basierend auf meiner Antwort auf die verknüpfte Frage. Ansonsten nmit Wahrscheinlichkeit ¹/ₙausgeben 1. Erläuterung:

⎚               Remove output from previous iterations
       υ        Initially empty list
        ω       Empty string
     ⊞O         Push
    L           Length
   ‽            Random integer [0..length)
  ⎇             Ternary
         ¹      If nonzero then literal 1
          Lυ    If zero then the new length
 I              Cast to string for implicit print
Neil
quelle