Apa gunanya?


22

Tulis program atau fungsi yang menggunakan dua bilangan bulat yang mewakili koordinat X dan Y dari suatu titik pada bidang Cartesian .

Input dapat datang dalam format yang wajar asalkan nilai X datang sebelum Y. Sebagai contoh, 1 -2, (1,-2), [1, -2], atau 1\n-2semua akan baik-baik saja untuk X = 1, Y = -2.

Cetak atau kembalikan string karakter tunggal (diikuti oleh baris tambahan opsional) yang menjelaskan lokasi titik di pesawat:

  • 1jika intinya ada di kuadran I
  • 2 jika intinya ada di kuadran II
  • 3 jika intinya ada di kuadran III
  • 4 jika intinya ada di kuadran IV
  • Xjika titiknya pada sumbu x (huruf kecil xtidak diperbolehkan)
  • Yjika titiknya pada sumbu y (huruf kecil ytidak diperbolehkan)
  • O jika intinya adalah pada asal (itu huruf kapital "oh", bukan nol)

Kode terpendek dalam byte menang. Tiebreaker memilih jawaban yang lebih tinggi.

Uji Kasus

(1,-2) -> 4
(30,56) -> 1
(-2,1) -> 2
(-89,-729) -> 3
(-89,0) -> X
(0,400) -> Y
(0,0) -> O
(0,1) -> Y
(0,-1) -> Y
(1,0) -> X
(-1,0) -> X
(1,1) -> 1
(1,-1) -> 4
(-1,1) -> 2
(-1,-1) -> 3

Jadi untuk keperluan tantangan ini, sumbu X dan Y tidak ada kuadran?
Rɪᴋᴇʀ

@RikerW Benar. Kalau tidak, titik (0, 9) dapat dikatakan kuadran I atau II.
Hobi Calvin

Apakah bilangan kompleks (atau representasi string, seperti "30+56i") format input yang valid?
Level River St

@steveverrill Ya
Hobi Calvin

Bisakah input dalam bentuk bilangan kompleks? (mis. 1+2j)
Trauma Digital

Jawaban:


16

Jelly, 14 byte

Ṡḅ3ị“Y4X13X2YO

Cobalah online!

Bagaimana itu bekerja

Ṡḅ3ị“Y4X13X2YO    Main link. Input: [x, y]

Ṡ                 Apply the sign function to both coordinates.
 ḅ3               Convert the resulting pair from base 3 to integer.
                  Because of how base conversion is implemented in Jelly, this maps
                  [a, b] to (3a + b), even if a and b aren't valid ternary digits.
                  Therefore:
                      [0, 1]   ->  1
                      [1, -1]  ->  2
                      [1, 0]   ->  3
                      [1, 1]   ->  4
                      [-1, -1] -> -4
                      [-1, 0]  -> -3
                      [-1, 1]  -> -2
                      [0, -1]  -> -1
                      [0, 0]   ->  0
   ị“Y4X13X2YO    Retrieve the character at that index from the string.
                Indexing is 1-based and modular in Jelly, so 1ị retrieves the
                first character, -1ị the penultimate, and 0ị the last.

6
Bergabung dengan Jelly dari klub ponsel .
Dennis

3
Aaaaaand Jelly menang sekali lagi ...
ETHproduksi

Pendekatan yang sangat bagus!
Luis Mendo

11

Ruby, 35 byte

->x,y{%w[OY X14 X23][x<=>0][y<=>0]}

Memanfaatkan <=>operator "pesawat ruang angkasa" ( ).

x <=> 0 akan kembali

  • 0 jika x == 0
  • 1 jika x > 0
  • -1 jika x < 0

Karenanya,

  • jika x == 0kita kembali 'OY'[y<=>0]. Ini adalah

    • Oif y == 0(string indexing at 0)

    • Yif y != 0(ini benar karena keduanya 1dan -1akan menghasilkan Ysaat pengindeksan pada string ini, sebagaimana -1merujuk pada karakter terakhir dalam string, yang juga merupakan yang ada di indeks 1)

  • jika x > 0kita kembali 'X14'[y<=>0]. Ini adalah Xjika y == 0, 1jika y > 0, dan 4jika y < 0(lihat penjelasan di atas).

  • jika x < 0kita kembali 'X23'[y<=>0].


6

JavaScript, 44 byte

(x,y)=>x?y?x>0?y>0?1:4:y>0?2:3:'X':y?'Y':'O'


3
Mataku sakit, itu satu rantai panjang operator ternary
andlrc

1
afaik diizinkan untuk menulis fungsi anonim ( s/^f=//)
andlrc

5

ES6, 43 byte

(x,y)=>"OYYX32X41"[3*!!x+3*(x>0)+!!y+(y>0)]

Seluruh byte lebih pendek dari semua terner itu!


3

Japt, 30 22 byte

"3Y2XOX4Y1"g4+3*Ug +Vg

Terinspirasi oleh jawaban Jelly @ Dennis 'sebelum dia menambahkan penjelasan. Uji secara online!

Fakta menyenangkan: ini akan menjadi dua byte lebih pendek jika saya telah menambahkan dukungan untuk angka negatif dalam gfungsi untuk string.

Upaya lain, lebih dekat dengan Jelly satu (23 byte):

"3Y2XOX4Y1"gNmg m+1 ¬n3

Sayangnya, penambahan daftar biaya 4 byte ...


2

MATL , 22 byte

'3X2YOY4X1'iZSQI1h*sQ)

Ini menggunakan rilis saat ini (10.2.1) dari bahasa / kompiler.

Cobalah online!

Penjelasan

Ini tanpa malu meminjam pendekatan hebat dalam jawaban Dennis .

'3X2YOY4X1'     % literal string. Will be indexed into to produce result
i               % input array of two numbers
ZS              % sign of each number in that array. Gives -1, 0 or 1
Q               % add 1 to produce 0, 1 or 2
I1h             % array [3 1]
*s              % multiply both arrays element-wise and compute sum
Q               % add 1. Gives a value from 1 to 9
)               % index into string. Display


1

Python 2, 75 byte

lambda x,y,b=bool:[['OX','YO'][b(y)][b(x)],[[1,2],[4,3]][y<0][x<0]][b(x*y)]

Cukup mudah.


1

Mathematica 81 byte

Switch[Sign@#,{1,-1},4,{1,1},1,{-1,1},2,{-1,-1},3,{0,0},"O",{_,0},"X",{0,_},"Y"]&

%/@{{1, -2}, {30, 56}, {-2, 1}, {-89, -729}, {-89, -0}, {0, 400}, {0, 0},{0, 1}, {0, -1}, {1, 0}, {-1, 0}, {1, 1}, {1, -1}, {-1, 1}, {-1, -1}}

{4, 1, 2, 3, "X", "Y", "O", "Y", "Y", "X", "X", 1, 4, 2, 3}


1

Retina , 52

Ini adalah metode berbasis substitusi sederhana:

^0 0
O
^0.*
Y
.* 0
X
-.*-.*
3
^-.*
2
.*-.*
4
.* .*
1

Cobalah online . Ekstra m`di awal beberapa baris hanya diperlukan untuk menguji beberapa input sekaligus, jadi tidak dihitung dalam skor.


Sebelumnya saya mencoba pendekatan yang lebih menarik ini , tapi agak lebih lama (sekitar 65 tanpa mpengubah):

[1-9]\d*
1
-1
2
(.) (.)
$1$*3$2$*1
3
111
m`^(.)*$
$#1
T`d`OYYX14X23
  • gantilah semua nomor yang bukan nol dengan 1meninggalkan -tanda di tempatnya
  • Pengganti -1dengan2
  • Konversi angka 1 dan 2 unary dengan 3dan 1masing - masing sebagai digit unary. Ini secara efektif memberikan 2 digit base3, dinyatakan dalam unary
  • Konversikan ke 3s ke 111. Ini secara efektif memberikan angka unary tunggal yang sesuai dengan masing-masing kuadran, sumbu dan asal
  • Ubah unary menjadi satu angka desimal
  • Ubah posisi angka desimal ke karakter keluaran yang sesuai.

1
Saya tidak berpikir Xpanggung perlu $karena tidak akan ada nol terkemuka di input.
Martin Ender

1
Pendekatan yang lebih menarik dapat disingkat menjadi setidaknya 40 byte . Sekarang saya akan melihatnya lagi besok.
randomra

Untuk menjalankan batch Anda perlu beberapa penyesuaian .
randomra

1

Oktaf, 34 byte

@(p)['3X2YOY4X1'](sign(p)*[3;1]+5)

Trik base-3 yang lama melalui perkalian vektor (walaupun saya harus menambahkan 5 untuk memperhitungkan indeks array berbasis 1) ditambah beberapa sihir pengindeksan oktaf.

Input adalah vektor dari formulir [1, -2](dengan atau tanpa koma), jadi ketika ditugaskan ke variabel w:

>> w([1 -2])
ans = 4

Ini dia ideone .


Ideone tampaknya bekerja kembali. Apakah Anda melakukan sesuatu yang istimewa untuk menggunakannya?
Luis Mendo

@LuisMendo Yang ini menggunakan fungsi anonim. Fungsi-fungsi yang disebutkan masih borked bagi saya. :(
gelas kimia

Aah, kamu benar. Itu bernama fungsi yang tidak berfungsi. Jadi masih sama: - /
Luis Mendo

1

Pyth, 24

Terlalu panjang, tapi mungkin pendekatan yang menarik:

?Q?sQ?eQh%/yPQ.n04\X\Y\O

Input harus ditentukan sebagai angka kompleks, mis 1-2j. Pada dasarnya terner bersarang untuk diuji:

  • jika inputnya nol - output O
  • lain jika bagian nyata adalah nol - output Y
  • lain jika bagian imajiner adalah nol - output X
  • selain itu hitung fase kompleks, kalikan dengan 2, bilangan bulat integer dengan π, lalu mod dan tambahkan untuk memberikan nomor kuadran yang sesuai.

Cobalah online.


1

Java 8, 64 byte

ini adalah ungkapan lambda untuk a BiFunction<Integer,Integer,String>.

(x,y)->"OYYX14X23".charAt(3*(x>0?1:x<0?2:0)+(y>0?1:y<0?2:0))+"";

3 byte dapat disimpan dengan mengembalikan Characterbukan Stringtapi saya tidak sepenuhnya yakin apakah autoboxing akan bermain dengan baik dengan lambda.


1
Oh rapi, jawaban ini menggunakan PCCG Handicap System mendapat skor lebih baik (1,5598) daripada jawaban Dennis's Jelly (1,5929).
Draco18s

itu cukup menarik. terima kasih telah menunjukkannya
Jack Ammo

1
Menjalankan nilai untuk beberapa entri yang satu ini karena penasaran (semua skor adalah antara 1,5 dan 2, untuk referensi).
Draco18s
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.