Комната Зеркала


18

(Эта проблема очень похожа, но эта текущая проблема имеет дополнительные сложности.)


Представьте себе двухмерную комнату, где стены покрыты плоскими зеркалами.

Внезапно луч света попадает в комнату, где отсутствует кусок стены! Световой луч танцует по комнате, отражаясь от настенных зеркал и в конце концов покидая комнату.

Логика

Вам дается 5 переменных: W, H, X, Y и Z .
Теперь, что они имеют в виду?

W, H - размер комнаты (включая стены), где W - ширина, а H - высота.
X, Y - это координата отверстия в стене. Вы можете предположить, что это всегда находится на настенной плитке. Координаты начинаются с 0, ось X направлена ​​вправо, а ось Y направлена ​​вниз.
Z представляет собой одиночный символ, представляющий направление , что свет падает в комнату, либо \или /.

Комната должна быть построена из следующих персонажей:

  • | для горизонтальных стен
  • - для вертикальных стен
  • + для углов

Пример: (W = 7, H = 4)

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

Теперь, когда у нас есть комната, давайте уничтожим одну из настенных плиток, чтобы луч света упал в комнату. Балки света диагональные линии, представленные \и /символы.

Заменим настенную плитку при X = 2, Y = 0 \лучом света.

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

Падающий свет проходит по комнате по диагонали, пока не достигнет зеркальной стены. При ударе о стену направление меняется вдоль оси стены, и луч проходит дальше.

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

В этом примере световой луч попадает в точку, где происходит удар по углу стены, что приводит к тому, что луч полностью переворачивается и проходит весь путь назад, в конце концов покидая комнату.

Твое задание

Напишите программу, которая печатает комнату и весь путь светового луча, пока он снова не покинет комнату или не повторяется в бесконечном цикле.

вход

Ввод может быть получен в любом приемлемом формате, но он должен включать 4 целых числа W, H, X, Y и символ Z, например [10, 8, 0, 3, \].

Вы можете предположить, что:

  • W, H> = 3
  • X, Y всегда расположены у стены
  • Z сможет содержать только значения \и /.

Выход

Вы можете решить, будете ли вы возвращать строку или напрямую выводить в stdout.
Он должен включать стену комнаты и луч света (определенный символами ASCII выше).

правила

  • Стандартные лазейки запрещены.
  • Это , поэтому выигрывает самый короткий код в байтах на любом языке.
  • Разрешены все языки кодирования, созданные до публикации этого задания.

Примеры

Входные данные: [5, 4, 2, 0, /]

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

Входные данные: [20, 3, 0, 1, \]

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

Ввод: [10, 8, 0, 3, \] (Пример бесконечного цикла, который больше не покинет комнату.)

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

Удачи!

Ответы:


5

Древесный уголь , 55 байтов

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

Попробуйте онлайн! Ссылка на подробную версию кода. Редактировать: я не знаю почему, но этот код сейчас не работает. Вот измененная версия вместо этого. Объяснение оригинального кода:

BNN

Нарисуйте внешнюю коробку.

JNNPψ

Переместите курсор в точку входа и сделайте отверстие в поле в этой точке, чтобы это стало фоном.

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

Поверните в соответствующем направлении, чтобы напечатать начальный отрезок.

W¬℅KK«¹

Когда курсор находится над отверстием, нарисуйте следующий отрезок.

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

Ищите отверстие, в котором можно нарисовать следующий отрезок. Это работает, повторяя один и тот же код три раза. В первый раз ничего не происходит. Во второй раз, если курсор не находится над отверстием, он поворачивается вправо на 45 °, затем делает один шаг вправо, а затем поворачивается вправо на 45 °. Это отражается на одной оси. В третий раз, если курсор все еще не находится над отверстием, он поворачивается вправо на 90 °, затем делает один шаг вправо, а затем поворачивается вправо на 90 °. Это приводит к изменению отражения на другую ось. Если до сих пор нет отверстия, то достигнут угловой или бесконечный цикл, поэтому внешний цикл останавливается.


1
Чтобы люди могли протестировать ваш код, было бы полезно иметь ссылку на онлайн-код для игры в гольф с подробной версией отдельно.
Trichoplax



@trichoplax Ссылка TIO на самом деле показывает гольф-код в выводе, откуда я
Нил,

1
@trichoplax Когда вы используете, -v -slто на самом деле выполняется переведенный лаконичный код в напечатанном виде. Конечно, это зависит от того, генерирует ли вербосификатор правильный лаконичный код, потому что если это не так, то генерируемый код дает сбой, даже если исходный подробный код был технически верным.
Нил
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.