Amaç ne?


22

Kartezyen bir düzlemde bir noktanın X ve Y koordinatlarını temsil eden iki tam sayıdaki bir program veya işlevi yazın .

Giriş olarak, uzun A değeri Örneğin Y önce gelir herhangi bir makul biçimde gelebilir 1 -2, (1,-2), [1, -2]ya da 1\n-2her iyi olurdu X = 1, Y = -2.

Düzlemdeki noktanın konumunu tanımlayan tek bir karakter dizgisi yazdırın veya döndürün (ardından isteğe bağlı izleyen bir yeni satır):

  • 1eğer nokta kadrandaysa, ben
  • 2 eğer nokta ikinci kadrandaysa II
  • 3 eğer nokta ikinci kadrandaysa III
  • 4 eğer nokta ikinci kadrandaysa IV
  • Xnokta x eksenindeyse (küçük harfe xizin verilmez)
  • Ynokta y eksenindeyse (küçük harfe yizin verilmez)
  • O Eğer nokta menşei ise (bu büyük harf "oh", sıfır değil)

Bayt cinsinden en kısa kod kazanır. Tiebreaker yüksek oylamaya cevabını verdi.

Test Kılıfları

(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

Öyleyse bu mücadelenin amaçları için, X ve Y ekseni kadran yok mu?
Rɪᴋᴇʀ

@RikerW Sağ. Aksi halde, noktanın (0, 9) ikinci ya da ikinci kadran olduğu söylenebilir.
Calvin'in Hobileri,

Karmaşık bir sayı (veya bunun gibi bir dize temsili "30+56i") geçerli bir giriş biçimi midir?
Seviye Nehri St

@steveverrill Evet
Calvin'in Hobileri

Girdi karmaşık bir sayı biçiminde olabilir mi? (örn. 1+2j)
Dijital Travma

Yanıtlar:


16

Jöle, 14 bayt

Ṡḅ3ị“Y4X13X2YO

Çevrimiçi deneyin!

Nasıl çalışır

Ṡḅ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
Jelly'e telefon kulübünden katılmak .
Dennis

3
Aaaaaand Jelly bir kez daha kazandı ...
ETHproductions

Çok iyi bir yaklaşım!
Luis Mendo,

11

Ruby, 35 bayt

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

"Uzay gemisi" ( <=>) operatörünün kullanılması.

x <=> 0 geri dönücek

  • 0 Eğer x == 0
  • 1 Eğer x > 0
  • -1 Eğer x < 0

Bu nedenle,

  • eğer x == 0dönersek 'OY'[y<=>0]. Bu

    • Oeğer y == 0(string indexing at 0)

    • Yif y != 0(bu doğrudur çünkü her ikisi de 1ve bu dizgede indekslenirken -1sonuçlanacaktır, Ydizgideki -1son karaktere atıfta bulunulur.

  • eğer x > 0dönersek 'X14'[y<=>0]. Bu, Xeğer y == 0, 1eğer y > 0ve 4eğer y < 0(yukarıdaki açıklamaya bakınız).

  • eğer x < 0dönersek 'X23'[y<=>0].


6

JavaScript, 44 bayt

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


3
Gözlerim ağrıyor, bu uzun bir üçlü operatör zinciri
andlrc

1
afaik, isimsiz bir işlev yazmasına izin verilir ( s/^f=//)
andlrc 23

5

ES6, 43 bayt

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

Bütün bu baytlardan daha kısa bir bütün bayt!


3

Japt, 30 22 bayt

"3Y2XOX4Y1"g4+3*Ug +Vg

Bir açıklama eklemeden önce @Dennis 'Jelly cevabından ilham aldı. Çevrimiçi test edin!

Eğlenceli gerçek: Eğer gdizge fonksiyonunda negatif sayılar için destek ekleseydim bu iki bayt daha kısa olurdu .

Jelly one'a (23 byte) daha yakın bir başka deneme:

"3Y2XOX4Y1"gNmg m+1 ¬n3

Ne yazık ki, bir listeyi arttırmak 4 bayt tutar ...


2

MATL , 22 bayt

'3X2YOY4X1'iZSQI1h*sQ)

Bu , dilin / derleyicinin geçerli sürümünü (10.2.1) kullanır .

Çevrimiçi deneyin!

açıklama

Bu, utanmadan Dennis'in cevabındaki büyük yaklaşımı ödünç alıyor .

'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 bayt

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

Oldukça basit.


1

Mathematica 81 bayt

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

Bu basit bir ikame tabanlı yöntemdir:

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

Çevrimiçi deneyin . m`Bazı satırların başlangıcındaki ekstra , yalnızca bir seferde birden fazla girişi test etmek için gereklidir, bu nedenle skorda sayılmaz.


Daha önce bu daha ilginç bir yaklaşımı denedim , ancak oldukça uzun ( mdeğiştiriciler olmadan yaklaşık 65 ):

[1-9]\d*
1
-1
2
(.) (.)
$1$*3$2$*1
3
111
m`^(.)*$
$#1
T`d`OYYX14X23
  • işaretlerini 1bırakarak sıfır olmayan tüm sayıları değiştir-
  • Yerine -1ile2
  • Dönüştürme 1 ile tekli 2 sayılar 3ve 1tekli basamak olarak sırasıyla. Bu, unary ile ifade edilen 2 base3 basamağını etkili bir şekilde verir.
  • 3S ye dönüştür 111. Bu etkili, kadranların, eksenlerin ve orijinlerin her birine karşılık gelen tek bir tekli sayı verir.
  • Unary bir ondalık basamağa dönüştür
  • Ondalık basamağı uygun çıktı karakterine çevirin.

1
Girişte baş sıfırlar olmayacağından Xsahnenin ihtiyacı olduğunu sanmıyorum $.
Martin Ender

1
Daha ilginç olan yaklaşım en az 40 byte kısaltılabilir . Şimdi yarın biraz daha inceleyeceğim.
randomra


1

Oktav, 34 bayt

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

Eski üs-3, vektör çarpma işleminde bir püf noktası (1 tabanlı dizi indeksleri hesaba katmak için 5 eklemek zorunda olmama rağmen) artı bazı Octave indeksleme sihri.

Girdi, formun bir vektörüdür [1, -2](virgülle veya virgül olmadan), yani bir değişkene atandığında w:

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

İşte ideone üzerinde .


İdeone tekrar çalışıyor gibi görünüyor. Kullanmak için özel bir şey yaptın mı?
Luis Mendo

@LuisMendo Bu isimsiz bir işlev kullanır. Adlandırılmış fonksiyonlar hala benim için çalışıyor. :(
beher 21

Aah, haklısın. Çalışmayan fonksiyonlar seçildi. Yani hala aynı: - /
Luis Mendo

1

Pyth, 24

Çok uzun, ama belki de ilginç bir yaklaşım:

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

Girdi, örneğin karmaşık bir sayı olarak belirtilmelidir 1-2j. Temel olarak test etmek için iç içe geçmiş bir üçlü:

  • eğer girdi sıfırsa - çıktı O
  • eğer gerçek parça sıfırsa - çıktı Y
  • eğer hayali kısım sıfır ise - çıktı X
  • Başka bir deyişle karmaşık fazı 2 ile çarp, tam sayıyı by ile böl, sonra modunu hesapla ve uygun kadran sayısını vermek için ekle.

Çevrimiçi deneyin.


1

Java 8, 64 bayt

bu, a için bir lambda ifadesidir BiFunction<Integer,Integer,String>.

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

3 bayt Characteryerine bir geri Stringdöndürülerek kurtarılabilir, ancak otomatik kutulamanın lambda ile iyi bir şekilde oynanıp oynatılmayacağından emin değilim.


1
Tabii ki, PCCG Handikap Sistemi'ni kullanan bu cevap, Dennis'in Jelly yanıtından (1.5929) daha iyi (1.5598) puan aldı.
Draco18,

Bu oldukça ilginç. işaret ettiğin için teşekkürler
Jack Ammo

1
Bu konuyla ilgili bir kaç giriş için değerleri merak uyandırdı (tüm puanlar referans için 1.5 ile 2 arasındaydı).
Draco18,
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.