Voyons à quel point votre langue de choix est bonne au hasard sélectif.
Compte tenu de 4 caractères, A
, B
, C
, et D
, ou une chaîne de 4 caractères ABCD
en entrée , une sortie des caractères avec les probabilités suivantes:
A
devrait avoir 1/8 (12,5%) de chance d'être choisiB
devrait avoir 3/8 (37,5%) de chance d'être choisiC
devrait avoir 2/8 (25%) de chance d'être choisiD
devrait avoir 2/8 (25%) de chance d'être choisi
Ceci est conforme à la configuration de machine Plinko suivante :
^
^ ^
^ ^ ^
A B \ /
^
C D
Votre réponse doit tenter véritablement de respecter les probabilités décrites. Une explication appropriée de la façon dont les probabilités sont calculées dans votre réponse (et pourquoi elles respectent les spécifications, sans tenir compte des problèmes de pseudo-aléatoire et des grands nombres) est suffisante.
Notation
C'est du golf de code donc le moins d'octets dans chaque langue gagne!
ceil(abs(i - 6)/ 2.0)
mapperait un index de0-7
à un index de0-3
avec la distribution appropriée (0 111 22 33
) pour ce défi ...Réponses:
Machine Lean Mean Bean ,
554342 octets-13 octets grâce à Alex Varga
J'espère que cela ne vous dérange pas que je réponde à ma propre question après seulement 2 heures, mais je doute fortement que quelqu'un d'autre envisage de publier une réponse dans LMBM.
Cela reflète littéralement la disposition Plinko montrée dans l'OP, retournée horizontalement pour réduire les espaces inutiles.
la source
Gelée , 6 octets
Un lien monadique prenant une liste de quatre caractères et en renvoyant un avec la distribution de probabilité décrite.
Essayez-le en ligne!
Comment?
la source
ṁ
!Cubix ,
3924222119 octetsVoir dans l'interprète en ligne!
Cela correspond au réseau de cubes suivant:
Explication de la mise en œuvre de la distribution aléatoire
Cubix est un langage dans lequel un pointeur d'instructions parcourt les faces d'un cube, exécutant les commandes qu'il rencontre. La seule forme d'aléatoire est la commande
D
, qui envoie l'IP dans une direction aléatoire: une chance égale dans1/4
chaque sens.Cependant, nous pouvons l'utiliser pour générer les probabilités pondérées correctes: en utilisant
D
deux fois. Le premierD
a un1/4
cap vers un secondD
. Cette secondeD
, cependant, a deux directions bloquées avec des flèches (> D <
) qui renvoient le pointeur d'instruction àD
pour choisir une autre direction. Cela signifie qu'il n'y a que deux directions possibles à partir de là, chacune ayant une1/8
chance globale de se produire. Cela peut être utilisé pour générer le bon caractère, comme indiqué dans le diagramme ci-dessous:(Notez que, dans le code actuel, la flèche à droite est remplacée par un miroir,
|
)Explication du code
Le pointeur d'instruction commence à droite, au niveau du personnage
i
, face à droite. Il exécute celai
, en prenant le premier caractère en entrée, puis passe auD
, en commençant le processus aléatoire illustré ci-dessus.Char A: Dans le cas où le premier
D
nous envoie vers l'est et le second sud, nous devons imprimer le caractère A. C'est déjà sur la pile du premieri
. Ce qui suit est exécuté:\
- Refléter l'IP pour qu'il se dirige vers l'esti;
- Prenez une entrée, puis éclatez-la à nouveau (no-op)U
- Faites demi-tour en tournant l'IP deux fois à gaucheo
- Sortie du TOS, caractère A@
- Mettre fin au programmeCaractère B: Si c'est le premier ou le deuxième
D
cap au nord, nous devons générer le caractère B, qui sera la prochaine entrée. Les deux chemins exécutent les commandes suivantes:^
- Dirigez-vous vers le nord<
- Dirigez-vous vers l'ouest, enroulant autour de ...i
- Prenez une autre entrée, caractère Bo
- Sortie du TOS, caractère B;
- Pop the TOS@
- Mettre fin au programmeChar C: Si le premier
D
nous envoie vers l'ouest, ce qui suit est exécuté:i
- Prenez une autre entrée, caractère Bi
- Prenez une autre entrée, caractère Co
- Sortie TOS, caractère C@
- Mettre fin au programmeChar D: Si le premier
D
nous envoie au sud, ce qui suit est exécuté:i
- Prenez une autre entrée, caractère B..
- Deux no-opsi
- Prenez une autre entrée, caractère C|
- Ce miroir reflète l'est-ouest, mais l'IP se dirige vers le nord, nous le traversons donc.^
- Cela rejoint le chemin emprunté pour le caractère B. Cependant, comme nous avons déjà pris deux entrées, le quatrième caractère (caractère D) finira par être imprimé.la source
Python , 50 octets
Une fonction sans nom prenant et renvoyant des chaînes (ou des listes de caractères).
Essayez-le en ligne!
Comment?
random.choice
choisit un élément aléatoire dans une liste, de sorte que la fonction forme une chaîne avec la distribution correcte, c'est-à-dire donnée"ABCD"
,"ABCD"[:2] = "AB"
plus"ABCD"[1:]*2 = "BCD"*2 = "BCDBCD"
qui l'est"ABBCDBCD"
.la source
R , 31 octets
Lit les caractères
stdin
séparés par des espaces.sample
tire des échantillons aléatoires de sa première entrée en quantité de la deuxième entrée (so1
), (argument de remplacement facultatif), avec des poids donnés par le dernier argument.Essayez-le en ligne!
Essayez-le
n
fois!Pour ce dernier code, j'échantillonne les
n
temps (définisn
dans l'en-tête) avec remplacement défini surT
rue (c'est faux par défaut), tabule les résultats et divise parn
pour voir les probabilités relatives des entrées.la source
PHP, 28 octets
Exécuter en tant que tuyau avec
-nR
.01112233
en base 4 est5551
en décimal ...la source
7030
est parmi mes favoris personnels.Java 8,
5344 octetsCeci est un
Function<char[], Character>
.Essayez-le en ligne! (ce programme de test exécute la fonction ci - dessus 1.000.000 fois et fournit les probabilités expérimentales de choisir
A
,B
,C
etD
).L'idée générale est de trouver un moyen de la carte
0-7
à0-3
, de sorte que0
semble1/8
fois,1
semble3/8
fois,2
semble2/8
fois, et3
apparaît2/8
fois.round(abs(k - 6) / 2.0))
fonctionne pour cela, oùk
est un entier aléatoire dans la plage[0,8)
. Il en résulte le mappage suivant:Qui, comme vous pouvez le voir, les résultats des indices
0 111 22 33
, qui produit les probabilités souhaitées de1/8
,3/8
,2/8
et2/8
.Mais attendez! Comment dans le monde
-~Math.abs(k-6)/2
obtient-on le même résultat (encore une fois, oùk
est un entier aléatoire dans la plage[0,8]
)? C'est assez simple en fait ...(x+1)/2
(division entière) est la même chose queround(x/2)
, etx + 1
c'est la même chose que-~x
. Bien quex+1
et-~x
soient de la même longueur, dans la fonction ci-dessus, il est préférable d'utiliser-~x
car il-~
a la priorité et ne nécessite donc pas de parenthèses.la source
Math.abs
il accepte également les doubles comme paramètre):s->s[-~(int)Math.abs(Math.random()*8-6)/2]
( 42 octets ).APL, 14 octets
Entrez sous forme de chaîne.
Comment?
1 3 2 2\⊢
- répéter chaque lettre x fois ('ABCD'
→'ABBBCCDD'
)⊃
- prendre l'élément à l'index ..(?8)
- aléatoire 1-8la source
⎕U2378
.Fusain , 11 octets
Essayez-le en ligne! Le lien est vers une version détaillée du code, bien que vous n'en ayez pas besoin;
‽
choisit un élément aléatoire,⟦⟧
crée une liste et les variables sont celles qui obtiennent les lettres d'entrée appropriées (dans l'ordre inverse parce que j'en avais envie).la source
Pyth ,
87 octetsUtilise exactement le même algorithme que dans ma réponse Python.
Essayez-le ici!
Pyth ,
108 octetsUtilise exactement le même algorithme que la réponse Python de Jonathan Allan.
Essayez-le ici!
Explication
O
- Prend un élément aléatoire de la chaîne faite en ajoutant (avec+
):<Q2
- Les deux premiers caractères de la chaîne.*2t
Doublez la chaîne complète (*2
) à l'exception du premier caractère (t
).Appliquer cet algorithme pour
ABCD
:<Q2
prendAB
.*2t
prendBCD
et double il:BCDBCD
.+
joint les deux chaînes:ABBCDBCD
.O
prend un caractère aléatoire.-2 grâce à Leaky Nun (deuxième solution)
-1 grâce au mnémonique (première solution)
la source
>Q1
devienttQ
, qui devientt
.*2
avec+
et en utilisant l'entrée implicite deux fois.y
place, ce qui ne fonctionne pas pour les chaînes ...Gelée , 8 octets
Essayez-le en ligne!
Retirez le
X
pour voir"ABBBCCDD"
. LeX
choisit un élément aléatoire.la source
C # (.NET Core) ,
7655 octetsEssayez-le en ligne!
Ma première réponse écrite directement sur TIO à l'aide de mon téléphone portable. Niveau supérieur!
Explication: si la chaîne d'origine est "ABCD", la fonction crée la chaîne "ABCDBBCD" et en prend un élément aléatoire.
la source
Javascript 35 octets
Prend une chaîne
ABCD
en entrée, sortA
1 / 8ème du temps,B
3 / 8ème du temps,C
1 / 4ème du temps etD
1 / 4ème du temps.Explication
la source
05AB1E , 5 octets
Essayez-le en ligne!
Explication
la source
> <> ,
252219 octetsEssayez-le en ligne! , ou regardez-le au terrain de pêche !
Un bref aperçu de> <>: c'est un langage 2D avec un poisson qui nage dans le code, exécutant les instructions au fur et à mesure. S'il atteint le bord du code, il passe de l'autre côté. Le poisson commence dans le coin supérieur gauche, se déplaçant vers la droite. L'aléatoire est délicat dans> <>: la seule instruction aléatoire est
x
, qui définit la direction du poisson de manière aléatoire en haut, en bas, à gauche et à droite (avec une probabilité égale).Au début du programme, le poisson lit deux caractères d'entrée avec
i_i
(chacuni
lit un caractère de STDIN dans la pile, et_
est un miroir horizontal, que le poisson ignore maintenant). Il atteint alors unx
.Si le
x
envoie le poisson vers la droite, il lit un caractère de plus (le troisième), l'imprime aveco
et s'arrête avec;
. La direction de gauche est similaire: le poisson lit deux autres caractères (nous en sommes donc au quatrième), s'enroule vers la droite, imprime le quatrième caractère et s'arrête. Si le poisson nage, il enveloppe et imprime le deuxième caractère, avant d'être réfléchi/
et de s'arrêter. S'il nage, il est réfléchi par le/
et en frappe un autrex
.Cette fois, deux directions renvoient le poisson vers la
x
droite (avec une flèche<
, et vers le haut avec un miroir_
). Le poisson a donc 1/2 chance de s'en échapperx
dans chacune des deux autres directions. Imprime vers la gauche le premier caractère de la pile, qui est le second, mais vers le bas permute d'abord les deux éléments de la pile$
, donc cette direction imprime le premier caractère.En résumé, les troisième et quatrième caractères sont imprimés avec une probabilité 1/4 chacun; le premier caractère a une probabilité 1/2 x 1/4 = 1/8; et le deuxième caractère a une probabilité 1/4 + 1/2 x 1/4 = 3/8.
la source
05AB1E , 8 octets
Essayez-le en ligne!
la source
MATL ,
1210 octetsEssayez-le en ligne! Ou exécutez-le 1000 fois (code légèrement modifié) et vérifiez le nombre de fois que chaque caractère apparaît.
Explication
Changements dans le code modifié:
1000:"Gl3HH4$vY"1Zr]vSY'
1000:"...]
est une boucle pour répéter les1000
temps.G
s'assure que l'entrée est poussée au début de chaque itération.v
être remplacé par4$v
pour ne concaténer que les premiers4
chiffres.v
concatène les1000
résultats dans un vecteur, leS
trie et l'Y'
encode en longueur. Cela donne les quatre lettres et le nombre de fois qu'elles sont apparues.la source
05AB1E , 6 octets
Essayez-le en ligne!
Explication
Fonctionne pour les listes et les chaînes.
la source
C (gcc) ,
5049 octetsEssayez-le en ligne!
la source
ABCD
est un exemple d'entrée, votre code doit prendre 4 caractères (ou une chaîne de longueur 4) en entréeRubis,
34332927 octetsSauvegardé 2 octets grâce à @Value Inc
Saisissez quatre caractères
construire un tableau
[B,B,C,D,A,B,C,D]
et l'échantillonner.essayez-le en ligne!
essayez-le
n
fois! (Je l'ai converti en fonction pour le répéter plus facilement, mais l'algorithme est le même)la source
$*
est un alias pourARGV
.Pyth, 7 octets
Suite de tests
O8
génère un nombre aléatoire de 0 à 7.| ... 1
applique une logique ou avec 1, convertissant le 0 en 1 et laissant tout le reste identique. Le nombre à ce stade est 1 2 / 8ème du temps et 2, 3, 4, 5, 6, 7 ou 8 1/8 du temps.@z
indexe dans la chaîne d'entrée à cette position. L'indexation est effectuée modulo la longueur de la chaîne, donc 4 index en position 0, 5 en position 1, etc.Les probabilités sont:
Position 0: numéro aléatoire 4. 1/8 du temps.
Position 1: numéro aléatoire 0, 1 ou 5. 3/8 du temps.
Position 2: numéro aléatoire 2 ou 6. 2/8 du temps.
Position 3: numéro aléatoire 3 ou 7. 2/8 du temps.
la source
Javascript,
3130 octets / 23 octetsEn voyant la réponse Javascript antérieure d'Asgallant, j'ai pensé à JS. Comme il dit:
Le mien est:
Explication:
De
Math.random()*8&7
cela se décompose comme suit:Version 2, 23 octets
Mais merci à Arnauld, qui a posté après moi, quand il a dit:
ce qui, si c'est effectivement permis, m'a conduit à:
dans lequel
new Date%8
utilise le même tableau de répartition que ci-dessus.Et
%8
pourrait aussi être&7
; faites votre choix. Merci encore, Arnauld.la source
ngn / apl, 10 octets
?2 4
choisit au hasard une paire de nombres - le premier parmi 0 1 et le second parmi 0 1 2 3⌈/
est "max réduire" - trouver le plus grand nombre⎕a
est l'alphabet majuscule[ ]
indexagenotez le tableau pour max (a, b) lorsque a∊ {0,1} et b∊ {0,1,2,3}:
si a et b sont choisis au hasard et indépendamment, nous pouvons substituer 0123 = ABCD pour obtenir la distribution de probabilité souhaitée
la source
Python 3 ,
64 5551 octets-9 octets grâce à @ovs
Essayez-le en ligne!
Explication
random.choice()
obtient un caractère aléatoire de la chaîne, tandis que(s*2)[1:]+s[1]
créeBCDABCDB
pour une entrée deABCD
, qui a 1/8A
s, 2/8C
s, 2/8D
s et 3/8B
s.la source
random.choice
pour 55 octets:lambda s:choice((s[0]+s[1:]*3)[:8])
choice()
bien.QBIC , 27 octets
Explication
la source
> <>, 56 octets
Essayez-le en ligne!
la source
Puce , 60 octets
Essayez-le en ligne!
Les trois
?
produisent chacun un bit aléatoire. Au premier cycle, ces bits sont exécutés via les commutateurs ci-dessus (/
«et\
») pour déterminer la valeur que nous allons sortir de ce tableau:(où
_
peut être soit0
ou1
). Nous parcourons ensuite l'entrée si nécessaire, imprimons et terminons lorsque la valeur correcte est atteinte.Le gros blob alphabétique à la fin est copié en gros à partir du programme cat, cette solution supprime simplement la sortie et se termine pour obtenir l'effet souhaité.
la source
Rubis, 32 octets
Assez simple..?
Essayez-le en ligne!
la source
Applesoft,
29oops, 32 octetsUn petit exemple de "retrocomputing". Restez avec moi, je suis tout nouveau dans ce domaine. Je suppose que ce qui est désigné comme "entrée" n'a pas besoin d'être compté lui-même. Comme indiqué dans le PO, l'entrée serait donnée comme "ABCD". (Je n'avais pas réalisé au départ que je devais spécifier l'entrée obtenue, qui ajoutait 4 octets, tandis que je jouais le reste sur un octet.)
Les termes INPUT, RND, PRINT et MID $ sont chacun codés en interne sous forme de jetons à un octet.
Tout d'abord, X se voit attribuer une valeur aléatoire dans la plage 0 <X <4. Ceci est utilisé pour choisir l'un des caractères parmi I $, selon (X <.5) + X + 1. La valeur de position du caractère est prise évaluation tronquée de l'expression. X <0,5 ajoute 1 si X était inférieur à 0,5, sinon ajoutez 0. Les résultats de X se décomposent comme suit:
la source
Lisp commun , 198 octets
Essayez-le en ligne!
Lisible:
la source