Moltiplico la fonte, tu (probabilmente) moltiplichi l'output!


18

Compito

Il compito è scrivere un programma che produca un intero positivo coerente ma altrimenti arbitrario x (quindi strettamente maggiore di 0). Ecco il trucco: quando la sorgente viene ripetuta N volte (il codice viene aggiunto / concatenato N1 a se stesso), il programma dovrebbe avere un 1N probabilità di produrreNxe probabilità rimanente diN1N dell'outputxinvariato.

Esempio

Supponiamo che la tua fonte iniziale sia XYZe produca il numero intero 3. Poi:

  • For N=2: XYZXYZ should output 3 with a probability of 12 (50% of the time) and 23=6 with a probability of 12 as well (50% of the time).

  • For N=3: XYZXYZXYZ should output 3 with a probability of 23 (66.666% of the time) and 33=9 with a probability of 13 (33.333% of the time)

  • For N=4: XYZXYZXYZXYZ should output 3 with a probability of 34 (75% delle volte) e43=12 con una probabilità di14 (25% delle volte)

e così via....

Regole

  • È necessario creare un programma completo . L'output deve essere stampato su STDOUT.

  • Il tuo programma dovrebbe, in teoria, produrre ogni possibile valore con le probabilità sopra indicate, ma una leggera deviazione da questo dovuta all'implementazione di random va bene (a condizione che l'implementazione non abbia una distribuzione diversa - non puoi usare un distribuzione normale per salvare byte ) .

  • Il programma dovrebbe (di nuovo, in teoria) funzionare per un valore arbitrariamente grande di N , ma i limiti tecnici dovuti alla precisione vanno bene per N grande .

  • L'output deve essere nella base 10 (è vietata l'uscita in qualsiasi altra base o con notazione scientifica). Sono ammessi spazi finali / iniziali e zero iniziali.

  • La sorgente iniziale deve (ovviamente) essere lunga almeno 1 byte. Si può non assumere una nuova linea tra le copie del vostro sorgente. Il programma non dovrebbe accettare input (o avere input vuoti inutilizzati).

  • Si tratta di , quindi il punteggio di una risposta è la lunghezza della sorgente (originale) in byte, con un punteggio più basso migliore.

Nota: questa sfida è una versione (molto) più dura di questa .


Il programma può leggere il suo codice sorgente?
mio pronome è monicareinstate il

3
@someone Sì, è permesso.
Mr. Xcoder,

Risposte:


16

R , 66 35 byte

-29 byte grazie a digEmAll .

-2 byte grazie a Giuseppe .

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

Provalo online!

Controlla la distribuzione per N = 4.

La chiave è il compito a destra ->. Quando il codice viene moltiplicato N volte, verranno assegnate le prime chiamate N-1sample aA e verrà stampata solo l'ultima chiamata.

Soluzione originale e più contorta:

R , 66 byte

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

Provalo online!

Provalo online (ripetuto 3 volte)!

Utilizza due trucchi: 1) chiama la funzione principale di interesse ?, in modo che possiamo chiamarla senza terminare il programma con una parentesi, e 2) usa le variabili Te TT, con il codice che inizia con Te termina con?T .

Fè il contatore di iterazioni. ?viene ridefinito come una funzione che accetta un argomento booleano: se l'input di ?è TRUE(o T), esegue il campionamento casuale richiesto; se l'input è FALSE(o 0), non fa nulla. Il valore di TTè definito come 0, quindi ?Tfa il campionamento ma ?TTnon fa nulla.

Quando la fonte viene ripetuta, si presenta così:

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

quindi la chiamata centrale ?TTnon emette altro che la chiamata finale ?Tproduce il risultato casuale.


5
Non credo di aver mai visto ->usato nel code golf in una situazione in cui <-non potrebbe essere; questo è veramente forte!!
Giuseppe,

PS A questo punto darò una taglia.
Giuseppe,

2
Assolutamente fantastico!
digEmAll


@digEmAll Molto più ordinato, grazie!
Robin Ryder,

11

Python 3 , 81 79 byte

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

Provalo online!

-1 byte grazie a @Nishioka

Questa è una soluzione Python 3 che non accede direttamente alla sorgente del programma. Fare questo in Python 3 è più impegnativo di Python 2 perché le normali istruzioni di stampa terminano con una parentesi di chiusura, quindi non ci sono molte scelte per cambiarne il comportamento nel blocco successivo della sorgente iniziale. Sarebbe interessante vedere soluzioni più creative in Python 3.


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

@Nishioka Grazie. Aggiornato.
Joel

11

bash , 31 byte

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

Provalo online!

trap ... 0eseguirà il codice contenuto all'uscita. I messaggi ripetuti trapsovrascriveranno quelli vecchi. Il non quotato$[arithmetic expansion] viene eseguito ogni volta che viene impostata una nuova trap.


Zsh può salvare un byte con <<<:

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



4

Python 3 , 78 76 75 byte

Usando lo stesso trucco del link che è stato pubblicato, eccone uno Python (con x = 1).

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

Provalo online!

-2 byte grazie a Mr. Xcoder per la sua (n-1)formula con la ~-nquale ha una precedenza superiore a *
-1 byte grazie a Nishioka


1
Mi sembra buono! import random;n=len(*open(__file__))//76;print(1+~-n*(random.random()<1/n))#dovrebbe funzionare per -2 byte
Mr. Xcoder

1
Non avevo mai visto questo modo di fare n-1! Mi piace, grazie :)
Pâris Douady,


Un altro -1 byte ma con un approccio un po 'diverso: tio.run/##K6gsycjPM/7/…
Nishioka

si lo faccio per via del random()<1/n;-)
Pâris Douady,


3

Gaia , 17 15 14 13 byte

Øgl13÷:(1w&+ṛ

Provalo online!

Ho notato casualmente il comportamento di Øgieri mentre guardavo i documenti, il che ha aiutato immensamente.





2

Japt , 9 8 byte

(°Tö)ΪT

Provalo | Raddoppiato | Triplicato
Verificare la distribuzione di 10000 esecuzioni dopo 10 ripetizioni

(°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

Originale, 13 11 10 9 byte

Nota lo spazio finale.

NoÎp°T ö 

Provalo | Raddoppiato | Triplicato
Verificare la distribuzione di 10000 esecuzioni dopo 10 ripetizioni

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

Nessun collegamento tio, spidermonkey su tio è troppo vecchio ...

Firefox (Spidermonkey) considera il commento come parte della funzione f. Di conseguenza, (''+f).lengthsarà b+79ndove b <78 e (n + 1) sono i tempi di ripetizione del codice sorgente.

Questo comportamento buggy (? Non sono sicuro. Preferirei che si tratti di un bug di specifica JavaScript piuttosto che di qualsiasi interprete ) era stato inviato a BMO da qualcun altro subito dopo aver pubblicato questa risposta: https://bugzilla.mozilla.org/ show_bug.cgi? id = 1579792 . (Né il thread bmo né il tweet sono pubblicati da me.)


Cosa c'è con il (async x=>x)()? Perché è asincrono?
Tomáš Zato - Ripristina Monica il

@ TomášZato È letteralmente asyncsincero. Quindi il callback x=>f(...)verrà richiamato dopo aver fdefinito la funzione .
TSH


1

Carbone , 12 byte

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

Provalo online! Sulla base della mia risposta alla domanda collegata. Uscite ncon probabilità ¹/ₙ, altrimenti 1. Spiegazione:

⎚               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
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.