Intro
Considérons une grille de caractères f A\/
tels que
f f f
A
A / \
\ / A
A \/
/
\/
où:
f
représente un robinet qui verse un jet d'eau vers le basA
bifurque le jet d'eau au-dessus, donc exactement la moitié va à gauche et exactement la moitié va à droite\
déplace le jet d'eau au-dessus vers la droite d'une unité/
déplace le jet d'eau au-dessus vers la gauche d'une unité- les combinaisons
\/
créent un bac à capacité infinie qui recueille les cours d'eau au-dessus [space]
est un espace vide que l'eau peut traverser
À partir de cela, nous pouvons imaginer le chemin que l'eau ( *
) emprunterait en sortant des robinets et en tombant dans les auges ou hors de la zone de la grille:
f f f <-- first second and third faucets
* * *A*
* *A*/ \*
\*/ * *A <-- a '*' is not drawn to the right of this A because it would be out of the 9×7 bounds
* *A*\/ <-- upper trough
**/ *
\/ * <-- lower trough
En supposant que les 3 robinets produisent la même quantité d'eau un par un, nous pouvons voir que
- Toute l'eau du premier robinet va dans le bac inférieur.
- Une moitié de l'eau du deuxième robinet va dans le bac inférieur et l'autre moitié est répartie entre le bac inférieur et tombe du réseau.
- Un quart de l'eau du troisième robinet va dans le bac inférieur, un quart tombe du bas de la grille, un quart va dans le bac supérieur et un quart tombe du réseau vers la droite.
De cela, nous pouvons dire que (1 + 3/4 + 1/4 + 1/4) / 3 = 75%
l'eau est captée par les auges et (1/4 + 1/4 + 1/4) / 3 = 25%
tombe du réseau.
Défis
Vous pouvez relever tout ou partie de ces défis liés à cette configuration de débit d'eau ASCII. Ils sont tous du golf de code, la réponse la plus courte pour chaque défi est le gagnant. La réponse acceptée sera la personne qui réussit le plus de défis, avec la longueur totale du code comme bris d'égalité.
Défi 1
Écrivez un programme qui produit la fraction d'eau qui coule dans les auges pour une grille donnée. La sortie de l'exemple ci-dessus serait simplement 0.75
.
Défi 2
Écrivez un programme qui, étant donné une grille, dessine *
les points dans les endroits où l'eau coule comme je l'ai fait ci-dessus. Vous ne devez pas remplacer quoi que ce soit en dehors des caractères d'espacement et la grille ne doit pas changer de taille. Donc, pour quelque chose comme
f
/A
rien ne doit être fait car, bien que l'eau coule de chaque côté du A, elle ne peut pas être tirée vers la gauche sans retirer le /
et elle ne peut pas être tirée vers la droite sans agrandir la grille 2 × 2.
Défi 3 (mis à jour)
Écrivez un programme qui prend deux entiers non négatifs, le total T et le montant à garder K (T> = K). Générez et dessinez une grille avec exactement une f
telle que lorsque ce robinet versera T unités d'eau, exactement K coulera dans des auges. S'il est impossible de le faire dans une grille finie pour une paire (T, K) particulière, alors affichez «Impossible».
Clarifications (s'appliquent à tous les défis)
- L'entrée peut se faire via stdin, ou un fichier, ou même un appel de fonction sur la représentation sous forme de chaîne de la grille. Indiquez simplement comment exécuter différentes entrées.
- La sortie doit aller à stdout.
\A
etA/
etAA
sont également des creux comme vous vous en doutez.- Une grille w par h sera toujours un rectangle bien formaté de caractères w * h sans compter les nouvelles lignes. Il n'y aura aucun espace de fin manquant et aucune occurrence de
*
. - Les dimensions de la grille peuvent être aussi petites que 1 × 1 et arbitrairement grandes. (Arbitrairement grande dans la raison, int.maxValue ou similaire est une limite acceptable. Il en va de même pour T et K.)
- Un ruisseau au-dessus d'un
f
coule à travers lui. - Les robinets peuvent être n'importe où, pas seulement sur la rangée supérieure.
A
divise toujours la quantité d'eau versée exactement en deux.
Remarque: des choses comme /A
et //
sont parfaitement valides. L'eau ne circuler librement entre les personnages (bien que pour le défi 2 il n'y a pas assez de place pour dessiner).
Donc, dans la configuration
ff
/A
Le f
ruisseau gauche se déverse, frappe la /
et se déplace vers la gauche. Le f
courant de droite se déverse, frappe le A
, la moitié va à droite et la moitié va à gauche entre le A
et le /
.
par exemple
ff
**
*/A*
** *
** *
/A
si l'eau tombait sur le A
. Pour tous les défis, il serait bon de préciser s'il \A
s'agit d'un creux. Pour le troisième défi, faut- A
il supposer que 3 unités tombant sur un se divisent 1.5 / 1.5
(donc l'entrée est vraiment un nombre rationnel unique) ou est-ce 2 / 1
, dans quel cas, quel côté reçoit le 2
?
A
deux côtés obtiennent 1,5. C'est au codeur de s'assurer que la précision du flottement n'est pas un problème.)
f
s