Qual é o objetivo?

22

Escreva um programa ou função que inclua dois números inteiros que representam as coordenadas X e Y de um ponto em um plano cartesiano .

A entrada pode vir em qualquer formato razoável, desde que o valor X vem antes do Y. Por exemplo, 1 -2, (1,-2), [1, -2], ou 1\n-2todos seriam excelentes para X = 1, Y = -2.

Imprima ou retorne uma única sequência de caracteres (seguida por uma nova linha à direita opcional) que descreva a localização do ponto no plano:

  • 1se o ponto estiver no quadrante I
  • 2 se o ponto estiver no quadrante II
  • 3 se o ponto estiver no quadrante III
  • 4 se o ponto estiver no quadrante IV
  • Xse o ponto estiver no eixo x (letras minúsculas xnão são permitidas)
  • Yse o ponto estiver no eixo y (letras minúsculas ynão são permitidas)
  • O se o ponto estiver na origem (é uma letra maiúscula "oh", não zero)

O código mais curto em bytes vence. O desempatador vai para a resposta mais votada.

Casos de teste

(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
Passatempos de Calvin
fonte
Então, para os propósitos deste desafio, os eixos X e Y não estão no quadrante?
Rɪᴋᴇʀ
@RikerW Right. Caso contrário, o ponto (0, 9) pode ser considerado no quadrante I ou II.
Hobbies de Calvin
Um número complexo (ou uma representação de string dele, como "30+56i") é um formato de entrada válido?
Level River St
@steveverrill Yes
Calvin's Hobbies
A entrada pode estar na forma de um número complexo? (por exemplo 1+2j)
Digital Trauma

Respostas:

16

Gelatina, 14 bytes

Ṡḅ3ị“Y4X13X2YO

Experimente online!

Como funciona

Ṡḅ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.
Dennis
fonte
6
Juntando-se ao Jelly do clube do telefone .
Dennis
3
Aaaaaand Jelly vence mais uma vez ...
ETHproductions
Muito boa abordagem!
Luis Mendo
11

Ruby, 35 bytes

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

Aproveitando o <=>operador "nave espacial" ( ).

x <=> 0 retornará

  • 0 E se x == 0
  • 1 E se x > 0
  • -1 E se x < 0

Conseqüentemente,

  • se x == 0voltarmos 'OY'[y<=>0]. Isto é

    • Oif y == 0(indexação de string em 0)

    • Yif y != 0(isso é verdade porque ambos 1e -1resultará na Yindexação dessa sequência, como -1se refere ao último caractere da sequência, que também é o do índice 1)

  • se x > 0voltarmos 'X14'[y<=>0]. Isso é Xse y == 0, 1se y > 0e 4se y < 0(veja a explicação acima).

  • se x < 0voltarmos 'X23'[y<=>0].

Maçaneta da porta
fonte
6

JavaScript, 44 bytes

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

removido
fonte
3
Meus olhos doem, essa é uma longa cadeia de operadores ternários
andlrc
1
afaik é permitido escrever uma função anônima ( s/^f=//)
andlrc
5

ES6, 43 bytes

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

Um byte inteiro mais curto que todos esses ternários!

Neil
fonte
3

Japonês, 30 22 bytes

"3Y2XOX4Y1"g4+3*Ug +Vg

Inspirado pela resposta de @Dennis 'Jelly antes de adicionar uma explicação. Teste online!

Curiosidade: seriam dois bytes mais curtos se eu tivesse adicionado suporte para números negativos na gfunção para strings.

Outra tentativa, mais próxima da Jelly (23 bytes):

"3Y2XOX4Y1"gNmg m+1 ¬n3

Infelizmente, incrementar uma lista custa 4 bytes ...

ETHproductions
fonte
2

MATL , 22 bytes

'3X2YOY4X1'iZSQI1h*sQ)

Isso usa a versão atual (10.2.1) do idioma / compilador.

Experimente online!

Explicação

Isso empresta descaradamente a grande abordagem da resposta de 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
Luis Mendo
fonte
1

Python 2, 75 bytes

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

Bem direto.

Mego
fonte
1

Mathematica 81 bytes

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}

DavidC
fonte
1

Retina , 52

Este é um método simples baseado em substituição:

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

Experimente online . O extra m`no início de algumas linhas é necessário apenas para testar várias entradas de uma só vez, portanto, não são contadas na pontuação.


Anteriormente, tentei essa abordagem mais interessante , mas é um pouco mais longa (cerca de 65 sem os mmodificadores):

[1-9]\d*
1
-1
2
(.) (.)
$1$*3$2$*1
3
111
m`^(.)*$
$#1
T`d`OYYX14X23
  • substituir todos os números diferentes de zero 1, deixando -sinais no lugar
  • Substitua -1por2
  • Converta o 1º e o 2º números unários com 3e 1respectivamente como dígitos unários. Isso efetivamente fornece 2 dígitos base3, expressos em unário
  • Converta em 3s para 111. Isso efetivamente fornece um único número unário que corresponde a cada um dos quadrantes, eixos e origem
  • Converta o unário em um dígito decimal
  • Transponha o dígito decimal para o caractere de saída apropriado.
Trauma Digital
fonte
1
Eu não acho que o Xestágio precise, $pois não haverá zeros à esquerda na entrada.
Martin Ender
1
A abordagem mais interessante pode ser reduzida para pelo menos 40 bytes . Agora vou ver amanhã mais um pouco.
Aleatório
Para execução em lote, você precisa de alguns ajustes .
Aleatório
1

Oitava, 34 bytes

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

O antigo truque base-3 através da multiplicação de vetores (embora eu tivesse que adicionar 5 para contabilizar os índices de matriz baseados em 1), além de alguma mágica de indexação do Octave.

Entrada é um vetor do formulário [1, -2](com ou sem vírgula), portanto, quando atribuído a uma variável w:

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

Aqui está no ideone .

taça
fonte
Ideone parece estar funcionando novamente. Você fez algo especial para usá-lo?
Luis Mendo
@LuisMendo Este usa uma função anônima. As funções nomeadas ainda são enviadas para mim. :(
copo
Aah, você está certo. Foi nomeado funções que não estavam funcionando. Assim continua o mesmo: - /
Luis Mendo
1

Pyth, 24

Muito tempo, mas talvez uma abordagem interessante:

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

A entrada deve ser especificada como um número complexo, por exemplo 1-2j. Basicamente, um ternário aninhado para testar:

  • se a entrada é zero - saída O
  • caso contrário, se a parte real for zero - saída Y
  • caso contrário, se a parte imaginária for zero - saída X
  • caso contrário, calcule a fase complexa, multiplique por 2, divida o número inteiro por π, mod e adicione para fornecer o número do quadrante apropriado.

Experimente online.

Trauma Digital
fonte
1

Java 8, 64 bytes

esta é uma expressão lambda para 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 bytes podem ser salvos retornando um em Charactervez de um, Stringmas não tenho certeza absoluta se a autoboxing funcionará bem com o lambda.

Jack Ammo
fonte
1
Ah, sim, essa resposta usando o PCCG Handicap System obtém uma pontuação melhor (1.5598) do que a resposta de Dennis's Jelly (1.5929).
Draco18s
isso é bem interessante. obrigado por apontar isso
Jack Ammo
1
Executei os valores de algumas entradas por curiosidade (todas as pontuações estavam entre 1,5 e 2, para referência).
Draco18s