Pertimbangkan kisi biasa, di mana setiap sel memiliki koordinat bilangan bulat. Kita dapat mengelompokkan sel menjadi "cincin" (berbentuk persegi) di mana sel-sel di setiap cincin memiliki jarak Chebyshev yang sama (atau jarak papan catur) dari titik asalnya. Tugas Anda adalah untuk mengambil sel yang terkoordinasi dan memutar sel itu dengan satu posisi berlawanan arah jarum jam di dalam cincinnya. Ini mengimplementasikan pemetaan berikut:
Jadi misalnya jika inputnya adalah (3, -2)
Anda harus output (3, -1)
. Perhatikan bahwa (0, 0)
hanya input yang harus dipetakan ke dirinya sendiri.
Aturan
Format I / O cukup fleksibel. Anda dapat menggunakan dua angka individual, pasangan / daftar / larik / tupel angka, satu angka kompleks, string yang berisi dua angka, dll.
Anda mungkin menganggap itu -128 < x,y < 128
.
Anda dapat menulis sebuah program atau fungsi dan menggunakan salah satu metode standar kami untuk menerima input dan memberikan output.
Anda dapat menggunakan bahasa pemrograman apa pun , tetapi perhatikan bahwa celah ini dilarang secara default.
Ini adalah kode-golf , sehingga jawaban terpendek yang valid - diukur dalam byte - menang.
Uji Kasus
(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:
JavaScript (ES6),
6059 byteMengambil input dengan sintaks currying
(x)(y)
dan mengembalikan array[new_x, new_y]
.Bagaimana itu bekerja
Tugas utama kita adalah menentukan kuadran mana kita berada, sehingga kita tahu ke arah mana kita akan bergerak.
Kita bisa menggunakan rumus ini sebagai perkiraan pertama:
Inilah yang kami dapatkan:
Hampir sampai. Tetapi sudut kiri bawah dan kanan bawah cincin tidak valid. Kita perlu menggeser bagian bawah matriks dengan satu posisi ke kiri, jadi kami mendefinisikan
z
sebagai:Dan kami ganti
x
denganz
dalam rumus kami:Yang mengarah ke:
Seluruh matriks sekarang benar, kecuali untuk kasus khusus
[0, 0]
(tidak bergerak sama sekali) yang harus ditangani secara terpisah.Uji kasus
Tampilkan cuplikan kode
sumber
Jelly ,
201412 byteInput dan output dalam bentuk array. Cobalah online! atau verifikasi semua kasus uji .
Latar Belakang
Untuk mengetahui ke arah mana kita harus bergerak, kita dapat mengamati posisi relatif dari titik awal ke kuadran kuadrat x + y = 0 (biru) dan x - y = 0 (merah).
Asal sudah pasti. Kami maju dengan menambahkan [0, 0] ke titik awal.
Poin dalam segitiga paling atas - termasuk garis-bagi kuadran pertama - memiliki jumlah positif dan delta non-negatif ( y - x ). Kami maju dengan menambahkan [-1, 0] ke titik awal.
Poin dalam segitiga paling kiri - termasuk garis-bagi kuadran kedua - memiliki jumlah non-positif dan delta positif. Kami maju dengan menambahkan [0, -1] ke titik awal.
Poin dalam segitiga paling bawah - termasuk garis-empat kuadran ketiga - memiliki jumlah negatif dan delta tidak positif. Kami maju dengan menambahkan [1, 0] ke titik awal.
Poin di segitiga paling kanan - termasuk garis-empat kuadran keempat - memiliki jumlah non-negatif dan delta negatif. Kami maju dengan menambahkan [0, 1] ke titik awal.
Untuk mengetahui arah yang benar, kami menghitung [-sign (x + y), -sign (y - x)] , yang hanya memiliki sembilan kemungkinan hasil.
Tabel berikut menggambarkan hasil mana yang harus dipetakan ke arah mana.
Ini menyisakan tiga kasus.
Jika setidaknya salah satu tanda adalah 0 , [Δx, Δy] = [-sign (x + y), -sign (yx)] .
Jika tanda-tandanya sama dan tidak nol, [Δx, Δy] = [-sign (x + y), 0] .
Jika tanda-tandanya berbeda dan bukan nol, [Δx, Δy] = [0, -sign (yx)] .
Bagaimana itu bekerja
sumber
Pyth , 19 byte
Cobalah online!
Terjemahan dari jawaban Julia saya :
sumber
Python, 55 byte
Mendeteksi empat kuadran diagonal, dan menggeser koordinat yang sesuai.
sumber
Haskell,
777169 byteIni hanya memeriksa setiap kuadran yang dimiringkan, dan memodifikasi input yang sesuai. Perhatikan bahwa spasi diperlukan, jika tidak mis
>-
akan dipahami sebagai operator (yang tidak didefinisikan).Terima kasih @nimi karena telah menghapus beberapa byte lagi!
sumber
,
bukannya&&
dalam penjaga pertama menyimpan byte. Dan kemudian Anda dapat mengganti perbandingan kedua ke-x<y
byte lain.,
!Ruby, 68
Fungsi Lambda mengambil bilangan kompleks sebagai argumen, mengembalikan bilangan kompleks.
Kami memutar titik melalui 90 derajat 4 kali dengan mengalikannya dengan
i
. Karena itu ia melewati keempat kuadran, dan akan dikembalikan tidak berubah - kecuali untuk fakta kami memodifikasinya ketika berada di salah satu kuadran tertentu. Fakta bahwa selalu dimodifikasi di kuadran yang sama menyederhanakan modifikasi.Paling mudah untuk diikuti jika kita mengubahnya
z
ketika berada di kuadran kanan. dalam hal ini kita perlu meningkatkan y koordinat oleh 1 (yaitu menambahkani
kez
.)Kami memeriksa
x.abs>=y.abs
dengan membandingkan kuadrat darix
dany
. Ini memberitahu kita bahwa masalahnya ada di kuadran kanan atau kiri, bukan atas atau bawah. Untuk memeriksanya sebenarnya di kuadran kanan, kami selanjutnya memeriksa bahwax>y
(benar-benar lebih besar karena kami ingin mengecualikan kasingx=y
yang berada di kuadran "atas"). Di mana hal ini benar, kami tambahkani
kez
.Untuk alasan bermain golf, menambahkan
i
tidak diinginkan. Alih-alih, kami memodifikasi nomor ketika berada di kuadran bawah, dalam hal ini kami harus menambahkan 1 kex
koordinat (tambahkan 1 kez
.) Dalam hal ini kami menguji bahway*y>=x*x
untuk memeriksa itu di kuadran atas atau bawah. Untuk lebih memastikannya di kuadran bawah kita perlu memeriksay<-x
(tidak termasuk kasus sudut kanan bawah manay=-x
.)Keuntungan dari pemeriksaan ini adalah tidak ada kasus khusus untuk koordinat 0,0. Sayangnya ditemukan bahwa memindahkan titik dapat menggesernya ke kuadran yang berbeda dan ini berarti bahwa gerakan kedua harus ditekan jika kuadran itu diperiksa lagi, yang mungkin meniadakan keuntungan.
Contoh 1
Contoh 2
Dalam program uji
Diagram
Gambar berikut menunjukkan (biru) area di mana
x*x>=y*y
, (kuning) area di manay<-x
dan (hijau) persimpangan ini, yang merupakan wilayah di mana transformasi yang benar adalah penambahan 1 kez
.sumber
Python, 52 byte
Input dan output yang kompleks. Untuk menguji titik berada di kuadran diagonal bawah, pertama putar 135 berlawanan arah jarum jam untuk memindahkan kuadran itu ke kuadran standar (x> 0, y> 0), dan uji jika hasilnya tidak memiliki simbol minus dalam representasi string. Mengurangkan 1 pertama merawat kondisi batas.
Jika tidak ada di kuadran itu, putar seluruh masalah 90 derajat. Input nol ditangani khusus untuk output itu sendiri.
Upaya lain dengan bilangan kompleks:
sumber
Mathematica, 34 byte
Ini mendefinisikan operator unary
±
yang mengambil dan mengembalikan bilangan kompleks yang komponennya mewakilix
dany
.Sekarang Lynn telah mengungkapkan solusi bilangan kompleks dan Dennis telah mengalahkan skor saya, saya tidak merasa begitu buruk untuk memposting implementasi referensi golf saya. :) (Ternyata hampir identik dengan jawaban Lynn.)
sumber
MATL ,
1917 byteIni menggunakan bilangan kompleks sebagai input dan output.
Cobalah online! Atau verifikasi semua kasus uji .
Penjelasan
Mari kita ambil input
-127+42j
sebagai contoh.sumber
Ruby, 51 byte
Bentuk asli
Formulir alternatif per komentar Xnor
Menggunakan jenis ketidaksetaraan yang sama dengan jawaban saya yang lain, tetapi dengan cara yang berbeda.
Dalam program uji
sumber
d
tugas itu sepadan? Sepertinya Anda bisa membandingkanx*x>y*y
.y*y
dan?
jadi panjangnya persis sama. Saya sudah memasukkannya karena saya pikir cara Anda dalam beberapa hal lebih rapi. Saya pikir Ruby sedang mencoba untuk melewatinya sebagaiy?
nama fungsi hukum.Julia,
3834 byteDennis menyimpan empat byte. Terima kasih!
Cobalah online!
sumber
int(2angle(z)/pi+5)
untuk jumlah byte yang sama (kekuatan negatif menyebabkan kesalahan untuk alasan apa pun).!z=z+(z!=0)im^...
semua versi.C ++, 94 byte
Tidak Disatukan:
Pemakaian:
Cobalah online
sumber
(x>0?x:-(x))
bisa terjadi(x>0?x:-x)
.R,
131110 byteFungsi yang mengambil dua bilangan bulat,
x,y
sebagai input dan menulis output ke stdout. Solusinya mengikuti skema aliran kontrol @Dennis 'tetapi mungkin bisa golf.EDIT: Kode yang diperbarui berdasarkan pada saran @ JDL dan menyimpan banyak byte.
Tidak disatukan
sumber
as.logical(-1)
adalahTRUE
, jadiX==0|Y==0
dapat menjadi!X|!Y
, dan kondisiif(X!=Y...)
dapat menjadiif(X-Y)
. Juga, jikaX==Y
danX!=0
kemudianY!=0
berlebihan. Sebenarnya, semua!=0
bagiannya mubazir;if(X!=0)
setara denganif(X)
.c(x,y)
bukancat(x,y)
.JavaScript (ES6), 57 byte (55–63 †)
Menerima larik [x, y], mengubahnya di tempat, dan mengembalikannya.
Bagaimana itu bekerja
Ini adalah fungsi panah parameter tunggal dengan
return
badan ringkas -gratis.Parameter segera dirubah menjadi
x
dany
variabel.Operator koma menggabungkan beberapa ekspresi menjadi satu, menggunakan hasil dari yang terakhir.
i
digunakan untuk membedakan kasus kenaikan dan penurunan. Ketikax
lebih besar dariy
, kita berada di kuadran bawah atau kanan, dan perlu maju dalam satu dimensi (i=1
dengan paksaan boolean-ke-angka). Demikian juga ketika kita berada pada bagian negatif dari pembagian x = y diagonal. Dalam semua kasus lain — termasuk asal — tidak diperlukan penambahan (i=0
).Kami menggunakan ekspresi yang agak mirip untuk mengendalikan indeks array mana yang akan disesuaikan. Ketika kita bertambah dan tidak di kuadran kiri atau bawah (atau ketika kita tidak naik dan di kiri atau bawah), maka bitor XOR akan menghasilkan
1
dan kami akan menyesuaikan nilai y . Demikian juga ketika kita berada di diagonal x = -y (termasuk asal). Dalam semua kasus lain, indeksnya adalah0
( x ).Ketika
i
adalah1
, kami akan menambahkannya ke nilai tertentu. Ketikai
adalah0
, kami akan mengurangkan 1 dari nilai jika dan hanya jika kita tidak pada titik asal. Yang terakhir dideteksi denganx|y
menghasilkan bukan nol, dijepit ke {0, 1} oleh paksaan boolean, dan negasi darii
memungkinkan kita untuk menggunakan bitwise ATAU bukannya logis (karena-1
tidak memiliki nol bit, aman dari modifikasi).Array adalah yang terakhir, jadi itu akan dikembalikan.
Pengujian
Tampilkan cuplikan kode
† Variasi
Kita dapat menyimpan dua byte lagi dengan melewatkan nilai balik yang bermakna dan hanya menggunakan mutasi input:
... atau kita dapat melewati mutasi input dan membuat semua variabel lokal untuk fungsi murni, dengan biaya enam byte:
sumber
JavaScript (ES6),
8076 bytesumber
Haskell, 53 byte
Membawa dua angka, menghasilkan tupel. Jika titik ada di bagian timur
-x<=y<x
, tambah koordinat kedua dengan 1. Kalau tidak, siklus kuadran dengan memutar titik input 90 derajat, memanggil fungsi di atasnya, lalu memutar kembali.sumber
Racket 191 byte
Tidak Digubah (langsung menerjemahkan petunjuk gambar ke kode tanpa menggunakan rumus perantara):
Pengujian:
Keluaran:
sumber
Sebenarnya , 16 byte
Ini membutuhkan bilangan kompleks sebagai input dan menghasilkan bilangan kompleks lainnya. Selamat datang saran bermain golf!Cobalah online!
Tidak melakukanolf
sumber
Scala, 184 byte
Tidak Disatukan:
Penjelasan:
sumber