Ini adalah tantangan yang terinspirasi oleh Rotasi Chebyshev . Saya sarankan mencari jawaban di sana untuk mendapatkan inspirasi untuk tantangan ini.
Diberi titik di pesawat ada kotak unik (persegi panjang dengan sisi yang sama) yang berpusat pada titik asal dan memotong titik itu ( demo interaktif ):
Diberi titik p dan jarak d , kembalikan titik yang diperoleh dengan memindahkan jarak d dari p , berlawanan arah jarum jam (dan searah jarum jam untuk negatif d ), di sepanjang perimeter dari persegi yang berpusat pada titik asal yang memotong p . Jawaban Anda harus akurat hingga setidaknya 4 digit desimal.
Testcases:
(0, 0), 100 -> (0, 0)
(1, 1), 81.42 -> (-0.4200, 1.0000)
(42.234, 234.12), 2303.34 -> (-234.1200, 80.0940)
(-23, -39.234), -234.3 -> (39.2340, -21.8960)
Kasus uji berikut berasal dari tantangan asli oleh Martin Ender, dan semuanya dengan d = 1 :
(0, 0) -> (0, 0)
(1, 0) -> (1, 1)
(1, 1) -> (0, 1)
(0, 1) -> (-1, 1)
(-1, 1) -> (-1, 0)
(-1, 0) -> (-1, -1)
(-1, -1) -> (0, -1)
(0, -1) -> (1, -1)
(1, -1) -> (1, 0)
(95, -12) -> (95, -11)
(127, 127) -> (126, 127)
(-2, 101) -> (-3, 101)
(-65, 65) -> (-65, 64)
(-127, 42) -> (-127, 41)
(-9, -9) -> (-8, -9)
(126, -127) -> (127, -127)
(105, -105) -> (105, -104)
Jawaban:
Python 2,
363335296266262258256233 BytesWoo, 130 byte hilang! Terima kasih kepada Neil karena telah menyimpan 4 byte, Nathan Merrill karena telah menyimpan 2 byte, dan xnor karena telah menyimpan 23 byte yang konyol!
Ide umumnya adalah ini: Kita dapat mengurangi jarak yang ditempuh dengan mengambil modulusnya terhadap perimeter persegi. Perimeter didefinisikan sebagai 8 kali terbesar dari dua koordinat, karena titik harus berada di atasnya. Kemudian, setelah modulus diambil, kami dijamin tidak memiliki tumpang tindih. Ini juga menjamin kita hanya perlu bergerak berlawanan arah jarum jam, karena modulus memberikan hasil positif.
Dari sana, saya hanya menggunakan apa yang kita ketahui dari koordinat x dan y yang diberikan untuk mencari tahu di mana kita berada: atas, bawah, kiri, kanan, atau di sudut, dan menentukan arah, yang dapat menjadi salah satu dari
0, 1, 2, 3
:Setelah ini, sesederhana pengulangan sementara kita masih memiliki jarak untuk melakukan perjalanan, dan berdasarkan arah kita kurangi atau tambahkan ke koordinat yang sesuai, dan beri tahu pengulangan ke arah mana kita akan pergi berikutnya.
Meskipun cukup lama, itu pasti berhasil. Inilah beberapa contoh I / O:
Cobalah online atau jalankan test case .
sumber
s=max(x,y,-x,-y)
bekerja?(s>0)*(d>0)
adalahs>0<d
. Outputnya bisa"%.4f "*2%tuple(p)
.if s:d=d%(8*s)
bisad%(s*8or 1)
.(r+1)
bisa~-r
.1*(x>-s)
bisa saja(x>-s)
.abs(y)==abs(x)
bisay*y==x*x
(x>-s)
tidak membutuhkan tanda kurung, dan~-r
pengurangan, jadi aku gunakan-~r
.JavaScript (ES6), 147 byte
Penjelasan: Bekerja dengan mencoba menambahkan vektor arah sambil tetap dalam batas-batas alun-alun. Setiap overshoot secara rekursif dilewatkan kembali dengan arah diputar berlawanan arah jarum jam sebesar 90 °. Arah sebenarnya dikodekan menggunakan bendera vertikal
v
dan satuanw
sehingga vektor (1, 0), (0, 1), (-1, 0) dan (0, -1) dikodekan denganv
0, 1, 0 , 1 danw
1, 1, -1, -1 masing-masing. Vektor arah mungkin awalnya tidak menunjuk ke arah yang sesuai tetapi tidak pernah menunjuk ke belakang sehingga pada akhirnya akan berputar ke arah yang dapat digunakan.sumber
f(42.234, 234.12, 2303.34) -> [-234.12, 80.09399999999988]
artinya tidak memiliki presisi 4 digit. Mungkin menambahkan beberapa format output akan memperbaikinya? Jawaban yang bagus! :)