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 .


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.


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.


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

@Nishioka Merci. Mis à jour.
Joel




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


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


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





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

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


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

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
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.