Ruang Cermin

18

(Tantangan ini sangat mirip, tetapi tantangan saat ini memiliki komplikasi tambahan.)


Bayangkan sebuah ruangan 2 dimensi, di mana dindingnya dilapisi dengan cermin datar.

Tiba-tiba, seberkas cahaya menghantam ruangan, tempat sepotong dinding hilang! Sinar lampu menari di sekitar ruangan, dipantulkan oleh cermin dinding, dan akhirnya meninggalkan ruangan lagi.

Logika

Anda diberikan 5 variabel: W, H, X, Y dan Z .
Sekarang, apa artinya itu?

W, H adalah ukuran ruangan (termasuk dinding), dengan W menjadi lebar dan H menjadi tinggi.
X, Y adalah koordinat bahwa dinding memiliki lubang. Anda dapat mengasumsikan bahwa ini selalu terletak di ubin dinding. Koordinat berbasis 0, dengan sumbu X mengarah ke kanan dan sumbu Y mengarah ke bawah.
Z adalah karakter tunggal, mewakili arah bahwa cahaya jatuh ke dalam ruangan, baik \atau /.

Kamar harus dibangun dari karakter berikut:

  • | untuk dinding horizontal
  • - untuk dinding vertikal
  • + untuk sudut

Contoh: (W = 7, H = 4)

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

Sekarang kita memiliki ruangan, mari kita hancurkan salah satu ubin dinding, jadi seberkas cahaya jatuh ke dalam ruangan. Balok cahaya adalah garis diagonal, diwakili oleh \dan /karakter.

Mari kita ganti ubin dinding di X = 2, Y = 0 dengan \seberkas cahaya.

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

Cahaya yang masuk bergerak secara diagonal melintasi ruangan sampai menyentuh dinding cermin. Jika dinding tertabrak, arah berbalik sepanjang sumbu dinding, dan sinar berjalan.

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

Dalam contoh ini, sinar cahaya sampai ke titik di mana sudut dinding dipukul, yang menimbulkan bahwa balok akan terbalik sepenuhnya dan bergerak sepanjang jalan kembali, akhirnya meninggalkan ruangan.

Tugas Anda

Tulis sebuah program yang mencetak ruangan dan seluruh jalur berkas cahaya, sampai ia meninggalkan ruangan lagi atau mengulangi menjadi loop yang tak terbatas.

Memasukkan

Input dapat diterima dalam format apa pun yang masuk akal, tetapi harus menyertakan 4 bilangan bulat W, H, X, Y, dan karakter Z, misalnya [10, 8, 0, 3, \].

Anda dapat berasumsi bahwa:

  • W, H> = 3
  • X, Y selalu terletak di dinding
  • Z hanya akan dapat memuat nilai \dan /.

Keluaran

Anda dapat memutuskan apakah Anda mengembalikan string atau langsung menghasilkan stdout.
Itu harus menyertakan dinding ruangan dan berkas cahaya (ditentukan oleh karakter ASCII di atas).

Aturan

  • Celah standar dilarang.
  • Ini adalah , jadi kode terpendek dalam byte, dalam bahasa apa pun, menang.
  • Semua bahasa pengkodean yang dibuat sebelum publikasi tantangan ini diizinkan.

Contohnya

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

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

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

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

Input: [10, 8, 0, 3, \] (Contoh loop tak terbatas yang tidak akan meninggalkan ruangan lagi.)

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

Semoga berhasil!

Ian H.
sumber

Jawaban:

5

Arang , 55 byte

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

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Sunting: Saya tidak tahu mengapa tetapi kode itu tidak berfungsi saat ini. Ini versi yang diubah. Penjelasan kode asli:

BNN

Gambar kotak luar.

JNNPψ

Pindahkan kursor ke titik masuk dan buat lubang di kotak pada titik ini, jadi ini menjadi latar belakang.

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

Putar ke arah yang sesuai untuk mencetak segmen garis awal.

W¬℅KK«¹

Saat kursor berada di atas lubang, gambarkan segmen baris berikutnya.

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

Cari lubang untuk menggambar segmen garis berikutnya. Ini berfungsi dengan mengulangi kode yang sama tiga kali. Pertama kali, tidak ada yang terjadi. Kali kedua, jika kursor tidak melewati lubang, ia berputar ke kanan 45 °, kemudian mengambil satu langkah ke kanan, lalu berputar ke kanan 45 °. Ini memiliki efek memantulkannya dalam satu sumbu. Ketiga, jika kursor masih belum melewati lubang, ia berputar ke kanan 90 °, kemudian mengambil satu langkah ke kanan, kemudian berputar ke kanan 90 °. Ini memiliki efek mengubah refleksi ke sumbu lainnya. Jika masih belum ada lubang, maka sudut atau loop tak terbatas telah tercapai, sehingga loop luar terhenti.

Neil
sumber
1
Agar orang dapat menguji kode Anda berfungsi, itu akan membantu untuk memiliki tautan ke kode golf online, dengan versi verbose secara terpisah.
trichoplax
@trichoplax itu mudah
MD XF
@trichoplax TIO tautan benar-benar menunjukkan kode golf di output, yang mana saya salin dan tempel dari ...
Neil
1
@trichoplax Bila Anda gunakan -v -sl maka sebenarnya kode ringkas yang diterjemahkan seperti yang dicetak yang dijalankan. Ini tentu saja tergantung pada deverbosifier yang menghasilkan kode ringkas yang benar, karena jika tidak, maka kode yang dihasilkan gagal, walaupun kode verbose asli secara teknis benar.
Neil