Un exemple classique pour initier les gens au concept d'une distribution de probabilité discrète est la machine à grains . Cette machine a une grande quantité de billes tombant d'un passage étroit en haut, après quoi elles frappent des rangées de broches entrelacées, où à chaque broche le marbre frappe, il peut tomber à gauche ou à droite de la broche. Enfin, les broches sont collectées dans des bacs verticaux au bas de la machine. Un schéma simple de cette machine ressemble à ceci:
| O |
| ^ |
| ^ ^ |
| ^ ^ ^ |
| ^ ^ ^ ^ |
| ^ ^ ^ ^ ^ |
|_|_|_|_|_|_|
Dans ce diagramme, le O
signifie l'emplacement d'où les billes tombent. Chacun ^
est une épingle à laquelle le marbre a 50% de chances de se déplacer vers le carré à gauche ou à droite de l'épingle. Les billes se rassemblent ensuite dans les bacs au bas de l'appareil, et pour un nombre suffisamment important de billes, la hauteur des piles de marbre dans les bacs ressemblera à une distribution binomiale discrète.
Défi
Pour ce défi, vous calculerez la distribution de probabilité résultante des machines à grains en fonction de diagrammes comme celui ci-dessus. Les diagrammes sont interprétés comme un «programme» bidimensionnel que les billes traversent, soit vers des champs sur le côté, soit vers des champs en dessous du champ actuel. Lorsque les billes atteignent le bas de la machine, elles sont comptées pour la distribution de probabilité. Pour le garder intéressant, ces diagrammes contiendront quelques champs de plus que la simple source et les broches. Un exemple de diagramme est:
| O |
| ^ |
| ^ / |
| ^ | ^ |
| <^- = v |
| ^ ^ ^ ^ ^ |
De plus, les billes ont désormais chacune un sens de rotation. Cette direction est définie par certains champs et détermine vers quel champ suivant le marbre se déplace dans plusieurs autres champs.
Les champs suivants sont définis:
O
: La source. Génère des billes directement en dessous. La direction de ces billes est de 50% à gauche, 50% à droite. Chaque source produit la même quantité de billes.U
: Évier. Les billes qui entrent dans ce champ sont supprimées de la machine à grains.: Espace libre. Si une bille arrive dans ce champ, elle se déplacera vers le champ ci-dessous.
-
: Sol. Si une bille arrive dans ce champ, elle se déplacera vers le champ vers la gauche ou vers la droite, selon sa direction actuelle.^
: Splitter. Si une bille arrive dans ce champ, elle a 50% de déplacement vers le champ vers la droite ou le champ vers la gauche du séparateur. Cela détermine également la direction du marbre.v
: Rejoignez. Si une bille arrive dans ce champ, elle se déplacera vers le champ ci-dessous./
: Coussin incliné. Si une bille arrive dans ce champ, elle se déplacera sur le terrain à gauche du pavé, définissant la direction de la bille.\
: Identique à la précédente, mais à droite.|
: Réflecteur. Si une bille arrive dans ce champ, elle inversera la direction de la bille et déplacera la bille vers le champ vers la droite ou la gauche, en fonction de cette direction inversée.=
: Canon. Si une bille arrive dans ce champ, elle la déplacera vers la droite ou la gauche dans la direction actuelle, jusqu'à ce que la bille rencontre un champ qui ne l'est pas,
-
ouO
.<
: Identique à la précédente, mais définit toujours la direction et se déplace vers la gauche.>
: Identique à la précédente, mais à droite.
Les garanties suivantes sont données concernant le schéma.
- Chaque ligne d'entrée aura exactement la même longueur dans les champs.
- Les champs les plus à gauche et à droite de chaque ligne seront toujours un
|
. - Le diagramme ne contiendra aucun chemin possible par lequel les billes peuvent se coincer dans la machine pour une quantité indéterminée d'itérations, comme
\/
ou^^
. - Le diagramme ne contiendra que les champs mentionnés ci-dessus.
- Il existe une ou plusieurs sources
Résultat
Votre tâche consistera à générer un graphique à barres ASCII de 16 lignes de haut de la distribution de probabilité dans laquelle les billes sortent du bas du graphique, à l'échelle de sorte que la plus grande probabilité couvre les 16 caractères. Donc pour le problème suivant:
| O |
| ^ |
| ^ ^ |
| ^ ^ ^ |
| ^ ^ ^ ^ |
| ^ ^ ^ ^ ^ |
Votre programme doit produire la solution suivante (notez qu'il doit avoir la même largeur que le programme d'entrée, y compris les tuyaux sur le côté:
# #
# #
# #
# #
# #
# #
# #
# #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # #
# # # # # #
# # # # # #
Exemples
Voici un exemple qui devrait tester la fonctionnalité de tous les différents types de champs:
| O O |
| O ^ / <^\\\ |
| ^ > ^ |
| ^ ^ ^ =|
| ^ ^ | ^ <^ O |
| ^ > ^ | ^ O ^> v |
|| ^U ^ | = ^\ |
| ^ ^ ^ ^U ^\ ---^ |
| = ^ ^ = v |
Il devrait en résulter la sortie suivante:
#
#
#
#
# #
# #
# #
# # # #
# # # #
# # # #
# # # #
## # # #
## # # # #
# ### # # # #
# # ### # # # #
# # ### # # # #
Règles
Les fonctions et les programmes complets constituent des réponses valables à ce défi. Vous recevrez le diagramme sous forme de chaîne séparée par des sauts de ligne et vous devrez renvoyer le graphique de sortie dans le format donné. Règles d'entrée / sortie par défaut s'appliquent. Bien que les sauts de ligne de fin et de début soient autorisés dans la sortie, chaque ligne doit avoir exactement la même largeur que l'entrée.
Pour permettre des solutions plus créatives, il est seulement nécessaire que votre programme génère le résultat correct plus de 90% du temps pour le même diagramme. C'est une simulation de probabilité après tout.
Notation
C'est le code-golf , donc le score le plus bas en octets l'emporte.
la source
v
=[space]
?v
et[space]
diffèrent dans la façon dont les canons interagissent autour d'eux.Réponses:
Python 3 ,
431429410 octetsEssayez-le en ligne!
Cette réponse est un effort de collaboration entre Wheat Wizard et CensoredUsername. Pour référence, il s'agit de l'algorithme non golfé.
-2 octets de M. Xcoder
-19 octets de CensoredUsername
la source
but I can confirm it's doable in 519 characters of python 3 code ;) I don't think I can golf mine much more
- CensoredUsernamePython 2 , 731 octets
Essayez-le en ligne!
-17 octets grâce au caird coinheringaahing
-12 octets grâce à Nathan Shiraini
-56 octets en passant à l'indentation mixte (Python 2)
-28 grâce à CensoredUsername car les probabilités sont normalisées à la fin, il n'est donc pas nécessaire que les probabilités de fin s'additionnent toujours à 1.
-7 octets grâce à la calculatrice féline en utilisant une fin plus courte
elif
instruction de .-218 octets en fusionnant les deux fonctions
la source
R
etL
commeR(r+1-N,C+N,P,N=N)
(premier appel versR
), vous n'avez pas besoin duN=
à la fin; ça devrait être à laR(r+1-N,C+N,P,N)
place.L
etR
^^ De plus, votre deuxième niveau d'indentation est de 4 espaces partout, je pense que vous pourriez en faire 2.C,
569568556 octetsGolfé
Non golfé
Modifications
Enregistré 12 octets en changeant ma macro de cas.
Remarques
Mon code utilise un système d'entiers de base 3 pour déterminer où le marbre se dirigera et se dirigera après (pour les canons et les trucs).
J'ai essayé donc j'ai dû battre cette solution python, je l'ai vraiment fait.
la source