Pokój luster

18

(To wyzwanie jest bardzo podobne, ale obecne wyzwanie ma dodatkowe komplikacje.)


Wyobraź sobie dwuwymiarowy pokój, w którym ściany są pokryte płaskimi lustrami.

Nagle promień światła uderza w pokój, w którym brakuje kawałka ściany! Wiązka światła tańczy wokół pokoju, odbijana przez lustra ścienne i ostatecznie opuszczając pokój.

Logika

Otrzymaniem 5 zmiennych: W, H, X, Y i Z .
Co one oznaczają?

W, H jest rozmiarem pomieszczenia (w tym ścian), przy czym W oznacza szerokość, a H wysokość.
X, Y jest współrzędną, w której ściana ma otwór. Możesz założyć, że zawsze znajduje się na kafelku ściennym. Współrzędne są oparte na 0, z osią X skierowaną w prawo, a oś Y skierowaną w dół.
Z oznacza jeden znak, co oznacza kierunek, w którym światło wchodzi do pomieszczenia, albo \czy /.

Pokój musi być zbudowany z następujących postaci:

  • | do ścian poziomych
  • - do ścian pionowych
  • + na zakręty

Przykład: (W = 7, H = 4)

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

Teraz, kiedy mamy pokój, zniszczmy jeden z kafelków na ścianie, więc promień światła wpada do pokoju. Wiązki światła to ukośne linie reprezentowane przez znaki \i /.

Zastąpmy płytkę ścienną przy X = 2, Y = 0 \wiązką światła.

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

Przychodzące światło wędruje po przekątnej przez pokój, aż trafi w lustrzaną ścianę. W przypadku uderzenia w ścianę kierunek odwraca się wzdłuż osi ściany, a wiązka przesuwa się dalej.

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

W tym przykładzie wiązka światła dociera do punktu, w którym uderza w róg ściany, co powoduje, że wiązka zostaje całkowicie odwrócona i cofa się całkowicie, ostatecznie opuszczając pomieszczenie.

Twoje zadanie

Napisz program, który drukuje pokój i całą ścieżkę wiązki światła, dopóki nie opuści pokoju ponownie lub nie powtórzy się w nieskończonej pętli.

Wejście

Wejście może być umieszczona w dowolnym odpowiednim formacie, lecz musi obejmować liczby całkowite w 4, H, X, Y i Z postaci, np [10, 8, 0, 3, \].

Możesz założyć, że:

  • W, H> = 3
  • X, Y zawsze znajdują się na ścianie
  • Z będzie mógł zawierać tylko wartości \i /.

Wynik

Możesz zdecydować, czy zwrócisz ciąg znaków, czy bezpośrednio wyjdziesz na stdout.
Musi zawierać ścianę pokoju i wiązkę światła (zdefiniowane przez znaki ASCII powyżej).

Zasady

  • Standardowe luki są zabronione.
  • To jest , więc wygrywa najkrótszy kod w bajtach, w dowolnym języku.
  • Wszystkie języki kodowania, które zostały utworzone przed publikacją tego wyzwania, są dozwolone.

Przykłady

Wejście: [5, 4, 2, 0, /]

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

Wejście: [20, 3, 0, 1, \]

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

Wejście: [10, 8, 0, 3, \] (Przykład nieskończonej pętli, która nie opuści pokoju ponownie.)

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

Powodzenia!

Ian H.
źródło

Odpowiedzi:

5

Węgiel , 55 bajtów

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

Wypróbuj online! Link jest do pełnej wersji kodu. Edycja: Nie wiem dlaczego, ale ten kod nie działa teraz. Oto poprawiona wersja. Objaśnienie oryginalnego kodu:

BNN

Narysuj zewnętrzne pudełko.

JNNPψ

Przesuń kursor do punktu wejścia i zrób w tym miejscu dziurę w pudełku, aby stało się to tłem.

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

Obróć w odpowiednim kierunku, aby wydrukować początkowy segment linii.

W¬℅KK«¹

Gdy kursor znajduje się nad otworem, narysuj następny segment linii.

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

Poszukaj dziury, w której narysujesz następny segment linii. Działa to poprzez powtórzenie tego samego kodu trzy razy. Za pierwszym razem nic się nie dzieje. Za drugim razem, gdy kursor nie znajduje się nad otworem, obraca się w prawo o 45 °, następnie robi krok w prawo, a następnie obraca się w prawo o 45 °. To powoduje odbicie w jednej osi. Za trzecim razem, gdy kursor nadal nie znajduje się nad otworem, obraca się w prawo o 90 °, następnie robi krok w prawo, a następnie obraca się w prawo o 90 °. To powoduje zmianę odbicia na drugą oś. Jeśli nadal nie ma dziury, osiągnięto narożnik lub nieskończoną pętlę, więc zewnętrzna pętla zatrzymuje się.

Neil
źródło
1
Aby ludzie mogli przetestować Twój kod, warto mieć link do kodu golfowego online, z pełną wersją osobno.
trichoplax
@trichoplax, który był łatwy
MD XF
@trichoplax Link TIO faktycznie pokazuje kod golfowy na wyjściu, gdzie kopiuję i wklejam go z ...
Neil
1
@trichoplax Kiedy używasz, -v -slto tak naprawdę jest przetłumaczony zwięzły kod po wydrukowaniu, który zostanie wykonany. Zależy to oczywiście od generatora poprawek generującego poprawny zwięzły kod, ponieważ jeśli nie, wygenerowany kod zawiedzie, mimo że oryginalny pełny kod był technicznie poprawny.
Neil,