ラインが通る象限


15

仕事

線の表現が与えられたら、その線が通過する象限の数を出力します。

線の有効な表現

次のように線を表すことができます

  • 三つの符号付き整数ABおよびC共通因数を共有しない、どこでどのABラインを表し、両方ともゼロではありませんAx + By = C
  • 四つの符号付き整数、、、および、点を通る直線を表すと、またはX1Y1X2Y2(X1, Y1)(X2, Y2)
  • 言語に行がある場合、行を記述するデータ型(縦線をサポートする必要があります)。

垂直線を許可しない形式(傾斜切片形式など)で入力を行うことはできません。入力として整数を使用することを選択した場合、整数が包括的範囲にあると想定できます[-127, 128]

仕様書

  • 出力は常に0、2、または3になります(ラインは4つの象限すべてを通過することはできず、1つの象限だけを通過することもできません)。
  • 軸上の線は、象限を通過しないと見なされます。原点を通る線は、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

回答:


22

Python 3、24バイト

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

オンラインでお試しください!


3
... ワオ。これは私が思ったよりも些細なことです。
エソランジングフルーツ

I / Oで許可されている場合は、リストの代わりに文字列を使用できます。
ジョナサンフレッチ

'320'[a.count(0)]文字列形式で値を使用して返すことは受け入れられますか?
FlipTack

2
そして、すごい、すべての答えは「リーキーに基づいている」ように見える
-FlipTack

3
@FlipTack bithacksが勝つ:P
リーキー修道女

3

ゼリー、5バイト

TL’ȧ$

オンラインでお試しください!

  • Challenger5のおかげで-1バイト
  • Leaky Nunのおかげで-1バイト
  • H.PWizのおかげで-2バイト

リーキーの答えに基づいたものではなくなりました!


ċ0ị2,0,3バイトを節約
Esolanging Fruit

@ Challenger5ええ、そうです。ありがとう!
ケアニアン共犯


1
どうですかTL’ȧ$。ゼリーを知らないので、これはgolfableかもしれない
H.PWiz

@ H.PWizとても素敵!ゴルフができるとは思いませんが、間違っているかもしれません。
ケアニ共生

3

Javascript(ES6)、30 24 22バイト

Javascriptでゴルフをしようとするのはこれが初めてです。 ゼロをカウントするより良い方法があります...

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

Herman Lauensteinのおかげで-6バイト、演算子の優先順位を記憶するために-2バイト。

代わりに文字列を返す24バイトの代替ソリューション:

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

1
それは...実際にはかなり賢いです
Esolangingフルーツ

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

全体を1つの数学問題にまとめることができます

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

{!!}%代わりに使用できると思います[{!!}/]
エソランジングフルーツ

この投稿のCJam翻訳は{:!:!:+_1>*}です。
エソランジングフルーツ

@ Challenger5笑、どうしてそんなことに気付かなかったんだ。また、すてきなポート、私は今それを読む方法を学ばなければなりません。
マルコス

この場合の重要な違いは、1)マッピングの略記(:!に相当{!}%)、2)縮小の略記(:+に相当{+}*)、3)(CJamにはfloatがあるため)に.変更され_、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+

オンラインでお試しください!

リーキーの答えにある程度基づいている。同じ前提を使用しますが、マッピング方法は異なります。

使い方

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

Add ++、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

オンラインでお試しください!

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.