Bagaimana jika kita memiliki koridor yang terdiri dari dua cermin paralel?
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
Sekarang, kami menyinari laser ke bawah ...
| \ |
| \ |
| \ |
| \ |
| \ |
| \ |
| \ |
| \|
| /|
| / |
Oh lihat. Itu memantul, menjelang akhir, di sana.
Bagaimana jika kita menggambar dua laser tetapi tidak ke arah yang berlawanan?
| \ / |
| \ / |
| \/ |
| /\ |
| / \ |
| / \ |
| / \ |
|/ \|
|\ /|
| \ / |
Hmm, mereka sepertinya tidak bertemu, di sana. Itu nyaman. Apa yang terjadi jika kedua laser menempati ruang yang sama?
| \ / |
| \ / |
| \ / |
| X |
| / \ |
| / \ |
| / \ |
| / \|
|/ /|
|\ / |
Saya kira itu cukup jelas, ya?
Menggambar diagram ini dengan tangan cukup melelahkan (percayalah pada ini). Mungkin beberapa kode bisa melakukannya untuk kita?
- Tulis beberapa kode untuk menampilkan dua cermin paralel, dengan dua laser yang memantul dan berpotongan.
- Input (semua bilangan bulat):
- Lebar koridor
- Panjang koridor
- Posisi awal laser yang tepat (diindeks nol, harus kurang dari lebar)
- Posisi awal laser sebelah kiri (diindeks nol, harus kurang dari lebar)
- Proses
- Jika laser benar, itu akan ditarik satu ruang ke kanan pada baris berikut.
- Jika laser dibiarkan menyala, itu akan ditarik satu ruang ke kiri pada baris berikut.
- Jika laser tidak dapat mengambil langkah ke samping, itu akan mengubah arahnya, tetapi bukan posisinya.
- Jika kedua laser memiliki indeks yang sama, cetak huruf besar X pada indeks tersebut.
- Keluaran
- Sebuah string dengan banyak garis
- Setiap baris dimulai dan diakhiri dengan karakter pipa (|)
- Laser yang tepat dilambangkan dengan back slash (\)
- Laser sisi kiri dilambangkan dengan garis miring ke depan (/)
- Perpotongan dua laser dilambangkan dengan huruf besar X.
- Bahasa apapun
- Saya ingin melihat tautan TIO
- Mencoba memperbaikinya dalam jumlah byte terkecil
Uji kasus
lebar: 6 panjang: 10 kanan: 1 kiri: 4
| \ / |
| \/ |
| /\ |
| / \ |
|/ \|
|\ /|
| \ / |
| \/ |
| /\ |
| / \ |
lebar: 6 panjang: 10 kanan: 0 kiri: 1
|\/ |
|/\ |
|\ \ |
| \ \ |
| \ \ |
| \ \|
| \/|
| /\|
| / /|
| / / |
lebar: 4 panjang: 10 kanan: 2 kiri: 0
|/ \ |
|\ \|
| \ /|
| X |
| / \|
|/ /|
|\ / |
| X |
|/ \ |
|\ \|
lebar: 20 panjang: 5 kanan: 5 kiri: 15
| \ / |
| \ / |
| \ / |
| \ / |
| \ / |
lebar: 5 panjang: 6 kanan: 2 kiri: 2
| X |
| / \ |
|/ \|
|\ /|
| \ / |
| X |
lebar: 1 panjang: 2 kanan: 0 kiri: 0
|X|
|X|
Jawaban:
Stax , 40 byte
Jalankan dan debug itu
Cobalah online!
Cukup yakin ini bisa golf lebih lanjut.
Masukan diberikan dalam bentuk
width [right-going left-going] length
(per komentar oleh @EngineerToast).Setara ASCII:
sumber
width [right-going left-going] length
JavaScript (ES6), 149 byte
Mengambil input dalam sintaks currying
(w)(h)([a,b])
.Cobalah online!
Berkomentar
sumber
Python 2 , 119 byte
Cobalah online!
sumber
\\/
ke\/
? Meskipun garis miring terbalik ditafsirkan dua kali, garis miring terbalik masih tidak akan lepas.Python 2 , 168 byte
Cobalah online!
sumber
d
!Python 2 ,
187181179177174172171 byteCobalah online!
Rekursif:
Python 2 , 172 byte
Cobalah online!
Rekursif, cetak alternatif:
Python 2 , 172 byte
Cobalah online!
sumber
C (dentang) ,
240236208 byteCobalah online!
f () mengambil parameter sebagai berikut:
x
= width,y
= length,r
= Posisi awal garis kanan yang sedang berjalan awall
= Posisi awal garis yang awalnya akan berjalan-4 Bytes. kredit Kevin Cruijssen. Terima kasih
sumber
while
kefor
untuk menghapus{}
dan salah satu dari titik koma. Dan 1 byte lagi dengan mengubahc&&d
kec&d
. Coba online 236 byte .Kanvas ,
6640 byteCoba di sini!
sumber
Arang ,
5650 byteCobalah online! Tautan adalah untuk mengucapkan versi kode. Sunting: Disimpan 6 byte dengan mengurangi ketergantungan pada pivoting. Penjelasan:
Cetak sisi-sisinya.
Lingkari kedua laser.
Pindah ke awal laser.
Lingkarkan di atas ketinggian.
Gambarlah
\
atau/
ke arah yang sesuai, kecuali kuadratnya tidak kosong, dalam hal ini gambarlah sebuahX
.Sudahkah kita mencapai sisi?
Jika demikian maka ambil satu langkah ke samping dan membalikkan arah perjalanan.
sumber
Java (JDK 10) , 186 byte
Cobalah online!
sumber
PHP,
177 169166 bytemembutuhkan PHP 7.1 untuk indeks string negatif, PHP 5.5 atau lebih baru untuk mengindeks string literal.
untuk PHP <7.1 , hapus
^L
, ganti"X\/"
dengan"/X\\"
,:0
dengan+1:1
,[$e]
dengan[$e+1]
, hapus,."|"
dan masukkan|
sebelum baris baru. (+3 byte)untuk PHP <5.5 , ganti
"/X\\"
dengan$p
dan masukkan$p="/X\\";
di awal. (+2 byte)mengambil input dari argumen baris perintah. Jalankan dengan
-nr
atau coba online .sumber
Python 3 , 162 byte
Cobalah online!
sumber
Ruby , 117 byte
Cobalah online!
Lambda anonim mengambil input sebagai lebar
w
, tinggih
dan berbagai titik awala
.sumber
PowerShell ,
243233222205 byteCobalah online!
Aduh. blok-blok logika itu besar dan kotor dan sebagian besar digandakan. Langkah selanjutnya adalah menulis ulang mereka sehingga mereka tidak membutuhkan pernyataan lain.
sumber
Python 2,
165164 byteMenyimpan satu byte berkat Jonathan Frech.
Cobalah online!
sumber
\\/
setara dengan\/
.K (ngn / k) , 58 byte
Cobalah online!
fungsi anonim yang menerima tiga argumen:
x
lebar,y
panjang,z
sepasang posisi awal untuk lasersumber
C (gcc) , 169 byte
Cobalah online!
sumber
Kotlin ,
322311302 byteMengubah cara saya menempatkan arah laser dalam string selama 11 byte. Tugas dipindahkan dari kapan selama 9 byte.
Cobalah online!
sumber