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 .


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.


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.


-1 Byte:+0 if[]else 1
Nishioka

@ Nishioka Danke. Aktualisiert.
Joel




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


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


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





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.


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

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


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

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
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.