MISE À JOUR DU SCORE : Comme ce défi est plus difficile que prévu, j'ai ajusté le score. Un programme qui peut résoudre une seule entrée miroir est une réponse valide. Les programmes plus sophistiqués obtiennent un bonus à leur score.
Il y a eu plusieurs puzzles sur PPCG pour trouver un chemin laser dans une boîte de miroirs. Dans ce puzzle, vous devez créer une boîte de miroirs pour correspondre à un certain nombre de destinations laser.
On vous donne une boîte et une spécification où les lasers doivent entrer et sortir. Votre programme doit placer exactement N miroirs double face dans la boîte pour répondre aux spécifications. Les rétroviseurs doivent être inclinés à 45 degrés mais peuvent être inclinés vers l'avant ou vers l'arrière.
Contribution
Votre programme doit accepter une grille de boîtes via STDIN, un argument de ligne de commande ou un fichier dans les exemples de format suivants:
+--G--+ +abcde+
G | f/////d
| /| a// c
+-----+ f |
+-b-e-+
Les paires de lettres ([a-zA-Z] peuvent être utilisées) indiquent l'entrée / sortie d'un maximum de 52 lasers. À l'intérieur de la boîte, il y aura N /
miroirs. Les dimensions de la boîte seront de 3 <= W, H <= 200. La boîte est composée de +|-
caractères. Il peut y avoir n'importe quel nombre de miroirs dans la boîte, y compris zéro.
Production
La sortie doit correspondre à l'entrée, sauf que les /
caractères peuvent être déplacés et / ou transformés en \
caractères. Votre programme doit envoyer une chaîne de boîte miroir correcte à STDOUT ou à un fichier, la nouvelle ligne à la fin étant facultative. Si aucun placement de miroirs ne peut répondre à la spécification d'entrée, sortez Impossible\n
. Exemples de solutions possibles:
+--G--+ +abcde+
G / | f \ \ d
| | a/ \ c
+-----+ f / //|
+-b-e-+
Exemple de test
Contribution:
+abcdefghijklmnopqrstuvwxyA-+
|/////////////// |
|/////////////// |
| |
+-Abcdefghijklmnopqrstuvwxya+
Exemple de sortie:
+abcdefghijklmnopqrstuvwxyA-+
|\ \|
|/ / |
|\\\\\\\\\\\\\\\\\\\\\\\\\\ |
+-Abcdefghijklmnopqrstuvwxya+
Notation (MISE À JOUR)
C'est du code-golf avec des bonus. Vous devez indiquer avec votre réponse combien de miroirs votre programme peut résoudre (N). Votre score est la longueur de votre programme en octets divisée par N. Cela permet aux gens d'entrer avec un programme simple, mais récompense plus de programmeurs d'ambition avec un bonus.
Failles standard interdites.
* 2^30
composantRéponses:
C # -
897862 octetsJ'ai trouvé un bug grave en mettant des miroirs dans des endroits où ils ne pouvaient pas être. Maintenant ça marche, j'espère! A également fait du golf léger, n'a pas pu laisser la boucle tandis que ... honteux.
Programme complet, prend l'entrée de STDIN, sort vers STDOUT.
C'était très amusant, cela résout bien le problème 7 par 5 (et lorsque vous retirez l'un des miroirs, ce qui le rend impossible), il a fallu environ 1 heure pour résoudre le 30 par 5.
7 par 5 Exemple:
Version impossible:
Quelque chose de différent (le programme ne regarde pas la disposition originale du miroir):
Solution 30 x 5:
Il examine chaque source laser tour à tour, et construit une route valide pour elle (si elle le peut), puis passe à la suivante. C'est une recherche assez simple en profondeur d'abord, qui doit savoir quelle source laser (cible) il regarde, combien de miroirs il lui reste à placer, la cellule actuelle dans laquelle il se trouve, la direction dans laquelle il se déplace et chaque cellule il est déjà visité (pour qu'il ne mette pas de miroir quelque part où il a déjà été). Les 3 derniers sont utilisés pour assembler le chemin de la cible actuelle et lors de la réinitialisation lorsque la cible change. Une fois tous les lasers connectés, il va de l'avant et comble les lacunes dont il n'a pas besoin de rester vide (une autre raison pour laquelle il doit savoir partout où il est visité).
Quand il construit des routes, il préfère aller "en avant" par rapport à l'insertion d'un miroir, et quand il le fait, il favorise un miroir "\" - cela est mieux vu dans l'exemple "quelque chose de différent" ci-dessus, où il saute la première cellule sous la le plus haut 'a', puis remplit continuellement un "\" s'il peut trouver une solution avec une, sinon un "/" (naturellement, si sauter la première cellule l'empêchait de trouver une solution, alors il revenir en arrière et essayer de mettre un miroir à la place).
la source
Python,
671654 octetsPas une solution, mais une tentative, lisez ci-dessous.
Je n'ai pas joué au golf au maximum, car je ne suis pas satisfait de la solution.
V
valide une solution donnée en parcourant le champF
pour chaque personnageC
qu'il trouve sur la touche. Les solutions sont générées au hasard. C'est moche, ça marche pour entry1, mais ça prend beaucoup de temps pour les autres entrées. Puisqu'il essaie au hasard des solutions, je ne considère pas que ce soit une solution réelle pour le problème donné; mais cela pourrait aider les autres.Courir:
echo "entry1.txt" | python script.py
la source