ポイントは何ですか?


22

デカルト平面上の点のXおよびY座標を表す2つの整数を取り込むプログラムまたは関数を記述します。

入力があれば、Xの値は、例えばY.前に来るように、任意の合理的なフォーマットで来るかもしれない、1 -2(1,-2)[1, -2]、または1\n-2すべての罰金であろうためのX = 1、Y = -2。

平面内のポイントの位置を説明する単一の文字列(オプションの末尾の改行が続く)を印刷または返します。

  • 1ポイントが象限 Iにある場合
  • 2 ポイントが象限IIにある場合
  • 3 ポイントが象限IIIにある場合
  • 4 ポイントが象限IVにある場合
  • Xポイントがx軸上にある場合(小文字xは使用できません)
  • Yポイントがy軸上にある場合(小文字yは使用できません)
  • O ポイントが原点(ゼロではなく大文字の「oh」)にある場合

バイト単位の最短コードが優先されます。Tiebreakerは、上位の回答に進みます。

テストケース

(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")は有効な入力形式ですか?
レベルリバーセント

@steveverrillはい
カルビンの趣味

入力を複素数の形式にすることはできますか?(例1+2j
デジタル外傷

回答:


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ゼリーは...再び勝利
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

    • Y場合y != 0(両方ともので、これは真実である1とは-1になりますY。この文字列にインデックスを作成するとき、として-1も、インデックス1の1であることを起こる、文字列の最後の文字、をいいます。)

  • もしあればx > 0、我々は戻り'X14'[y<=>0]ます。これはXif y == 01if y > 0、および4ifです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
その(匿名関数を書くことが許さ私の知る限りs/^f=//
andlrc

5

ES6、43バイト

(x,y)=>"OYYX32X41"[3*!!x+3*(x>0)+!!y+(y>0)]

これらの3項すべてよりも短い1バイトです!


3

Japt、30 22バイト

"3Y2XOX4Y1"g4+3*Ug +Vg

説明を追加する前に、@ DennisのJellyの回答に触発されました。オンラインでテストしてください!

楽しい事実:g文字列の関数で負の数値のサポートを追加した場合、これは2バイト短くなります。

ゼリーに近い別の試み(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

Mathematica 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`いくつかの行の先頭にある余分なものは、一度に複数の入力をテストするためにのみ必要なので、スコアにはカウントされません。


以前、私はこのより興味深いアプローチを試みましたが、かなり長いです(m修飾子なしで約65 ):

[1-9]\d*
1
-1
2
(.) (.)
$1$*3$2$*1
3
111
m`^(.)*$
$#1
T`d`OYYX14X23
  • ゼロ以外のすべての数値を1に置き換え、-記号をそのまま残します
  • 代替-12
  • 31それぞれ単項数字として、単項および二項を単項に変換します。これにより、単項で表された2つのbase3桁が効果的に得られます。
  • 3sからに変換し111ます。これにより、各象限、軸、および原点に対応する単一の単項数が効果的に与えられます
  • 単項を1桁の10進数に変換します
  • 10進数を適切な出力文字に置き換えます。

1
入力に先行ゼロがないため、Xステージが必要だとは思わ$ない。
マーティンエンダー

1
より興味深いアプローチは、少なくとも40バイトに短縮できます。明日はもう少し見ます。
-randomra

バッチ実行には、微調整必要です。
-randomra

1

オクターブ、34バイト

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

ベクトル乗算による古いベース3のトリック(1ベースの配列インデックスを説明するために5を追加する必要がありましたが)に加えて、Octaveインデックス作成の魔法があります。

入力は[1, -2](カンマの有無にかかわらず)形式のベクトルなので、変数に割り当てられた場合w

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

ここにイデオネがあります。


イデオンは再び働いているようだ。それを使用するために何か特別なことをしましたか?
ルイスメンドー

@LuisMendoこれは匿名関数を使用します。名前の付いた関数は、まだ私にとって不自由です。:(
ビーカー

ああ、あなたは正しい。機能していない関数と名付けられました。まだ同じ:-/
ルイスメンドー

1

Pyth、24

長すぎるが、おそらく興味深いアプローチ:

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

入力は、たとえば、複素数として指定する必要があります1-2j。基本的に、テストするネストされた三値:

  • 入力がゼロの場合-出力 O
  • それ以外の場合、実部がゼロの場合-出力 Y
  • それ以外の場合、虚数部がゼロの場合-出力 X
  • それ以外の場合は、複素位相を計算し、2で乗算し、整数でπで除算し、次にmodおよびaddで適切な象限数を求めます。

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


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))+"";

aのCharacter代わりにaを返すことで3バイト節約できますがString、オートボクシングがラムダでうまく動作するかどうかは完全にはわかりません。


1
まあ、PCCGハンディキャップシステムを使用したこの回答のスコアは、デニスのゼリーの回答(1.5929)よりも優れています(1.5598)。
Draco18s

それは非常に興味深いです。それを指摘してくれてありがとう
ジャック弾薬

1
好奇心からこの1つに関するいくつかのエントリの値を実行しました(参考のため、すべてのスコアは1.5〜2でした)。
Draco18s
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.