Кімната дзеркал


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 Посилання TIO насправді показує код для гольфу на виході, де я його копіюю і вставляю з ...
Ніл

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