Refleksi ASCII dalam sebuah kotak
Anda mungkin semua tahu Hukum Refleksi , dalam tantangan ini Anda akan memvisualisasikan lintasan bola di dalam kotak.
Terkait: ASCII Ball in Box Animation dan ASCII Doodling: Laser in a Box
Tugas
Anda diberi tiga pasangan bilangan bulat W,H
, x,y
dan dx,dy
- yang pertama mewakili ukuran kotak, yang kedua posisi awal dan pasangan ketiga adalah arah di mana bola mulai bergerak.
Tugasnya adalah untuk memvisualisasikan pergerakan bola sampai berhenti bergulir, ini terjadi begitu bola berada pada posisi yang sebelumnya atau menyentuh sudut.
Karakter *
harus memvisualisasikan lintasan bola dan +
menandai posisi akhirnya, sisa kotak harus terdiri dari (spasi).
Contohnya
Untuk menjabarkannya sedikit lebih jelas, dalam contoh-contoh ini _
akan mewakili spasi putih. Juga tahap perantara hanya ada di sini untuk klarifikasi, Anda hanya perlu menampilkan tahap terakhir, contoh-contoh ini 1
-indexed.
Diberikan W = 3, H = 5
, x = 3, y = 2
dan dx = -1, dy = 1
:
___ ___ ___ ___
__* __* __* __*
___ -> _*_ -> _*_ -> _+_
___ *__ *__ *_*
___ ___ _*_ _*_
- Bola dimulai pada titik
(3,2)
dan - bergerak ke arah
(-1,1)
, menabrak dinding di(1,4)
dan - tercermin, arah baru
(1,1)
. Itu menabrak dinding lagi(2,5)
- di mana ia akan tercermin. Arah baru adalah
(1,-1)
dan langsung mengenai dinding(3,4)
, - lagi itu akan tercermin ke arah
(-1,-1)
. Sekarang akan melakukan perjalanan melalui poin(2,3),(1,2)
, tercermin dll. Tetapi karena sudah mengunjungi posisi(2,3)
itu berhenti di sana.
Contoh ini menunjukkan, apa yang terjadi jika bola menyentuh sudut. Untuk ini W = 7, H = 3
, x = 1, y = 3
dan dx = 1, dy = -1
:
_______ __*____ __*____ __*___+
_______ -> _*_____ -> _*_*___ -> _*_*_*_
*______ *______ *___*__ *___*__
- Posisi awal adalah
(1,3)
, - bola sekarang bergerak ke arah
(1,-1)
sampai menyentuh dinding(3,1)
- di mana ia tercermin ke arah baru
(1,1)
. - Pada saat
(5,3)
itu akan tercermin dan melakukan perjalanan ke arah yang baru(1,-1)
. Tiba-tiba berhenti(7,1)
karena itu sudut.
Diberikan W = 10, H = 6
, x = 6, y = 6
dan dx = 1, dy = 1
:
__________ __________ ________*_ ________*_ ________*_ __*_____*_ __*_____*_
__________ _________* _________* _______*_* _______*_* _*_____*_* _*_*___*_*
__________ -> ________*_ -> ________*_ -> ______*_*_ -> *_____*_*_ -> *_____*_*_ -> *___*_*_*_
__________ _______*__ _______*__ _____*_*__ _*___*_*__ _*___*_*__ _*___+_*__
__________ ______*___ ______*___ ____*_*___ __*_*_*___ __*_*_*___ __*_*_*___
_____*____ _____*____ _____*____ ___*_*____ ___*_*____ ___*_*____ ___*_*____
Spesifikasi input
Input terdiri dari tiga pasangan integer W,H
, x,y
dan dx,dy
, Anda dapat mengambil input dalam format apa pun yang paling masuk akal untuk bahasa pemrograman Anda dan urutannya tidak masalah. Namun input yang diterima tidak boleh meng-encode informasi lebih banyak dari pasangan ini (lihat jawaban ini sebagai contoh).
W,H >= 1
x,y
baik1
-indeks (1 <= x <= W
dan1 <= y <= H
) atau0
-indeks (0 <= x < W
dan0 <= y < H
), harap tentukan pengindeksan apa yang Anda pilihdx,dy
selalu-1
atau1
Input yang tidak valid dapat diabaikan.
Spesifikasi keluaran
- Tidak ada spasi putih terkemuka dibolehkan
- Ruang putih trailing dapat dihilangkan
- Ruang putih trailing tidak diperbolehkan jika tidak cocok dengan kotak
- Mengejar baris baru ( setelah semua jalur terkait keluaran) diizinkan
Mari kita ambil contoh pertama:
(good by 2)
__*
_+ (good by 2)
*_*_ (bad by 3)
(bad by 4)
_*_
(good by 4)
Uji kasus
Dengan asumsi input memiliki format (W,H,x,y,dx,dy)
dan 1
-indeks telah dipilih, berikut adalah beberapa kasus uji (sekali lagi _
ada di sini untuk mewakili spasi putih!):
Input: 1,1,1,1,1,1
Keluaran:
+
Input: 3,3,3,3,1,1
Keluaran:
___
___
__+
Input: 3,3,3,3, -1, -1
Keluaran:
+__
_*_
__*
Input: 7,3,1,3,1, -1
Keluaran:
__*___+
_*_*_*_
*___*__
Input: 10,6,6,6,1,1
Keluaran:
__*_____*_
_*_*___*_*
*___*_*_*_
_*___+_*__
__*_*_*___
___*_*____
Input: 21,7,6,4, -1, -1
Keluaran:
__*_______*_______*__
_*_*_____*_*_____*_*_
*___*___*___*___*___*
_*___*_*_____*_*___*_
__*___*_______+___*__
___*_*_________*_*___
____*___________*____
Ini adalah kode-golf , sehingga program / fungsi terpendek menang, tetapi segala upaya dihargai.
1
menghilangkan batasan -indeks jika Anda suka (?) Tentang pertanyaan pertama itu, tidak yakin apa yang Anda maksud tetapi kedengarannya ok. Saya kira segala sesuatu yang merupakan bijection ({-1,1}x{-1,1} ≡ "Your space"
) akan baik.Jawaban:
Arang , 50 byte
Cobalah online! Tautan adalah untuk mengucapkan versi kode. Membutuhkan waktu lima input:
w
,h
,x
,y
,a
.x
dany
tidak diindeks.a
mewakilidx
dandy
sesuai dengan pengkodean berikut:Penjelasan:
(note trailing space) Mengisi latar belakang dengan spasi pada lebar dan tinggi input. (Biasanya setiap kuadrat latar belakang adalah string kosong, yang kemudian dikonversi menjadi spasi pada output.)
Memindahkan kursor ke koordinat awal.
Putar ke sudut awal.
Mengulang selama kotak saat ini adalah spasi.
Mencetak tanda bintang dan bergerak maju ke arah saat ini.
Jika kursor bergerak di luar bujur asli,
Putar arah, lalu cetak baris baru (yang dengan mudah membawa kita kembali ke kotak sebelumnya) dan tanda bintang, yang bergerak ke arah yang baru.
Jika kursor bergerak kembali ke luar bujur asli,
Ambil kursor kembali ke kotak sebelumnya, lalu putar lagi, sehingga mencetak tanda bintang di arah lain.
Jika kursor masih di luar bujur, kita harus di sudut.
Jadi kembali ke alun-alun sebelumnya dan menyerah.
Ketika kita tidak bisa bergerak lagi, cetak tanda "+" dan berhenti.
sumber
Peek()
(yang saya lakukan sekarang).Peek
berfungsi lagi sekarangKalkulator Desmos - Non Bersaing untuk Membantu Pengetahuan Lebih Lanjut
Cobalah online!
Input:
Menengah:
Formula, disingkat:
Output:
Bagaimana itu bekerja:
Program gagal memenuhi kriteria terakhir - berhenti di titik persimpangan dan menandai dengan tanda +, sehingga diajukan sebagai informasi yang tidak bersaing untuk membantu orang lain menyelesaikan tantangan. Perhatikan bahwa untuk membuat Desmos bekerja ketika c = 0 atau c = b, faktor offset kecil 0,01 diperkenalkan, karena Desmos tampaknya memiliki batas Mod (A, B) dari (0, B) alih-alih [0, B )
sumber
Python 3 ,
293279 byteCobalah online!
sumber
fx,fy
dan menggantiTrue
dengan sesuatu seperti1
, lihat di sini