У чому справа?


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 (малі регістри xне дозволені)
  • Yякщо точка знаходиться на осі у (малі регістри yне дозволені)
  • O якщо крапка є на початку (це велика літера "о", а не нуль)

Виграє найкоротший код у байтах. Тібрейкер переходить до вищої відповіді.

Випробування

(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)
Digital Trauma

Відповіді:


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
Aaaaaand Jelly знову перемагає ...
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

Натхненний відповіддю @Dennis 'Jelly, перш ніж він додав пояснення. Перевірте це в Інтернеті!

Факт забави: це було б на два байти коротше, якби я додав підтримку негативних чисел у 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

Математика 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
  • Перетворення першого і 2 - го числа одинарний з 3і 1відповідно як одинарних цифр. Це ефективно дає 2 базові3 цифри, виражені унарними
  • Перетворити в 3s до 111. Це фактично дає єдине одинарне число, яке відповідає кожному з квадрантів, осей та походження
  • Перетворити одинарне в одну десяткову цифру
  • Перенесіть десяткову цифру у відповідну вихідну діаграму.

1
Я не думаю, що Xсцена потребує, $оскільки не буде провідних нулів у введенні.
Мартін Ендер

1
Більш цікавий підхід можна скоротити як мінімум до 40 байт . Зараз я ще завтра погляну на це.
randomra

Для серійного запуску потрібні певні налаштування .
randomra

1

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

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

Старий трюк base-3 через векторне множення (хоча мені довелося додати 5 для обліку індексів масиву на основі 1), а також деяку магію індексації Octave.

Введення - це вектор форми [1, -2](із комою чи без), тому при призначенні змінної w:

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

Ось це на ideone .


Здається, Ideone знову працює. Ви зробили щось особливе, щоб скористатися ним?
Луїс Мендо

@LuisMendo Цей використовується анонімною функцією. Іменовані функції для мене все ще є захищеними. :(
стакан

Ааа, ти маєш рацію. Були названі функції, які не працювали. Тож все одно: - /
Луїс Мендо

1

Піт, 24

Занадто довгий, але, можливо, цікавий підхід:

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

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

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

Спробуйте в Інтернеті.


1

Java 8, 64 байти

це лямбда-вираз для 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 байти можна було б зберегти, повернувши Characterзамість цього, Stringале я не зовсім впевнений, чи автобаксинг буде чудово грати з лямбда.


1
О, акуратно, ця відповідь за допомогою системи PCCG Handicap набирає кращого результату (1,5598), ніж відповідь Деніса Желе (1,5929).
Draco18s

це досить цікаво. дякую, що
Jack Ammo

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