J'ai rencontré une fois ce (mini) jeu où vous aviez 4 tuyaux verticaux ou plus qui étaient reliés par un certain nombre de tuyaux horizontaux et vous devez laisser tomber une balle ou de l'eau dans les tuyaux verticaux.
J'en connais 2 sortes:
- Mettez l'objet dans un seau / panier sous l'une des sorties (devinez quel tuyau pour le jeter)
- Devinez de quel tuyau proviendra l'objet.
Exemples de tuyaux:
| | |-------|
|-------| |-------|
| |-------| |
|-------|-------|-------|
| |-------| |
|-------| |-------|
|-------| |-------|
| |-------| |
Règles de base:
- Lorsque vous vous déplacez à travers un tuyau horizontal, l'objet descendra si possible
- Lorsque vous vous déplacez à travers un tuyau vertical, l'objet se transformera en tuyau horizontal lorsque cela sera possible.
Votre travail
- Écrivez un programme qui créera une grille aléatoire de tuyaux (voir des exemples de tuyaux).
- Il devrait y avoir au moins 4 tuyaux verticaux et une bonne quantité de tuyaux horizontaux au moins 10.
- La longueur des tuyaux verticaux dépend de vous.
- Montrez le chemin que l'objet a pris pour atteindre le fond et montrez combien de tours il a fallu pour y arriver.
- (Facultatif) entrée pour déterminer le point de départ, tuyaux numérotés 1..N de gauche à droite.
Afficher:
| vertical pipe
- horizontal pipe
: vertical pipe used by the object
= horizontal pipe used by the object
V Object starting point
^ Object ending point
Exemple:
V
: | |-------|
:=======: |-------|
| :=======: |
|-----!-:=======: |
| :=======:-------|
|-------| :=======:
|-------| :=======:
| :=======: |
^
14 turns were taken to get to the end.
Détails
L'objet entre dans le tuyau 1 et commence à descendre, va à gauche dans le premier tuyau horizontal.
Redescendre et dans le deuxième tuyau suivi d'un demi-tour dans le troisième tuyau.
À la fin du troisième tuyau, vous voyez un point d'exclamation,
ne devrait pas être dans votre résultat, mais je l'ai utilisé pour vous montrer que l'objet aurait pu aller de l'avant.
Cependant, la règle numéro 1 empêche cela.
Le gagnant sera déterminé par vote dans 3 semaines à partir de maintenant 24-02-2014 (jj-mm).
Bon codage ^. ^
la source
Réponses:
Mathematica
Le code 2D génère un graphique montrant le chemin de l'eau. J'ai affiché les nombres de sommets pour une vérification croisée pratique avec l'affichage 3D. Normalement, les nombres de sommets seraient cachés.
Contribution:
En fait, le résultat contient plusieurs objets. Le premier objet,,
result[[1]]
est le graphique 2D montré ici.Les tuyaux tridimensionnels sont
Tube
des (lignes 3D) tracées dans 3 espaces. Les coordonnées calculées sur la base des sommets du graphique 2D le long d'une 3e coordonnée qui a été générée de manière aléatoire (cela permet aux tuyaux de prendre différentes positions le long de y chaque fois que le code est exécuté.)Les axes sont affichés pour aider le lecteur à se convaincre que le rendu 3D est bien basé sur le rendu 2D.
L'entrée 3D qui nous intéresse ici est:
Le nombre ou les lignes, les colonnes et la colonne d'entrée sont extraits du code 2D. Il n'est pas nécessaire de les saisir à nouveau.
Code 2D
Dans les prochains jours, je documenterai et rangerai le code 2D et 3D.
Code 3D et résultats
la source
C #
(via LINQPad, en mode "Programme C #";)
Il va falloir appliquer Equitable Stroke Control, dans la mesure où tout golf peut aller, mais c'est mon approche en C # (enfin, LINQPad, mais qui veut tout le passe-partout nécessaire pour faire fonctionner une application C # complète?) .
Les définitions de grille sont variables, avec un certain nombre de tuyaux verticaux et la hauteur de la structure globale, et sont répétitivement aléatoires en passant une graine (voir le
PipeGrid
constructeur).En l'absence d'une réponse définitive quant à la manière dont l'objet se déplacerait si l'une ou l'autre direction était possible, je vous ai permis de spécifier un comportement à partir d'un certain nombre d'options (voir
SolveBehavior
énumération /PipeSolver
constructeur).Le départ vertical est définissable (voir
PipeSolver.Solve
).J'ai supposé que les tuyaux horizontaux sont toujours entre deux tuyaux verticaux adjacents , c'est-à-dire qu'aucun horizontal ne peut contourner un tuyau horizontal.
Mise à jour:
Craignant que mon ancienne sortie de texte brut puisse être un peu terne pour ce contexte de popularité, je propose une version étendue qui trace également le chemin emprunté en tant qu'image. Je l'ai modélisé comme une voiture, traversant un horrible réseau routier, essayant d'aller au fond, mais avec le pire GPS du monde qui vous oblige à faire un virage à chaque intersection.
En prime, cela permet également de voir plus clairement les «virages».
Profitez - vroom vroom !!
Exemples de résultats:
(verticales: 10, hauteur: 10, graine aléatoire: 5, pipe de départ: 2, comportement de résolution: FlipFlop})
la source
C #
Des moments de plaisir! :-)
Ce code garantit qu'il y a au moins un tuyau droit à chaque extrémité de chaque tuyau. Il garantit également qu'il n'y a pas de virages ambigus.
Production:
la source
Funciton
Comme si Funciton n'était pas déjà parmi les langues les plus inutiles au monde, c'est certainement le programme le plus inutile que j'ai écrit jusqu'à présent.
Étant donné que cela semble moche dans StackExchange en raison de l'espacement de ligne supplémentaire, envisagez d'exécuter ce qui suit dans la console JavaScript de votre navigateur pour résoudre ce problème:
Étant donné que Funciton n'a pas de générateur de nombres aléatoires, j'ai décidé de vous laisser entrer le modèle de tuyau. Étant donné que l'encodage du motif n'est pas évident, frapper les touches numériques de votre clavier au hasard est aussi bon qu'un générateur de nombres aléatoires.
L'entrée devrait être composée de trois nombres décimaux séparés par des espaces. Le premier nombre est la largeur (un de moins que le nombre de tuyaux verticaux); le second est l'indice du tuyau de départ et le dernier est un nombre quelconque qui code le modèle de tuyau horizontal; vous pouvez le rendre aussi grand que vous le souhaitez. Si la largeur est négative ou que l'indice du tuyau est hors limites, la sortie est
Impossiburu.
Le programme s'assure automatiquement qu'il n'y a jamais deux tuyaux horizontaux l'un à côté de l'autre, ce qui pourrait provoquer des virages ambigus.
Explication
Le programme principal trouve les deux premiers espaces et répartit les nombres. Il exécute le troisième (le modèle de tuyau)
░
puis appelle▒
avec le résultat, qui renvoie la sortie ainsi que le nombre de tours effectués. Il ajoute ensuite le texten turns were taken to get to the end.
, oùn
est le nombre de tours calculé par▒
.░
prend un nombre et insère un0
-bit après chaque1
-bit, garantissant ainsi qu'il n'y a jamais deux tuyaux horizontaux à la suite.▒
génère la sortie en appelant successivement▓
puis en décalant le bon nombre de bits du modèle de canal jusqu'à ce qu'il soit nul. Il incrémente ou décrémente également le «tuyau actuel» de manière appropriée.▓
génère une ligne de sortie. À chaque itération, il décale un bit du modèle de tuyau et décide ensuite de produire│
(+ 4 espaces),║
(+ 4 espaces)├────┤
,╔════╝
ou╚════╗
; dans les trois derniers cas, il supprime le premier caractère de l'itération suivante. La dernière itération génère│\r\n
ou║\r\n
selon le cas.Exemple de sortie
Contribution:
Production:
Contribution:
Production:
Contribution:
Production:
la source
Groovy, 311
Ici, il est formaté:
Sortie de l'échantillon:
Autre sortie:
(Je sais que j'ai fait du golf de code au lieu de la popularité, mais c'est juste mon style)
la source
Javascript
Le canevas HTML écoute les événements de clic et trouve la ligne de tuyaux la plus proche et l'utilise comme point de départ. La sortie est dessinée sur le canevas et il y a aussi une zone de texte contenant la sortie ASCII définie par l'OP.
L'algorithme garantira qu'il n'y a jamais deux tuyaux horizontaux de connexion. Autre que cette restriction, une probabilité est définie dans les variables initiales et est utilisée pour déterminer aléatoirement si un tuyau horizontal doit se produire ou non.
JSFIDDLE
Production
la source