Considérons cette version ASCII d’un mécanisme similaire à une machine à haricots ou à un jeu plinko / pachinko :
O
^
\ ^
^ ^ \
\ ^ / ^
U U U U U
1 2 3 4 5
Le O
est une balle qui tombe.
- Quand il frappe un
^
, il y a 50% de chance qu'il aille à gauche ou à droite. - Quand il frappe un
/
, il va toujours à gauche. - Quand ça frappe un
\
, ça va toujours bien.
La balle finit par tomber dans l'un des U
creux numérotés en bas. La question est de savoir quelle est la probabilité qu'il finisse dans chaque creux.
Pour ce cas particulier, les probabilités sont 0.0
, 0.1875
, 0.5625
, 0.125
, et 0.125
, pour des creux de 1 à 5 respectivement.
Voici un autre exemple avec 3 creux au lieu de 5. Les probabilités sont 0.5
, 0.5
, et 0.0
:
O
/
^ ^
U U U
1 2 3
Dans ce défi, nous allons généraliser ce problème à un mécanisme avec n'importe quel nombre de couches configurées de n'importe quelle manière.
Défi
Ecrivez un programme ou une fonction prenant en compte la représentation ASCII de la structure pyramidale du mécanisme. (Entrée via stdin / ligne de commande / argument de fonction.)
Vous pouvez soit supposer qu'il entre avec des espaces qui le mettent dans la forme appropriée, par exemple
^
\ ^
^ ^ \
\ ^ / ^
Ou vous pouvez supposer qu'il entre sans espaces du tout, par exemple
^
\^
^^\
\^/^
(Si vous le souhaitez, vous pouvez supposer qu'il existe une nouvelle ligne de fuite et / ou un motif cohérent d'espaces de fin.)
La structure pyramidale en entrée peut avoir un nombre quelconque de niveaux (également appelés lignes), y compris zéro. Chaque niveau a une plus ^
, /
ou \
que le dernier, et il y a des levels + 1
creux sur le fond (qui ne font pas partie de l'entrée).
Votre programme / fonction doit imprimer / renvoyer la liste des probabilités que la balle atterrisse dans chacun des creux (dans l'ordre le plus à gauche). Celles-ci doivent être des valeurs à virgule flottante qui, une fois imprimées, comportent au moins 3 décimales (des zéros ou des points décimaux superflus ne sont pas obligatoires; 1
convient très bien 1.000
, .5
convient parfaitement 0.500
, etc.). Si vous avez écrit une fonction, vous pouvez imprimer les valeurs ou renvoyer une liste / tableau des flottants.
Tout format de liste imprimée raisonnable convient. par exemple 0.5 0.5 0.0
, [0.5 0.5 0.0]
, [0.5, 0.5, 0.0]
, {0.5, 0.5, 0.0}
ou 0.5\n0.5\n0.0
tout serait bien.
Exemples
0 niveaux: (se résume à un trivial U
)
Entrée: [no input/empty string given]
sortie:1.0
1 niveau:
Entrée: ^
sortie:0.5 0.5
Entrée: /
sortie:1.0 0.0
Entrée: \
sortie:0.0 1.0
2 niveaux: (deuxième exemple ci-dessus)
Contribution:
/
^ ^
Sortie: 0.5 0.5 0.0
3 niveaux:
Contribution:
^
^ ^
^ ^ ^
Sortie: 0.125 0.375 0.375 0.125
Contribution:
\
/ \
/ / \
Sortie: 0.0 0.0 0.0 1.0
4 niveaux: (premier exemple ci-dessus)
Contribution:
^
\ ^
^ ^ \
\ ^ / ^
Sortie: 0.0 0.1875 0.5625 0.125 0.125
7 niveaux:
Contribution:
^
/ ^
^ ^ /
/ \ / \
^ ^ / ^ \
^ \ ^ \ / ^
\ ^ ^ ^ \ ^ /
Sortie: 0.0 0.09375 0.28125 0.4375 0.1875 0.0 0.0 0.0
Notation
La réponse la plus courte en octets l'emporte. Tiebreaker est post plus tôt.
la source
Réponses:
CJam,
50 48 45 44 4240 octetsCeci s'attend à ce que l'entrée soit sans espace et ait un retour à la ligne final. Par exemple:
Algorithme
L'idée de base est que vous continuez à analyser chaque caractère (il n'y a que 4 caractères différents) et à effectuer différentes opérations sur la distribution de probabilité (initialement un tableau contenant 1 élément de valeur 1). Pour chaque ligne de caractères d'entrée (en commençant par le premier caractère de la première ligne), nous maintenons un tableau de probabilité de la même taille. Chaque caractère agit sur la première probabilité de la liste et pousse la paire résultante à la fin de la liste. Après chaque ligne, nous résumons les paires de la liste pour obtenir le nombre exact d'éléments comme les éléments de la ligne suivante.
Voici les quatre personnages et les actions requises correspondant à chacun:
^
: Lorsque ce caractère apparaît, vous divisez la probabilité actuelle en deux parties. Par exemple, si nous avons ceci sur la première ligne, nous devons convertir le[1]
en[0.5 0.5]
/
: Lorsque ces caractères apparaissent, nous devons mettre<current probability> 0
en place la probabilité actuelle dans le tableau.\
: Lorsque ces caractères apparaissent, nous devons mettre0 <current probability>
en place la probabilité actuelle dans le tableau.\n
: Lorsque ce personnage apparaît, nous avons une nouvelle ligne. Nous regroupons ainsi toutes les paires de plus de 3 caractères et les additionnons pour obtenir la probabilité de chaque élément pour la ligne suivante. Par ex.[0 0.5 0.25 0.25]
se convertit en[0 0.75 0.25]
. Notez que les premier et dernier éléments ont une paire implicite (valeur 0) avant et après eux.Il ne reste plus qu’à identifier le bon personnage et à effectuer la bonne action. Utilisons les calculs habituels pour le faire. Les codes ASCII pour
^
,\
,/
et\n
sont94
,92
,47
et10
. Après quelques essais, nous obtenons cette équation simple pour convertir ces nombres en 0, 1, 2 et 3:donne:
Dans un tableau de longueur 4, le dernier
4f%
serait implicite. Nous faisons donc simplement%13
avec le code ASCII du personnage et choisissons la bonne action parmi un tableau d’actions.Explication du code :
Essayez-le en ligne ici
la source
Ruby 140
Fonction qui prend en entrée la chaîne (peut être joliment formatée en pyramide) et renvoie un tableau de flottants.
Testez-le en ligne: http://ideone.com/kmsZMe
Mise en œuvre assez simple. Ici c'est non-golfé:
la source
Ruby, 140
158octetsNe continuez pas à voter pour cela quand il y a une meilleure version ruby .Voici d'autres astuces pour vous.Fonction sans nom avec un argument. Ne doit contenir aucun espace. Peut contenir ou non un saut de ligne.
Détruit 9 octets s'il doit être manipuléTous les cas de test fonctionnent correctement, voir ici chez ideone .0 levels
(chaîne vide).la source
split
, par exemple.Pyth,
434241 octetsCeci s'attend à ce que l'entrée soit sans espaces. Essayez-le en ligne: Compilateur / Exécuteur Pyth
Pyth, 40 octets (discutable)
Merci à @isaacg pour avoir sauvegardé un octet. Notez que cette version ne fonctionnait pas réellement dans la version de Pyth, lorsque la question a été posée. Il y avait un petit bug dans le compilateur. Malgré le fait que ce code n'utilise pas de nouvelles fonctionnalités de Pyth (uniquement des éléments conservés dans la documentation Pyth pendant longtemps et qui auraient dû fonctionner), il se peut que cette réponse ne soit pas valide. Décider vous-même.
Essayez-le en ligne: Compilateur / Exécuteur Pyth
Explication:
Par exemple, si j'ai actuellement les probabilités d'entrée
G = [0.5, 0.5, 0.0]
et la ligne,H = "^/^"
voici ce qui se passe:[(0.5,"^"), (0.5,"/"), (0.0,"^")]
[[0.25,0.25], [0.5,0.0], [0.0, 0.0]]
[0, 0.25, 0.25, 0.5, 0.0, 0.0, 0.0]
[0,0.25], [0.25,0.5], [0.0,0.0], [0.0]]
[0.25, 0.75, 0.0, 0.0]
la source
hk
.,K@[ZJhkcJ2)x"\/"ek-JK
C #,
274247 octetsRien de spécial, programme complet qui lit les lignes (avec ou sans espaces, il les supprime) de STDIN, et imprime les résultats séparés par des espaces dans STDOUT.
Code plus propre avec des commentaires:
la source
Python 3, 113
Met régulièrement à jour le vecteur de probabilité
P
en réponse à chaque ligne. Ce nouveau vecteur de probabilitéQ
est créé une entrée à la fois. Parcourt les nouveaux créneaux horaires et calcule la contribution de l’ancrage à sa droiter
, tout en calculant la contribution restante au créneau suivantp-r
.Attend que chaque ligne se termine par au moins un espace pour éviter un problème où les lignes se terminent par une barre oblique inverse.
la source
input()
puisse gérer cela.Python 3, 138 octets
Fonctionne avec tous les espaces blancs car ils sont tous filtrés (par
if'!'<e
).Méthode:
r
de plus en plus longue des probabilités d'atteindre tous les obstacles et des creux implicites en dessous d'eux. Nous partons de la liste[1]
.0
à la liste pour le creux du leader. Nous décidons s'il s'agit du premier obstacle en comparant son indexp
au prochain nombre triangulairet*-~t/2
.^:0.5 0.5; /:1 0; \:0 1
). Nous utilisons la méthode suivante:v = ord(char) mod 7 + 1
céder^:4 /:6 \:2
v div 3 / 2
donne la première fraction (^:0.5 /:1 \:0
)v mod 3 / 2
donne la seconde fraction (^:0.5 /:0 \:1
)t + 1
élément de la liste finaler
.2 octets grâce au conseil de chat de @ Sp3000.
la source
Perl, 78
Prend des entrées sans espaces.
Essayez - moi .
la source
TI-BASIC,
7376Prend une ligne à la fois et se termine lorsqu'un espace est entré seul, car ni les sauts de ligne dans les chaînes ni les chaînes vides ne sont légaux dans TI-BASIC.
Je suis presque sûr d'avoir la bonne taille (TI-BASIC est segmenté, chaque commande prend donc un ou deux octets: seq () en prend un, inString () en prend deux, dim () en prend un, etc.). compté la taille manuellement.)
Bien que la barre oblique inverse soit valide dans une chaîne, notez qu’il n’ya aucun moyen de la saisir depuis l’intérieur du programme si vous n’avez pas modifié votre calculatrice.
la source
Javascript - 117
J'ai essayé d'utiliser la récursivité, mais c'était trop long ...
Pointe du chapeau à xnor pour l'idée de soustraction, qui a rasé une douzaine de personnages ou plus.
Ungolfed:
la source