Refleksi ASCII dalam sebuah kotak

8

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,ydan 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 = 2dan 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 = 3dan 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 = 6dan dx = 1, dy = 1:

__________    __________    ________*_    ________*_    ________*_    __*_____*_    __*_____*_
__________    _________*    _________*    _______*_*    _______*_*    _*_____*_*    _*_*___*_*
__________ -> ________*_ -> ________*_ -> ______*_*_ -> *_____*_*_ -> *_____*_*_ -> *___*_*_*_
__________    _______*__    _______*__    _____*_*__    _*___*_*__    _*___*_*__    _*___+_*__
__________    ______*___    ______*___    ____*_*___    __*_*_*___    __*_*_*___    __*_*_*___
_____*____    _____*____    _____*____    ___*_*____    ___*_*____    ___*_*____    ___*_*____

Spesifikasi input

Input terdiri dari tiga pasangan integer W,H, x,ydan 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,ybaik 1-indeks ( 1 <= x <= Wdan 1 <= y <= H) atau 0-indeks ( 0 <= x < Wdan 0 <= y < H), harap tentukan pengindeksan apa yang Anda pilih
  • dx,dyselalu -1atau1

Input yang tidak valid dapat diabaikan.

Spesifikasi keluaran

  1. Tidak ada spasi putih terkemuka dibolehkan
  2. Ruang putih trailing dapat dihilangkan
  3. Ruang putih trailing tidak diperbolehkan jika tidak cocok dengan kotak
  4. 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 , sehingga program / fungsi terpendek menang, tetapi segala upaya dihargai.

ბიმო
sumber
Saya menduga salah satu bahasa 2D (Penyu?) Mungkin sangat baik dengan tantangan ini.
Draco18s tidak lagi mempercayai SE
1
Apakah diizinkan untuk menyandikan empat kemungkinan nilai dx / dy sebagai empat bilangan bulat ganjil? Seberapa pentingkah x dan y yang diindeks 1?
Neil
Saya akan 1menghilangkan 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.
ბიმო
Diedit dalam pengindeksan, dapatkah Anda lebih spesifik pada pertanyaan Anda yang lain?
ბიმო
1
Saya ingin melihat jawaban arang untuk lol ini.
Magic Gurita Guci

Jawaban:

8

Arang , 50 byte

UONN JNN↷NW⁼ KK«*¿¬KK«↷²¶*¿¬KK«↷²¶↷²*¿¬KK«↷²¶»»»»+

Cobalah online! Tautan adalah untuk mengucapkan versi kode. Membutuhkan waktu lima input: w, h, x, y, a. xdan ytidak diindeks. amewakili dxdan dysesuai dengan pengkodean berikut:

a mod 8 == 1 => dx = 1, dy = 1
a mod 8 == 3 => dx = -1, dy = 1
a mod 8 == 5 => dx = -1, dy = -1
a mod 8 == 7 => dx = 1, dy = -1

Penjelasan:

UONN 

(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.)

JNN

Memindahkan kursor ke koordinat awal.

↷N

Putar ke sudut awal.

W⁼ KK«

Mengulang selama kotak saat ini adalah spasi.

    *

Mencetak tanda bintang dan bergerak maju ke arah saat ini.

    ¿¬KK«

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.

        ¿¬KK«

Jika kursor bergerak kembali ke luar bujur asli,

            ↷²¶↷²*

Ambil kursor kembali ke kotak sebelumnya, lalu putar lagi, sehingga mencetak tanda bintang di arah lain.

            ¿¬KK«

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.

Neil
sumber
1
Bagus! Ini adalah TIO untuk mereka yang ingin mencobanya.
ბიმო
@BruceForte Terima kasih, tapi saya tidak ingin menautkan ke TIO sampai saya punya solusi menggunakan Peek()(yang saya lakukan sekarang).
Neil
Ups, Peekberfungsi lagi sekarang
ASCII
2

Kalkulator Desmos - Non Bersaing untuk Membantu Pengetahuan Lebih Lanjut

Cobalah online!

Input:

X as X position to Start
Y as Y position to Start
s as slope -> -1 for dX/dY = -1, +1 for dX/dY = +1
h as height of box, with 0-indexing
w as width of box, with 0-indexing

Menengah:

Let b = gcd(h,w),  
Let c = |b-(X-sY)%2b| Or |b-mod(X-sY,2b)|

Formula, disingkat:

(|b-(x+y)%2b|-c)(|b-(x-y)%2b|-c)=0

Output:

x as x position, 0-indexed, where the ball will land when released
y as y position, 0-indexed, where the ball will land when released

Bagaimana itu bekerja:

(|b-(x+y)%2b|-c)*(|b-(x-y)%2b|-c)=0
                ^ OR operation - |b-(x+y)%2b|-c=0 or |b-(x-y)%2b|-c=0
|b-(x+/-y)%2b|-c = 0
|b-(x+/-y)%2b| = c
|b-(x+/-y)%2b| = c means (b-(x+/-y))%2b = + or -c 
b-(x+/-y)%2b = +/- c -> b +/- c = (x+/-y)%2b -> (x+/-y) = n*2*b + b +/- c 
Where n is integer.  This will force patterns to repeat every 2b steps in x and y.  
Initial pattern n=0: (x +/- y) = b +/- c -> y = +/- x + b +/- c
In the x positive and y positive plane only, these correspond to lines of positive and 
negative slope, set at intercept b, offset by c on either side.

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 )

Menandai
sumber
Saya kira Anda telah melihat ini ?
ბიმო
Sebenarnya, saya kutu buku terpotong dan kehilangan sekitar 4 hari waktu saya di rumah. Saya benar-benar menyukai masalah ini.
Tandai
Sama-sama, relevan .
ბიმო
1

Python 3 , 293 279 byte

w,h,x,y,i,j=map(int,input().split());x-=1;y-=1;l=[x[::]for x in[[' ']*w]*h]
while 1:
 a,b=((x,i)in[(0,-1),(w-1,1)]),((y,j)in[(0,-1),(h-1,1)])
 if a and b or l[y][x]!=' ':l[y][x]='+';break
 i,j=i*(-a*2+1),j*(-b*2+1);l[y][x]='*';x+=i;y+=j
print('\n'.join([''.join(x) for x in l]))

Cobalah online!

Andrew Dunai
sumber
1
Bagus! Anda dapat menyimpan beberapa byte dengan memperpendek fx,fydan mengganti Truedengan sesuatu seperti 1, lihat di sini
ბიმო
@BruceForte terima kasih! Saya lupa mengganti ini.
Andrew Dunai
1
-13 byte dengan mengubahnya menjadi fungsi.
Artemis masih tidak percaya
1
Tunggu, baru lihat berapa umur pertanyaan ini ... Namun saya tiba di sini dari HNQ ...
Artemis masih tidak percaya