Une salle de miroirs

18

(Ce défi est très similaire, mais ce défi actuel a des complications supplémentaires.)


Imaginez une pièce à 2 dimensions, où les murs sont plaqués de miroirs plats.

Soudain, un faisceau de lumière entre dans la pièce, où il manque un morceau de mur! Le faisceau lumineux danse autour de la pièce, se reflétant dans les miroirs muraux, et quittant finalement la pièce.

La logique

On vous donne 5 variables: W, H, X, Y et Z .
Maintenant, que signifient-ils?

W, H est la taille de la pièce (y compris les murs), W étant la largeur et H étant la hauteur.
X, Y est la coordonnée où le mur a le trou. Vous pouvez supposer que cela se trouve toujours sur une tuile murale. Les coordonnées sont basées sur 0, l'axe X pointant vers la droite et l'axe Y pointant vers le bas.
Z est un caractère unique, représentant la direction dans laquelle la lumière tombe dans la pièce, soit \ou /.

La salle doit être constituée des personnages suivants:

  • | pour murs horizontaux
  • - pour murs verticaux
  • + pour les coins

Exemple: (W = 7, H = 4)

+-----+
|     |
|     |
+-----+

Maintenant que nous avons une pièce, détruisons l'un des carreaux de mur, donc un faisceau de lumière tombe dans la pièce. Les faisceaux lumineux sont des lignes diagonales, représentées par des caractères \et /.

Remplaçons la tuile murale à X = 2, Y = 0 par un \faisceau de lumière.

+-\---+
|     |
|     |
+-----+

La lumière entrante traverse la pièce en diagonale jusqu'à ce qu'elle heurte un mur de miroir. Si un mur est touché, la direction s'inverse le long de l'axe du mur et le faisceau se déplace.

+-\---+
|\ \/\|
| \/\/|
+-----+

Dans cet exemple, le faisceau lumineux atteint un point où un coin du mur est touché, ce qui inflige que le faisceau s'inverse complètement et se déplace complètement en arrière, pour finalement quitter la pièce.

Ta tâche

Écrivez un programme qui imprime la pièce et tout le trajet du faisceau lumineux, jusqu'à ce qu'il quitte à nouveau la pièce ou se répète en boucle infinie.

Contribution

L'entrée peut être reçue dans n'importe quel format raisonnable, mais elle doit inclure les 4 entiers W, H, X, Y et le caractère Z, par exemple [10, 8, 0, 3, \].

Vous pouvez supposer que:

  • W, H> = 3
  • X, Y sont toujours situés sur un mur
  • Z ne pourra contenir que les valeurs \et /.

Production

Vous pouvez décider si vous renvoyez une chaîne ou si vous la sortez directement stdout.
Il doit inclure le mur de la pièce et le faisceau lumineux (défini par les caractères ASCII ci-dessus).

Règles

  • Les failles standard sont interdites.
  • C'est le , donc le code le plus court en octets, dans n'importe quelle langue, gagne.
  • Tous les langages de codage créés avant la publication de ce défi sont autorisés.

Exemples

Contribution: [5, 4, 2, 0, /]

+-/-+
|/ /|
|\/ |
+---+

Contribution: [20, 3, 0, 1, \]

+------------------+
\/\/\/\/\/\/\/\/\/\|
+------------------+

Entrée: [10, 8, 0, 3, \] (Exemple d'une boucle infinie qui ne quittera plus la pièce.)

+--------+
|/\/\/\/\|
|\/\/\/\/|
\/\/\/\/\|
|\/\/\/\/|
|/\/\/\/\|
|\/\/\/\/|
+--------+

Bonne chance!

Ian H.
la source

Réponses:

5

Fusain , 55 octets

BNNJNNPψ↷⎇⁼δ/⎇∧⁻⁻θ¹ζIε⁷I3⎇∧IζIε⁵I1W¬℅KK«¹F³¿∧κ℅KK«↷κ¶↷κ

Essayez-le en ligne! Le lien est vers la version détaillée du code. Edit: je ne sais pas pourquoi mais ce code ne fonctionne pas en ce moment. Voici une version modifiée à la place. Explication du code d'origine:

BNN

Dessinez la boîte extérieure.

JNNPψ

Déplacez le curseur sur le point d'entrée et faites un trou dans la boîte à ce point, de sorte que cela devienne l'arrière-plan.

↷⎇⁼δ/⎇∧⁻⁻θ¹ζIε⁷I3⎇∧IζIε⁵I1P

Faites pivoter dans la direction appropriée pour imprimer le segment de ligne initial.

W¬℅KK«¹

Pendant que le curseur se trouve sur un trou, tracez le segment de ligne suivant.

F³¿∧κ℅KK«↷κ¶↷κ

Recherchez un trou dans lequel tracer le segment de ligne suivant. Cela fonctionne en répétant le même code trois fois. La première fois, rien ne se passe. La deuxième fois, si le curseur n'est pas sur un trou, il tourne à droite de 45 °, puis fait un pas vers la droite, puis tourne à droite de 45 °. Cela a pour effet de le refléter sur un axe. La troisième fois, si le curseur n'est toujours pas au-dessus d'un trou, il pivote de 90 ° vers la droite, puis fait un pas vers la droite, puis tourne de 90 ° vers la droite. Cela a pour effet de changer la réflexion sur l'autre axe. S'il n'y a toujours pas de trou, alors un coin ou une boucle infinie a été atteint, donc la boucle extérieure s'arrête.

Neil
la source
1
Pour que les gens puissent tester votre code, il serait utile d'avoir un lien vers le code joué en ligne, avec la version détaillée séparément.
trichoplax
@trichoplax qui était facile
MD XF
@trichoplax Le lien TIO montre en fait le code joué dans la sortie, où je le copie et le colle ...
Neil
1
@trichoplax Lorsque vous utilisez, -v -slc'est en fait le code succinct traduit tel qu'imprimé qui est exécuté. Cela dépend bien sûr du fait que le déverbosificateur génère un code succinct correct, car si ce n'est pas le cas, le code généré échoue, même si le code détaillé original était techniquement correct.
Neil