Tâche
La tâche consiste à écrire un programme qui génère un entier positif cohérent mais sinon arbitraire (donc strictement supérieur à 0). Voici le hic: lorsque la source est répétée fois (le code est ajouté / concaténé à lui-même), le programme doit avoir un probabilité de sortie deet la probabilité restante de de sortieinchangé.
Exemple
Supposons que votre source initiale est XYZ
et produit l'entier 3
. Alors:
Pour : devrait produire avec une probabilité de (50% du temps) et avec une probabilité de également (50 % du temps).
XYZXYZ
Pour : devrait produire 3 avec une probabilité de 2
XYZXYZXYZ
(66,666% du temps) etavec une probabilité de (33,333% du temps)Pour :
XYZXYZXYZXYZ
devrait produire avec une probabilité de (75% du temps) et avec une probabilité de (25% du temps)
etc....
Règles
Vous devez créer un programme complet . La sortie doit être imprimée sur STDOUT.
Votre programme devrait, en théorie, produire chaque valeur possible avec les probabilités indiquées ci-dessus, mais une légère déviation par rapport à cela en raison de l'implémentation de random est très bien (à condition que l'implémentation ne soit pas d'une distribution différente - vous ne pouvez pas utiliser un distribution normale pour économiser les octets ) .
Le programme devrait (encore une fois, en théorie) travail pour une valeur arbitrairement grande de , mais les limitations techniques en raison de la précision sont très bien pour les grandes .
La sortie doit être en base 10 (la sortie dans toute autre base ou en notation scientifique est interdite). Les espaces de fin / de début et les zéros de début sont autorisés.
La source initiale doit (bien sûr) avoir au moins 1 octet de long. Vous ne pouvez pas assumer une nouvelle ligne entre les copies de votre source. Le programme ne doit pas prendre d'entrée (ou avoir une entrée vide non utilisée).
Il s'agit de code-golf , donc le score d'une réponse est la longueur de la source (d'origine) en octets, un score plus bas étant meilleur.
Remarque: Ce défi est une version (beaucoup) plus difficile de celui-ci .
la source
Réponses:
R ,
6635 octets-29 octets grâce à digEmAll .
-2 octets grâce à Giuseppe .
Essayez-le en ligne!
Vérifiez la distribution pour N = 4.
La clé est l'affectation vers la droiteN fois, les premiers N−1 appels à
->
. Lorsque le code est multipliésample
seront attribués àA
, et seul le dernier appel sera imprimé.Solution originale et plus alambiquée:
R , 66 octets
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 variablesT
etTT
, avec un code qui commence parT
et se termine par?T
.F
est le compteur d'itérations.?
est redéfini comme une fonction qui prend un argument booléen: si l'entrée de?
estTRUE
(ouT
), il effectue l'échantillonnage aléatoire requis; si l'entrée estFALSE
(ou0
), elle ne fait rien. La valeur deTT
est définie comme0
, ce qui?T
fait l'échantillonnage mais?TT
ne fait rien.Lorsque la source est répétée, cela ressemble à ceci:
donc l'appel du milieu
?TT
ne produit rien, mais l'appel final?T
génère le résultat aléatoire.la source
->
utilisé dans le golf de code dans une situation où<-
il ne pourrait pas être; C'est trop cool!!Python 3 ,
8179 octetsEssayez-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.
la source
+0 if[]else 1
Bash , 31 octets
Essayez-le en ligne!
trap ... 0
exécutera le code contenu à la sortie. Lestrap
s 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
<<<
:la source
Gelée , 7 octets
Essayez-le en ligne!
la source
05AB1E , 7 octets
Essayez-le en ligne!
la source
Python 3 ,
787675 octetsEn utilisant la même astuce que dans le lien qui a été publié, voici une Python (avec x = 1).
Essayez-le en ligne!
-2 octets merci à M. Xcoder pour sa
(n-1)
formule~-n
qui a une priorité supérieure à*
-1 octet grâce à Nishioka
la source
import random;n=len(*open(__file__))//76;print(1+~-n*(random.random()<1/n))#
devrait fonctionner pour -2 octetsrandom()<1/n
;-)Dyalog APL,
2524232221 octetsEssayez-le en ligne!
la source
Gaia ,
17151413 octetsEssayez-le en ligne!
J'ai remarqué au hasard le comportement d'
Øg
hier en parcourant les documents, ce qui m'a énormément aidé.la source
Perl 5,
2826 octets-2 octets grâce à @Grimy
TIO
la source
1 if!++$x;say 1<rand$x||$x
Rubis , 40 octets
Essayez-le en ligne!
Essayez-le en ligne (copié 3 fois)!
Un port rubis de cette réponse Python .
Rubis , 38 octets
2 octets enregistrés en lisant le fichier:
Essayez-le en ligne!
la source
Enchantements runiques , 31 octets
Essayez-le en ligne!
Utilise la même structure que cette réponse pour compter combien de fois la source a été dupliquée:
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.
la source
Japt ,
98 octetsTestez-le | Doublé | Triplé
Vérifier la distribution de 10000 exécutions après 10 répétitions
Original,
1311109 octetsNotez l'espace de fin.
Testez-le | Doublé | Triplé
Vérifier la distribution de 10000 exécutions après 10 répétitions
la source
JavaScript ( shell JavaScript 71 ), 78 octets
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).length
serab+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.)
la source
(async x=>x)()
? Pourquoi est-ce asynchrone?async
hroneux. Ainsi, le rappelx=>f(...)
sera invoqué une fois la fonctionf
définie.C # (Visual C # Interactive Compiler) ,
133114112 octetsC'est la première (et j'espère la dernière) fois que j'utilise des directives de préprocesseur C #.
Essayez-le en ligne!
la source
Fusain , 12 octets
Essayez-le en ligne! Basé sur ma réponse à la question liée. Sorties
n
avec probabilité¹/ₙ
, sinon1
. Explication:la source