Je multiplie la source, vous multipliez (probablement) la sortie!

18

Tâche

La tâche consiste à écrire un programme qui génère un entier positif cohérent mais sinon arbitraire x (donc strictement supérieur à 0). Voici le hic: lorsque la source est répétée N fois (le code est ajouté / concaténé N1 à lui-même), le programme doit avoir un 1N probabilité de sortie deNxet la probabilité restante deN1N de sortieinchangé.x

Exemple

Supposons que votre source initiale est XYZet produit l'entier 3. Alors:

  • Pour : devrait produire avec une probabilité de (50% du temps) et avec une probabilité de également (50 % du temps).N=2XYZXYZ31223=612

  • Pour : devrait produire 3 avec une probabilité de 2N=3XYZXYZXYZ323 (66,666% du temps) et33=9avec une probabilité de13 (33,333% du temps)

  • Pour N=4 : XYZXYZXYZXYZdevrait produire 3 avec une probabilité de 34 (75% du temps) et43=12 avec une probabilité de14 (25% du temps)

etc....

Règles

Remarque: Ce défi est une version (beaucoup) plus difficile de celui-ci .

M. Xcoder
la source
Le programme peut-il lire son code source?
mon pronom est monicareinstate
3
@someone Oui, c'est autorisé.
M. Xcoder

Réponses:

16

R , 66 35 octets

-29 octets grâce à digEmAll .

-2 octets grâce à Giuseppe .

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

Essayez-le en ligne!

Vérifiez la distribution pour N = 4.

La clé est l'affectation vers la droite ->. Lorsque le code est multiplié N fois, les premiers N1 appels à sampleseront attribués à A, et seul le dernier appel sera imprimé.

Solution originale et plus alambiquée:

R , 66 octets

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

Essayez-le en ligne!

Essayez-le en ligne (répété 3 fois)!

Utilise deux astuces: 1) appeler la fonction principale d'intérêt ?, afin que nous puissions l'appeler sans terminer le programme avec un crochet, et 2) utiliser des variables Tet TT, avec un code qui commence par Tet se termine par ?T.

Fest le compteur d'itérations. ?est redéfini comme une fonction qui prend un argument booléen: si l'entrée de ?est TRUE(ou T), il effectue l'échantillonnage aléatoire requis; si l'entrée est FALSE(ou 0), elle ne fait rien. La valeur de TTest définie comme 0, ce qui ?Tfait l'échantillonnage mais ?TTne fait rien.

Lorsque la source est répétée, cela ressemble à ceci:

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

donc l'appel du milieu ?TTne produit rien, mais l'appel final ?Tgénère le résultat aléatoire.

Robin Ryder
la source
5
Je ne pense pas que j'aie jamais vu ->utilisé dans le golf de code dans une situation où <-il ne pourrait pas être; C'est trop cool!!
Giuseppe
PS Je vais donner une prime à un moment donné.
Giuseppe
2
Absolument génial!
digEmAll
@digEmAll Beaucoup plus soigné, merci!
Robin Ryder
11

Python 3 , 81 79 octets

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

Essayez-le en ligne!

-1 octet grâce à @Nishioka

Il s'agit d'une solution Python 3 qui n'accède pas directement à la source du programme. Faire cela en Python 3 est plus difficile que Python 2 car les instructions d'impression normales se terminent par une parenthèse fermante, il n'y a donc pas beaucoup de choix pour changer son comportement dans le bloc suivant de la source initiale. Il serait intéressant de voir des solutions plus créatives dans Python 3.

Joel
la source
-1 octet:+0 if[]else 1
Nishioka
@Nishioka Merci. Mis à jour.
Joel
11

Bash , 31 octets

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

Essayez-le en ligne!

trap ... 0exécutera le code contenu à la sortie. Les traps répétés écraseront les anciens. Le non cité $[arithmetic expansion]est exécuté chaque fois qu'un nouveau piège est défini.


Zsh peut enregistrer un octet avec <<<:

trap "<<<$[RANDOM%++n?1:n]" 0;
GammaFunction
la source
4

Python 3 , 78 76 75 octets

En utilisant la même astuce que dans le lien qui a été publié, voici une Python (avec x = 1).

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

Essayez-le en ligne!

-2 octets merci à M. Xcoder pour sa (n-1)formule ~-nqui a une priorité supérieure à *
-1 octet grâce à Nishioka

Pâris Douady
la source
1
Cela me semble correct! import random;n=len(*open(__file__))//76;print(1+~-n*(random.random()<1/n))#devrait fonctionner pour -2 octets
M. Xcoder
1
Je n'avais jamais vu cette façon de faire n-1! J'aime ça, merci :)
Pâris Douady
1
-1 octet: tio.run/##K6gsycjPM/7/…
Nishioka
Un autre octet -1 mais avec une approche un peu différente: tio.run/##K6gsycjPM/7/…
Nishioka
oui je le fais à cause du random()<1/n;-)
Pâris Douady
3

Gaia , 17 15 14 13 octets

Øgl13÷:(1w&+ṛ

Essayez-le en ligne!

J'ai remarqué au hasard le comportement d' Øghier en parcourant les documents, ce qui m'a énormément aidé.

Giuseppe
la source
3

Perl 5, 28 26 octets

-2 octets grâce à @Grimy

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

TIO

Nahuel Fouilleul
la source
26:1 if!++$x;say 1<rand$x||$x
Grimmy
merci, belle variation
Nahuel Fouilleul
2

Enchantements runiques , 31 octets

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

Essayez-le en ligne!

Utilise la même structure que cette réponse pour compter combien de fois la source a été dupliquée:

Flux d'exécution

Juste au lieu de sortir le nième nombre dans une liste, nous utilisons cette valeur pour générer aléatoirement un nombre, si le résultat n'est pas 0, imprimer 1, sinon imprimer ce nombre.

Draco18s ne fait plus confiance à SE
la source
2

Japt , 9 8 octets

(°Tö)ΪT

Testez-le | Doublé | Triplé
Vérifier la distribution de 10000 exécutions après 10 répétitions

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

Notez l'espace de fin.

NoÎp°T ö 

Testez-le | Doublé | Triplé
Vérifier la distribution de 10000 exécutions après 10 répétitions

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
Hirsute
la source
2

JavaScript ( shell JavaScript 71 ), 78 octets

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

Pas de lien tio, spidermonkey sur tio est trop vieux ...

Firefox (Spidermonkey) considère le commentaire comme faisant partie de la fonction f. En conséquence, (''+f).lengthserab+79n où b <78, et (n + 1) sont les temps de code source répétés.

Ce buggy (? Je ne suis pas sûr. Je préférerais que ce soit un bug de spécification JavaScript plutôt que n'importe quel interprète ) a été soumis à BMO par quelqu'un d'autre juste après la publication de cette réponse: https://bugzilla.mozilla.org/ show_bug.cgi? id = 1579792 . (Ni le fil bmo ni le tweet ne sont postés par moi.)

tsh
la source
Qu'est-ce que c'est (async x=>x)()? Pourquoi est-ce asynchrone?
Tomáš Zato - Reinstate Monica
@ TomášZato C'est littéralement asynchroneux. Ainsi, le rappel x=>f(...)sera invoqué une fois la fonction fdéfinie.
tsh
1

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

C'est la première (et j'espère la dernière) fois que j'utilise des directives de préprocesseur C #.

#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++;

Essayez-le en ligne!

mon pronom est monicareinstate
la source
1

Fusain , 12 octets

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

Essayez-le en ligne! Basé sur ma réponse à la question liée. Sorties navec probabilité ¹/ₙ, sinon 1. Explication:

⎚               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
la source