В чем смысл?


22

Напишите программу или функцию, которая принимает два целых числа, которые представляют координаты X и Y точки на декартовой плоскости .

Вход может прийти в любом приемлемом формате до тех пор , пока значение Х предшествует Y. Например, 1 -2, (1,-2), [1, -2], или 1\n-2все будет отлично для Х = 1, Y = -2.

Выведите или верните строку из одного символа (за которой следует необязательный завершающий символ новой строки), описывающий расположение точки на плоскости:

  • 1если точка находится в квадранте I
  • 2 если точка находится в квадранте II
  • 3 если точка находится в квадранте III
  • 4 если точка находится в квадранте IV
  • Xесли точка находится на оси х (нижний регистр xне допускается)
  • Yесли точка находится на оси Y (нижний регистр yне допускается)
  • O если точка находится на источнике (это заглавная буква "о", а не ноль)

Самый короткий код в байтах побеждает. Tiebreaker переходит к ответу с более высоким рейтингом.

Тестовые случаи

(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

Таким образом, для целей этой задачи оси X и Y не находятся в квадранте?
Rɪᴋᴇʀ

@RikerW Верно. В противном случае точка (0, 9) может быть названа квадрантом I или II.
Увлечения Кельвина

Является ли комплексное число (или его представление в виде строки "30+56i") допустимым форматом ввода?
Уровень Река Сент


Может ли ввод быть в виде комплексного числа? (напр. 1+2j)
Цифровая травма

Ответы:


16

Желе, 14 байт

Ṡḅ3ị“Y4X13X2YO

Попробуйте онлайн!

Как это работает

Ṡḅ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
Вступление в желе из телефонного клуба.
Деннис

3
Ааааа и Желе снова побеждает ...
ETHproductions

Очень хороший подход!
Луис Мендо

11

Рубин, 35 байт

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

Усиливая <=>оператор "космический корабль" ( ).

x <=> 0 вернется

  • 0 если x == 0
  • 1 если x > 0
  • -1 если x < 0

Следовательно,

  • если x == 0мы вернемся 'OY'[y<=>0]. Это

    • Oif y == 0(индексация строки в 0)

    • Yif y != 0(это верно, потому что и то, 1и другое -1приведет к Yиндексации по этой строке, так как -1относится к последнему символу в строке, который также оказывается в индексе 1)

  • если x > 0мы вернемся 'X14'[y<=>0]. Это Xесли y == 0, 1если y > 0и 4если y < 0(см. Объяснение выше).

  • если x < 0мы вернемся 'X23'[y<=>0].


6

JavaScript, 44 байта

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


3
Мои глаза болят, это одна длинная цепочка троичных операторов
andlrc

1
afaik разрешено писать анонимную функцию ( s/^f=//)
andlrc

5

ES6, 43 байта

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

Целый байт короче всех этих троиц!


3

Japt, 30 22 байта

"3Y2XOX4Y1"g4+3*Ug +Vg

Вдохновленный ответом Jelly @Dennis, прежде чем он добавил объяснение. Проверьте это онлайн!

Интересный факт: это было бы на два байта короче, если бы я добавил поддержку отрицательных чисел в gфункцию для строк.

Еще одна попытка, ближе к желе (23 байта):

"3Y2XOX4Y1"gNmg m+1 ¬n3

К сожалению, увеличение списка стоит 4 байта ...


2

MATL , 22 байта

'3X2YOY4X1'iZSQI1h*sQ)

Используется текущий выпуск (10.2.1) языка / компилятора.

Попробуйте онлайн!

объяснение

Это беззастенчиво заимствует великолепный подход в ответе Денниса .

'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 байт

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

Довольно просто.


1

Mathematica 81 байт

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

Сетчатка , 52

Это простой метод на основе подстановки:

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

Попробуйте онлайн . Дополнительная информация m`в начале некоторых строк необходима только для проверки нескольких входных данных за один раз, поэтому они не учитываются в счете.


Ранее я пробовал этот более интересный подход , но он немного дольше (около 65 без mмодификаторов):

[1-9]\d*
1
-1
2
(.) (.)
$1$*3$2$*1
3
111
m`^(.)*$
$#1
T`d`OYYX14X23
  • заменить все ненулевые числа на 1, оставив -знаки на месте
  • Заменить -1на2
  • Преобразуйте 1-е и 2-е числа одинарными с 3и, 1соответственно, как унарные цифры. Это эффективно дает 2 цифры base3, выраженные в одинарных
  • Преобразовать в 3с к 111. Это эффективно дает единственное унарное число, которое соответствует каждому из квадрантов, осей и происхождения
  • Преобразовать одинарные в одну десятичную цифру
  • Переместите десятичную цифру в соответствующий выходной символ.

1
Я не думаю, что Xстадия нужна, $так как на входе не будет ведущих нулей.
Мартин Эндер

1
Более интересный подход можно сократить как минимум до 40 байт . Теперь я посмотрю на это завтра еще немного.
Рандомера

Для пакетного запуска вам нужно немного настроить .
Рандомера

1

Октава, 34 байта

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

Старый трюк с базовым 3 через векторное умножение (хотя мне пришлось добавить 5 для учета индексов массивов на основе 1) плюс некоторая магия индексирования Октавы.

Ввод - это вектор формы [1, -2](с запятой или без нее), поэтому при назначении переменной w:

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

Вот оно на идеоне .


Кажется, что Ideone снова работает. Вы сделали что-то особенное, чтобы использовать это?
Луис Мендо

@LuisMendo Этот использует анонимную функцию. Именованные функции все еще не доступны для меня. :(
стакан

Ааа, ты прав. Были названы функции, которые не работали. Итак, все то же самое: - /
Луис Мендо

1

Пиф, 24

Слишком долго, но, возможно, интересный подход:

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

Ввод должен быть указан как комплексное число, например 1-2j. В основном вложенный троичный для тестирования:

  • если вход равен нулю - вывод O
  • иначе, если действительная часть равна нулю - вывод Y
  • иначе, если мнимая часть равна нулю - вывод X
  • иначе вычислите сложную фазу, умножьте на 2, делите целое число на π, затем мод и добавьте, чтобы получить соответствующий номер квадранта.

Попробуйте онлайн.


1

Java 8, 64 байта

это лямбда-выражение для BiFunction<Integer,Integer,String>.

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

3 байта можно сохранить, возвращая Characterвместо a, Stringно я не совсем уверен, будет ли автобокс хорошо играть с лямбдой.


1
О, конечно , этот ответ, использующий систему гандикапа PCCG, показал лучшие результаты (1,5598), чем ответ Денниса на желе (1,5929).
Draco18s

это довольно интересно спасибо за указание на это
Джек Боеприпасы

1
Из любопытства побежал значения для нескольких записей на этом (все оценки были между 1,5 и 2, для справки).
Draco18s
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.