Квадранты прошли через линию

15

задача

Если дано представление линии, выведите количество квадрантов , через которые проходит эта линия.

Допустимые представления линии

Вы можете представить линию как

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

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

Характеристики

  • Выходными данными всегда будут 0, 2 или 3 (строка никогда не может проходить через все четыре квадранта и не может проходить только через один).
  • Считается, что линия на оси не проходит через какие-либо квадранты. Считается, что линия через начало координат проходит только через 2 квадранта.
  • Вам не нужно возвращать, через какие квадранты они проходят (хотя в тестовых примерах они приведены для ясности).
  • Это , поэтому выигрывает самый короткий действительный ответ (измеряется в байтах).

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

Вам придется конвертировать их в подходящий формат, прежде чем использовать их.

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)
Esolanging Fruit
источник
1
Они должны учить тактике, которую мы все позаимствовали у Лики Нун в школе, если в этом была необходимость.
mbomb007

Ответы:

22

Python 3 , 24 байта

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

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

Дрянная Монахиня
источник
3
... Вау. Это более тривиально, чем я думал.
Esolanging Fruit
Возможно, вы можете использовать строку вместо списка, если I / O позволяет это.
Джонатан Фрех
Будет ли '320'[a.count(0)]приемлемым использование и возврат значения в строковой форме?
FlipTack
2
И ничего себе, похоже, все ответы теперь будут «основаны на Leaky's»
FlipTack
3
@FlipTack bithacks победа: P
Дрянная Монахиня
3

Желе , 5 байт

TL’ȧ$

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

  • -1 байт благодаря Challenger5
  • -1 байт благодаря Leaky Nun
  • -2 байта благодаря H.PWiz

Больше не основано на ответе Лики!

Кэрд
источник
ċ0ị2,0,3сохраняет байт
Esolanging Fruit
@ Challenger5 Да, так и есть. Благодарность!
день рождения
1
7 байт
Утренняя монахиня
1
Как насчет того TL’ȧ$. Не знаю, желе, так что это может быть в гольф
H.PWiz
@ H.PWiz Очень приятно! Я не думаю, что это можно сыграть в гольф, но я могу ошибаться.
Caird Coneheringaahing
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);
}
Marcos
источник
Я думаю, что вы можете использовать {!!}%вместо [{!!}/].
Esolanging Fruit
CJam перевод этого представления {:!:!:+_1>*}.
Esolanging Fruit
@ Challenger5 лол, как я этого не понял. Также хороший порт, я просто должен научиться читать его сейчас.
Маркос
Существенными отличиями в этом случае являются: 1) сокращение для отображения ( :!эквивалентно {!}%), 2) сокращение для сокращения ( :+эквивалентно {+}*), 3), .которое изменяется на _(потому что CJam имеет значения с плавающей запятой), и 4) то, что CJam не имеет ввода по умолчанию в стеке, то есть вы оборачиваете код, {}чтобы сделать его функцией.
Esolanging Fruit
1

JavaScript, 25 байт

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

Основано на ответе Лики Нун.

ericw31415
источник
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

Deorst , 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$>+

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

Исходя из моего ответа Deorst и Python ответа Дырявого в

Как это устроено

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

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

Кэрд
источник