一条线穿过的象限


15

任务

给定线的表示形式,输出该线通过的象限数。

线的有效表示

您可以将一行表示为

  • 三个有符号整数ABC,它们不共享公因数,其中AB都不为零,代表行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)

1
如果需要的话,他们应该教我们在学校里从漏泄尼姑那里借来的战术。
mbomb007 '17

Answers:



3

果冻,5字节

TL’ȧ$

在线尝试!

  • -1字节感谢Challenger5
  • -1字节感谢Leaky Nun
  • -2个字节感谢H.PWiz

不再基于Leaky的答案!


ċ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个字节要归功于Herman Lauenstein,-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

GolfScript16 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);
}

我认为您可以使用{!!}%代替[{!!}/]
硕果累累

此提交的CJam翻译是{:!:!:+_1>*}
硕果累累

@ Challenger5大声笑,我怎么没意识到这一点。同样不错的端口,我只需要学习如何立即阅读它。
Marcos

这种情况下的显着差异是:1)映射的简写(:!相当于{!}%),2)简化的简写(:+相当于{+}*),3).更改为_(因为CJam具有浮点数)和4)CJam没有输入默认情况下位于堆栈上,这意味着您将代码包装起来{}使其具有功能。
硕果累累


1

JavaScript,25个字节

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

基于Leaky Nun的回答。




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+

在线尝试!

某种程度上基于Leaky的回答 ; 使用相同的前提,但使用不同的映射方法。

怎么运行的

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答案 Leaky的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

在线尝试!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.