Qual e il punto?


22

Scrivi un programma o una funzione che accetta due numeri interi che rappresentano le coordinate X e Y di un punto su un piano cartesiano .

L'ingresso può venire in qualsiasi formato ragionevole finché il valore X viene prima Y. Ad esempio, 1 -2, (1,-2), [1, -2], o 1\n-2sarebbero tutti bene per X = 1, Y = -2.

Stampa o restituisce una stringa di singoli caratteri (seguita da una nuova riga finale facoltativa) che descrive la posizione del punto nel piano:

  • 1se il punto è nel quadrante I
  • 2 se il punto è nel quadrante II
  • 3 se il punto è nel quadrante III
  • 4 se il punto è nel quadrante IV
  • Xse il punto si trova sull'asse x (la minuscola xnon è consentita)
  • Yse il punto si trova sull'asse y (la minuscola ynon è consentita)
  • O se il punto è sull'origine (è una lettera maiuscola "oh", non zero)

Vince il codice più breve in byte. Tiebreaker va alla risposta più votata.

Casi test

(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

Quindi ai fini di questa sfida, gli assi X e Y non sono in quadrante?
Rɪᴋᴇʀ

@RikerW Giusto. Altrimenti si potrebbe dire che il punto (0, 9) è il quadrante I o II.
Hobby di Calvin il

Un numero complesso (o una sua rappresentazione in forma di stringa, come "30+56i") un formato di input valido?
Level River St

@steveverrill Sì
Calvin's Hobbies,

L'input può avere la forma di un numero complesso? (es. 1+2j)
Digital Trauma

Risposte:


16

Gelatina, 14 byte

Ṡḅ3ị“Y4X13X2YO

Provalo online!

Come funziona

Ṡḅ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
Partecipa alla gelatina dal club del telefono .
Dennis,

3
Aaaaaand Jelly vince ancora una volta ...
ETHproductions

Ottimo approccio!
Luis Mendo,

11

Rubino, 35 byte

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

Sfruttando l' <=>operatore "astronave" ( ).

x <=> 0 sarà di ritorno

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

Quindi,

  • se x == 0, torniamo 'OY'[y<=>0]. Questo è

    • Oif y == 0(indicizzazione stringa in 0)

    • Yif y != 0(questo è vero perché entrambi 1e -1comporteranno l' Yindicizzazione su questa stringa, come si -1riferisce all'ultimo carattere nella stringa, che è anche quello nell'indice 1)

  • se x > 0, torniamo 'X14'[y<=>0]. Questo è Xse y == 0, 1se y > 0e 4se y < 0(vedere la spiegazione sopra).

  • se x < 0, torniamo '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
Mi fanno male gli occhi, è una lunga catena di operatori ternari
e il

1
dopo il permesso di scrivere una funzione anonima ( s/^f=//)
andlrc

5

ES6, 43 byte

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

Un intero byte più corto di tutti quei ternari!


3

Japt, 30 22 byte

"3Y2XOX4Y1"g4+3*Ug +Vg

Ispirato dalla risposta Jelly di @Dennis prima di aggiungere una spiegazione. Provalo online!

Curiosità: questo sarebbe più corto di due byte se avessi aggiunto il supporto per i numeri negativi nella gfunzione per le stringhe.

Un altro tentativo, più vicino a quello Jelly (23 byte):

"3Y2XOX4Y1"gNmg m+1 ¬n3

Purtroppo, incrementare un elenco costa 4 byte ...


2

MATL , 22 byte

'3X2YOY4X1'iZSQI1h*sQ)

Questo utilizza l' attuale versione (10.2.1) del linguaggio / compilatore.

Provalo online!

Spiegazione

Ciò prende spudoratamente in prestito il grande approccio nella risposta di 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)]

Abbastanza diretto.


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

Questo è un semplice metodo basato sulla sostituzione:

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

Provalo online . Il supplemento m`all'inizio di alcune righe è necessario solo per testare più input in una volta, quindi non vengono conteggiati nel punteggio.


In precedenza ho provato questo approccio più interessante , ma è un po 'più lungo (circa 65 senza i mmodificatori):

[1-9]\d*
1
-1
2
(.) (.)
$1$*3$2$*1
3
111
m`^(.)*$
$#1
T`d`OYYX14X23
  • sostituire tutti i numeri diversi da zero 1, lasciando -in posizione i segni
  • Sostituire -1con2
  • Converti 1o e 2o numero unari con 3e 1rispettivamente come cifre unarie. Questo dà effettivamente 2 cifre di base3, espresse in unario
  • Converti in 3s in 111. Ciò fornisce effettivamente un unico numero unario che corrisponde a ciascuno dei quadranti, degli assi e dell'origine
  • Converti unario in una cifra decimale
  • Trasporre la cifra decimale sul carattere di output appropriato.

1
Non penso che il Xpalcoscenico abbia bisogno $poiché non ci saranno zero iniziali nell'input.
Martin Ender,

1
L'approccio più interessante può essere ridotto ad almeno 40 byte . Adesso lo guarderò ancora un po '.
randomra,

Per l'esecuzione in batch è necessario apportare alcune modifiche .
randomra,

1

Ottava, 34 byte

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

Il vecchio trucco base-3 attraverso la moltiplicazione vettoriale (anche se ho dovuto aggiungere 5 per tenere conto degli indici di array basati su 1) più un po 'di magia di indicizzazione di Ottava.

L'input è un vettore del modulo [1, -2](con o senza la virgola), quindi quando assegnato a una variabile w:

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

Eccolo su ideone .


Ideone sembra funzionare di nuovo. Hai fatto qualcosa di speciale per usarlo?
Luis Mendo,

@LuisMendo Questo utilizza una funzione anonima. Le funzioni nominate sono ancora ottimizzate per me. :(
Becher

Aah, hai ragione. Si chiamava funzioni che non funzionavano. Quindi sempre lo stesso: - /
Luis Mendo

1

Pyth, 24

Troppo lungo, ma forse un approccio interessante:

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

L'ingresso deve essere specificato come un numero complesso, ad es 1-2j. Fondamentalmente un ternario nidificato per testare:

  • se input è zero - output O
  • altrimenti se la parte reale è zero - output Y
  • altrimenti se la parte immaginaria è zero - output X
  • altrimenti calcola la fase complessa, moltiplica per 2, dividi interi per π, quindi mod e aggiungi per dare il numero di quadrante appropriato.

Provalo online.


1

Java 8, 64 byte

questa è un'espressione lambda per 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 potrebbero essere salvati restituendo un Characterinvece di un Stringma non sono del tutto sicuro se l'autoboxing giocherà bene con la lambda.


1
Oh benissimo , questa risposta usando il PCCG Handicap System ha un punteggio migliore (1.5598) rispetto alla risposta Jelly di Dennis (1.5929).
Draco18s,

è abbastanza interessante. grazie per averlo sottolineato
Jack Ammo,

1
Ho esaminato i valori di alcune voci su questo per curiosità (tutti i punteggi erano compresi tra 1,5 e 2, come riferimento).
Draco18s,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.