Квадрати пройшли по лінії


15

Завдання

Враховуючи подання лінії, виведіть кількість квадрантів , через які проходить ця лінія.

Дійсні зображення лінії

Рядок можна представляти як

  • Три підписані цілі числа A, Bі Cякі не мають загального коефіцієнта, і де, Aі Bне є обома нулями Ax + By = C,
  • Чотири цілих числа , , і , представляючи лінію , що проходить через точку і , абоX1Y1X2Y2(X1, Y1)(X2, Y2)
  • Тип даних, що описує рядок, якщо у вас є мова (вона повинна підтримувати вертикальні лінії).

Ви не можете приймати дані в будь-якому форматі, який не передбачає вертикальної лінії (наприклад, форма перехоплення нахилу). Якщо ви вирішите взяти цілі числа як вхідні дані, ви можете припустити, що вони лежать у межах включення [-127, 128].

Технічні умови

  • Вихід завжди буде 0, 2 або 3 (рядок ніколи не може пройти через усі чотири квадранти, а також не може пройти лише через один).
  • Лінія на осі вважається такою, що не проходить через жодні квадрати. Лінія через початок вважається прохідною лише через два квадранти.
  • Вам не потрібно повертати, через які квадрати передаються (хоча тестові приклади включають їх для наочності).
  • Це , тому найкоротша відповідна відповідь (вимірюється в байтах) виграє.

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

Перед їх використанням вам доведеться перетворити їх у відповідний формат.

1x + 1y = 1   ->  3  (quadrants I, II, and IV)
-2x + 3y = 1  ->  3  (quadrants I, II, and III)
2x + -3y = 0  ->  2  (quadrants III and I)
1x + 1y = 0   ->  2  (quadrants II and IV)
3x + 0y = 6   ->  2  (quadrants I and IV)
-3x + 0y = 5  ->  2  (quadrants II and III)
0x + -8y = 4  ->  2  (quadrants III and IV)
0x + 1y = 0   ->  0  (lies on the x-axis)
1x + 0y = 0   ->  0  (lies on the y-axis)

1
Вони повинні навчити тактиці, яку ми всі запозичили у Leaky Nun у школі, якщо в цьому була потреба.
mbomb007

Відповіді:


22

Python 3 , 24 байти

lambda a:3<<a.count(0)&3

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


3
... Ого. Це більш тривіально, ніж я думав.
Esolanging Fruit

Можливо, ви можете використовувати рядок замість списку, якщо введення / виведення дозволяє.
Джонатан Фрех

Чи '320'[a.count(0)]прийнятним буде використання та повернення значення у рядковій формі?
FlipTack

2
І ось так, схоже, всі відповіді тепер будуть "засновані на Leaky's"
FlipTack

3
@FlipTack bithacks win: P
Leaky Nun

3

Желе , 5 байт

TL’ȧ$

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

  • -1 байт завдяки Challenger5
  • -1 байт завдяки Leaky Nun
  • -2 байти завдяки H.PWiz

Більше не грунтуйтесь на відповіді Лікі!


ċ0ị2,0,3рятує байт
Esolanging Fruit

@ Challenger5 Так, так і є. Спасибі!
caird coinheringaahing


1
Як щодо TL’ȧ$. Не знаю Джелі, тож це може бути пограшним
H.PWiz

@ H.PWiz Дуже приємно! Я не думаю, що це може бути гольф, але я можу помилятися.
caird coinheringaahing

3

Javascript (ES6), 30 24 22 байт

Це вперше я намагаюся займатися гольфом у Javascript. Повинен бути кращий спосіб порахувати нулі ...

(a,b,c)=>3<<!a+!b+!c&3

-6 байт завдяки Герману Лаунштейна, -2 байти для запам'ятовування пріоритетів операторів.

Чергуйте 24-байтове рішення, щоб замість нього повернути рядок:

(a,b,c)=>"320"[!a+!b+!c]

1
Це насправді досить розумно ...
Esolanging Fruit

1
24 байти, не використовуючи масив(a,b,c)=>3<<(!a+!b+!c)&3
Herman L

Схоже, я не можу гольфу, щоб більше не використовувати масив ...
ericw31415



2

GolfScript , 16 14 байт

~{!!}%{+}*.1>*

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

  • @ Challenger5 -2 байти

Ця програма приймає масив з 3 цілих чисел, що представляють коефіцієнти в рівнянні Ax + By = C

Приклад введення / виводу

[1 1 1]   -> 3
[-2 3 1]  -> 3

Як це працює

~                       - Eval string (input)
  {  }%                 - Map to array
   !!                   - Double not (equivalent to != 0)
        {+}*            - total array (fold addition)
            .           - Duplicate top of stack
             1>         - Greater than 1?
               *        - Multiply     

Спочатку це було трохи хитро для мене, щоб з'ясувати математичний спосіб обчислити це. Однак є лише 8 можливих конфігурацій, такихa != 0 & b != 0 & c != 0

0 0 0 = 0
a 0 0 = 0
0 b 0 = 0
0 0 c = 0
a 0 c = 2
0 b c = 2
a b 0 = 2
a b c = 3

Зрештою я прийшов до наступної функції.

F(a,b,c) {
    var r = sign(a)+sign(b)+sign(c);
    if(r > 1)
        r;
    else
        return 0;
}

і все це може бути зведене до однієї математичної задачі

F(a,b,c) {
    return (sign(a)+sign(b)+sign(c)) * (sign(a)+sign(b)+sign(c) > 1);
}

Я думаю, ви можете використовувати {!!}%замість цього [{!!}/].
Esolanging Fruit

Переклад CJam цього представлення є {:!:!:+_1>*}.
Esolanging Fruit

@ Challenger5 lol, як я цього не усвідомлював. Також гарний порт, я просто повинен навчитися читати його зараз.
Маркос

Істотними відмінностями в цьому випадку є 1) скорочення для відображення ( :!еквівалентно {!}%), 2) скорочення скорочення ( :+еквівалентне {+}*), 3), яке .змінюється _(оскільки CJam має плаваючі), і 4) те, що CJam не має вводу у стеці за замовчуванням, це означає, що ви загортаєте код, {}щоб зробити його функцією.
Esolanging Fruit


1

JavaScript, 25 байт

_=>3<<!_[0]+!_[1]+!_[2]&3

Виходячи з відповіді Лікі Нун.




1

ABCR , 30 байт

Вводиться у формі, A,B,Cде коми можуть бути замінені будь-якими нечисловими, не -символами.

BBi7baxci7baxci7bax@7)A7(xxo

Інтернетного перекладача поки немає, але ось пояснення:

BB                                Add two values to the B queue. (Values are unimportant)
  i7 ax                           Read in a number.  If it's non-zero...
    b                             Dequeue one item from the B queue.
       c                          Read in the delimiter...
        i                         ... And promptly overwrite it with the next number.
         7baxci7bax               Repeat the whole "if 0, dequeue from B" for the
                                     other two input numbers.
                   @              Get the current length of the B queue. [2, 1, or 0]
                    7             If the length isn't 0...
                     )            ... Increment it to our required [3,2,0]
                      A           ... And enqueue it to A.
                                  (We don't need to add to A otherwise, because it defaults
                                    to 0 already if there's no value in it.
                                    I used that to exit the queue with 7_ax earlier.)
                       7(xx       Set the register to 0 to exit from loop.
                           o      Peek A and print as a number.


0

Деорст , 12 байт

l0EN))A:k?Z+

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

Дещо спираючись на відповідь Лікі ; використовує те саме приміщення, але інший метод відображення.

Як це працює

Deorst має вбудований підрахунок подій, але не має (чомусь) команди індексації, тому мені довелося створити наступне відображення, де ліворуч a.count(0)і праворуч - бажаний результат

0 -> 3
1 -> 2
2 -> 0

Сама програма працює так (приклад введення [1,1,1])

l0           - Push 0;     STACK = [[1 1 1] 0]
  EN         - Count;      STACK = [0]
    ))       - Subtract 2; STACK = [-2]
      A      - Absolute;   STACK = [2]
       :     - Duplicate;  STACK = [2 2]
        k?Z  - Positive?;  STACK = [2 1]
           + - Sum;        STACK = [3]

0

Додайте ++ , 23 байти

D,f,@@@,!$!@!s2$_|d0$>+

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

Виходячи як з моєї відповіді Деорста, так і з відповіді Літі на Пітон

Як це працює

D,f,@@@,  - Create a triadic function. 
            Example arguments;   [1 1 1]
        ! - Logical NOT; STACK = [1 1 0]
        $ - Swap;        STACK = [1 0 1]
        ! - Logical NOT; STACK = [1 0 0]
        @ - Reverse;     STACK = [0 0 1]
        ! - Logical NOT; STACK = [0 0 0]
        s - Sum;         STACK = [0]
        2 - Push 2;      STACK = [0 2]
        $ - Swap;        STACK = [2 0]
        _ - Subtract;    STACK = [-2]
        | - Absolute;    STACK = [2]
        d - Duplicate;   STACK = [2 2]
        0 - Push 0;      STACK = [2 2 0]
        $ - Swap;        STACK = [2 0 2]
        > - Greater to;  STACK = [2 1]
        + - Sum;         STACK = [3]

Однак я думаю, що я занадто багато використовував функції в Add ++, а не основний корпус коду. Тож я спробував це зробити, використовуючи обидві функції, і тіло коду, і в результаті вийшло набагато приємніший 50-байтний фрагмент (так, це найдовша відповідь тут):

# Example input: 1 1 1;
# x and y are the accumulators

D,f,@@@,!$!@!s # Count the 0s
$f>?>?>?       # Call f with the input.
-2   # Subtract 2;    x: -2;  y: 0
^2   # Square;        x: 4;   y: 0
S    # Square root;   x: 2.0; y: 0
\1   # To integer;    x: 2;   y: 0
y:x  # Assign x to y; x: 2;   y: 2
}    # Switch to y;   x: 2;   y: 2
>0   # Is positive?;  x: 2;   y: 1
}    # Switch to x;   x: 2;   y: 1
+y   # Add y to x;    x: 3;   y: 1
O    # Print x

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.