正方形の側面の特定


13

最初のコードゴルフチャレンジへようこそ!:)すぐに飛びましょう。

チャレンジ:

O(原点)とT(ターゲット)の2つの浮動小数点ベクトルがある場合、値LRをSTDOUTに出力するプログラムを作成する必要があります。

  1. Oは正方形の1つの角です
  2. Tは、Oの反対側にある正方形の1つの角です。
  3. Lは、不完全な正方形のもう一方のポイントを示す2Dポイント(コーナー)です。
  4. Rは、Lの反対側の2Dポイント(角)です。

ルール

  1. OおよびTの値は、STDINから読み取る必要があります(入力例を参照)。
  2. 繰り返しますが、LRの値はSTDOUTに出力する必要があります。

得点とボーナス

  1. プログラムのバイトをカウントします。
  2. プログラムがOからLTからRを結ぶ線を引く場合、バイトカウントから15バイトを引きます。

最初の行は入力(Oの場合は最初の角括弧、Tの場合は次の角括弧)をカバーし、他の行は期待される出力を表します。

  • [0、0] [3、3]期待:[0、3] [3、0]
  • [0、0] [-2、-2]予想:[-2、0] [0、-2]
  • [1、-1] [4、2]予想:[1、2] [4、-1]
  • [0、-1] [0、1]予想:[-1、0] [1、0]

注意:入力と出力は浮動小数点にすることができます!

重要な情報!

  • OおよびTは、STDIN(例:[]または()...内)からのものである限り、任意の形式で使用できます。
  • LRは任意の順序で印刷できます。
  • 覚えておいてください:(O-> L-> T-> R-> O)が接続されている場合、各辺は同じ長さでなければなりません!

勝ち

  • これはコードゴルフですので、バイトの答えが最も少なくなります!
  • 勝者の回答は、2015年11月15日日曜日20:00-22:00(フィンランド時間)に受け入れられます(私が間違っていなければ、その日付は米国の2015年11月15日のように書かれています。混乱しないでください)。

ハッピーゴルフ!


3
気付いていない場合は、今後の課題のためにサンドボックスをお勧めます。フィードバックを取得し、課題が公開される前に(および変更によって既存の回答が無効になる前に)課題を磨くことができます。
マーティンエンダー

入力を2つの複素数のリストとして取得できますか?
リスト管理者

@ThomasKwaは、あなたがそれをリストとして取ることができると確信しています。与えられた入力は複素数ではありません...?コンピューターが計算する値を自分で個人的に知る必要はありませんよね?
Yytsi

「正方形のポイント」と言うとき、それは角を意味するように見えますか?正方形には他にも多くのポイントがあります。
レトコラディ

@RetoKoradiそのとおりです。私はそれでコーナーを意味します。
-Yytsi

回答:


8

真剣に、11バイト

TI-BASICの回答の移植版。計算しmean(X)+i*(X-mean(X))ます。

,;Σ½;)±+ï*+

説明:

,           Read input
;           Duplicate
Σ½          Half the sum (the mean) of the top copy
;           Copy the mean
)           Rotate stack to the left
            Now there's a copy of the mean on the bottom
±+          Negate mean and add to input list
ï*          Multiply by i
+           Add to mean

2つの複素数のリストとして入力:[1-1j,4+2j]、および同じ形式の出力:[(4-1j), (1+2j)]


3
私はとても誇りに思っています...
Mego

この回答が掲載された後、Mego æはリストの平均値を追加し、î(multiply-by-i)をベクトル化して、競合しない9バイトのソリューションを可能にしました。真剣に良い言語になり始めています。
リトシアスト

「まじめに」良い言語。@ThomasKwa
アディソンクランプ

Σ2バイトではないですか?
アッシュBurlaczenko

@AshBurlaczenkoは真剣に使っているようだCP437エンコーディングΣコードポイント0xF4を持っています。
デニス

6

真剣に、25バイト

,i││-++½)+-+½)++-½)±+++½)

入力をリストとして受け取ります: [x1,y1,x2,y2]

私のPythonの答えと同じ戦略ですが、真剣に!

説明:

,      get input
i      flatten list
││     duplicate stack twice, so that we have 4 copies of the input total
-++½)  calculate the first x-value using the formula (x1-y1+x2+y2)/2, and shove it to the end of the stack
+-+½)  calculate the first y-value using (x1+y1-x2+y2)/2, and shove it to the end of the stack
++-½)  calculate the second x-value using (x1+y2+x2-y2)/2, and shove it to the end of the stack
±+++½) calculate the second y-value using (-x1+y1+x2+y2)/2, and shove it to the end of the stack

オンラインで試す


3
これは本当にクールです!(パンの意図。)
kirbyfan64sos

5

TI-BASIC、16バイト

TI-83 +または84+シリーズの計算機用。

Input X
i∟X+.5sum(∟X-i∟X

誤解しない限り、OPは入力と出力を複素数として扱うことで問題ないと述べました。のiここでは虚数単位ではなく、統計変数です。

TI-BASICにはmean(機能がありますが、迷惑なことに、複雑なリストでは機能しませんERR:DATA TYPE

の形式{1-i,4+2i}で入力し[[1,-1],[4,2]]ます。出力はの形式{4-i 1+2i}です[[1,2][4,-1]]


これは、TI-BASICが文字列のリストをサポートしていないことを思い起こさせます。P:それはおそらく私はTI-BASICに追加します一つのことだろう
コナー・オブライエン

4

Matlab、51 45 46 45 42バイト

これで、入力は1つの列ベクトルで期待されます:([x0;y0;x1;y1]同じフォーマットで出力)完全なプログラムになるように変更しました。

z=eye(4);disp((.5-z([2:4,1],:))*input(''))

または代わりに

z=[1,1;-1,1];disp([z',z;z,z']*input('')/2)

古いソリューション:

入力には列ベクトルが必要です。たとえば f([0;0],[3;3])

@(a,b)[0,1;-1,0]*(b-a)*[.5,-.5]+(b+a)*[.5,.5]

また、2つの列ベクトルを(2x2行列として)返します。


3

Japt、29 28バイト

JaptJa vaScri ptの短縮バージョンです。通訳

1o5 mZ=>$eval$(Uq'+)/2-UgZ%4

矢印機能には、新しいバージョンのFirefoxなどのES6準拠のブラウザーが必要であることに注意してください。入力は4項目の配列として入ります。たとえば、[1,-1,4,2]

使い方

         // Implicit: U = input array
1o5      // Create a range of integers from 1 to 5. Returns [1,2,3,4]
mZ=>     // Map each item Z in this range to:
$eval$(  //  evaluate:
 Uq'+    //   U joined with "+" (equivalent to summing U)
)/2      //  divided by 2,
-UgZ%4   //  minus the item at Z%4 in the input. This translates to [y₁,x₂,y₂,x₁],
         //  which in turn tranlsates to:
         //   [(x₁-y₁+x₂+y₂)/2, (x₁+y₁-x₂+y₂)/2, (x₁+y₁+x₂-y₂)/2, (-x₁+y₁+x₂+y₂)/2]
         //  which is [Lx,Ly,Rx,Ry], or [Rx,Ry,Lx,Ly], depending on the situation.
         // Implicit: Output last expression

ゴルフの様子

最初に、@ MegoのPythonアプローチを単純にコピーしてみました。これにより、この48バイトのモンスターが残りました
(注:現在、入力は配列にラップされるべきではありません。)

[U-V+W+X /2,(U+V-W+X /2,(U+V+W-X /2,(V+W+X-U /2]

これらの各項目は2で割る必要があるため、配列全体をマップする方が短くなりますmY=>Y/2

[U-V+W+X,U+V-W+X,U+V+W-X,V+W+X-U]mY=>Y/2

それで?さて、配列は単純に3つの入力を追加し、4番目の入力を減算して、パターンに続いています1,2,3,0。したがって、入力を配列にパックしてから、それらを加算し、2で除算し、必要なアイテムを減算することができます。

[1,2,3,0]mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ

ナイス、1バイト節約しました!しかし、最初に配列を縮小することは可能ですか?文字列にパックしてから、配列に分割して戻しましょうa

"1230"a mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ

それを見て、別のバイトが保存されました。しかし、さらに良い方法はありますか?さて、次の事実を使用できます[1,2,3,0] ≡ [1,2,3,4] mod 4

1o5 mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ%4

さらに2バイト!今、私たちはどこかに行きます。しかし、それUg0 +Ug1 +Ug2 +Ug3は多くのスペースを占有しています。追加で配列を減らすとどうなりますか?

1o5 mZ=>Ur(X,Y =>X+Y /2-UgZ%4

わあ、本当に助かりました!これで29バイトになりました。そして、@ןnɟuɐɯɹɐןo thanksのおかげで、さらに1バイト削減することができました。ただし、組み込みを使用して配列を合計できる場合は、はるかに短くなります。

1o5 mZ=>Uu /2-UgZ%4

19バイト!すごい!残念ながら、Japtにはこのような組み込み機能がまだありません。機会があればこれを追加します。プログラムまたは言語についての提案を歓迎します!


さて、v1.4.4の時点で、私は当初計画していたよりもかなり多くの機能をJaptに実装しました。短いバージョンの元の計画から開始:

1o5 mZ=>Uu /2-UgZ%4

まず、いくつかのことを変更する必要があります。関数はで定義され{、合計関数はxです。このバージョンは現状のまま動作します:

1o5 mZ{Ux /2-UgZ%4

さて、@の省略形であるXYZ{私たちは、から切り替えることでバイトを保存することができ、ZX。また、£のショートカットはm@別のバイトを保存します:

1o5 £Ux /2-UgX%4

最近U、プログラムの開始時に通常は省略できる機能を実装しました。ただし、実装ミスのため、これは関数でも機能します。

1o5 £x /2-UgX%4

最後に、gインデックスが文字列の末尾を超えている場合、関数はラップ%4し、合計13バイトを削除できるようになります

1o5 £x /2-UgX

そして、19はすごいと思った;-) オンラインでテストしてください!


おそらく、Japtに相当するを使用して、いくつかのバイトを節約できますeval(U.join`+`)
ママファンロール

私はこの言語が大好きです:D
フェーズ

@ןnɟuɐɯɹɐןoɯ evalまだ同等のものを追加していないにもかかわらず、実際にバイトを節約してくれてありがとう!
ETHproductions

2

Javascript(Node.js / ES6)、154バイト

process.stdin.on('data',s=>(s=s.toString().split(','),a=s[0]-0,b=s[1]-0,x=s[2]-0,y=s[3]-0,console.log([a+(c=(a+x)/2-a)+(d=(b+y)/2-b),b+d-c,a+c-d,b+d+c])))

stdinの取得は、コードの長い部分です。入力は、コンマで区切られたポイントにする必要があります。

echo "0,0,3,3" | node square.js

これは完全なプログラムですか...?STDOUTにポイントを出力するのは...?そうではないようです。
Yytsi

あなたが正しい。くそー、これは多くのバイトを追加します
Naouak

Voilà、修正済み。ほぼ3倍になりました:(
Naouak

うーん:/私はまだポイントがうまく機能する美しいコードアートを作ることだと思います。そして、あなたが提供したコードは非常に複雑な見た目とハンサムなアートです。:)参加してくれてありがとう!
Yytsi

2

ngn APL、21バイト

⎕←F.5 0J.5×(F←+/,-/)⎕

これは、入力を複素数のペア(例:)として受け取り、1J¯1 4J2同じ方法で出力(例:)を出力し4J¯1 1J2ます。ngn / aplデモでオンラインで試してください。


すべての正の入力に対して機能しますが、負の数値を入力しても何も出力されません。間違った形式で入力していますか?1J1 3J3は動作します。0J-1 0J1はサポートしていません。また、負の数を宣言するために、上側のマイナス記号を使用しようとしました。
-Yytsi

@TuukkaX行き方の高いマイナス。1 ¯1inputの出力が得られますが0J¯1 0J1、これは正解です。あなたは何を得ていますか?
デニス

1
ああ、今私はそれを機能させた。高マイナス記号の前にある小さな空白を削除する必要がありました。正常に機能します。
Yytsi



1

CJam、30バイト

q~_:.+\:.-(W*+_2$.+@@.-].5ff*`

オンラインで試す

これは、リストのリストとして入力を受け取ります。例えば、最後の例の場合:

[[0 -1] [0 1]]

説明:

q~      Get and interpret input.
_       Make a copy.
:.+     Reduce the list of two points with vector sum operator.
\       Swap copy of input to top.
:.-     Reduce the list of two points with vector difference operator.
(W*+    Turn (x, y) into orthogonal (y, -x) by popping off first element, inverting
        its sign, and concatenating again. We now have center and offset vector.
_2$     Create a copy of both...
.+      ... and add them.
@@      Rotate original values to top...
.-      ... and subtract them.
]       Wrap the two results...
.5ff*   ... and multiply all values by 0.5.
`       Convert list to string.

1

プロローグ、118バイト

p([A,B],[C,D]):-read([E,F,G,H]),I is(E+G)/2,J is(F+H)/2,K is(G-E)/2,L is(H-F)/2,A is I-L,B is J+K, C is I+L, D is J-K.

少し読みやすい:

p([A,B],[C,D]):-read([E,F,G,H]),
                        I is(E+G)/2,
                        J is(F+H)/2,
                        K is(G-E)/2,
                        L is(H-F)/2,
                        A is I-L,
                        B is J+K, 
                        C is I+L, 
                        D is J-K.

プログラムを開始するには:

p(X,Y).

既知の角が[1、-1] [
4、2]の場合の入力例:[1、-1,4,2]

出力の例。XとYに未知の角が含まれる場合:
X = [ 1.0、2.0 ]、
Y = [4.0、-1.0] ここで

オンライン 試してください

編集: STDINからの入力を読み取るように変更


これはSTDINから読み取ってSTDOUTに出力しますか...?
-Yytsi

@TuukkaX:おそらくない。クエリの形式で入力を受け取ります。私は、入力が私たちが望むどんなフォーマットでもあり得ると言った部分を読みました。STDINに関する部分を見逃しました。PrologのSTDINが何であるかさえわかりません。ユーザーからの入力を読んでも大丈夫でしょうか?
エミグナ

STDINは標準入力を表します。したがって、ユーザーからの読み取りが進むべき方法です:)、フォーマットとは、ユーザーが値を入力する方法を意味します。EX [X、Y] [X、Y]または{X、Y} ...
Yytsi

0

Python 3、102バイト

g=lambda a,b,c,d:((a-b+c+d)/2,(a+b-c+d)/2,(a+b+c-d)/2,(d+b-a+c)/2)
print(g(*map(float,input().split())))

入力はx1 y1 x2 y2、1行の形式で取得されます。

オンラインで試す


あなたが何かを間違った操作を行い、あなたのバイト数は、それぞれの編集に上昇したが、私は:バイトを持参しようとダウン各編集= Pと
flawr

8
@flawr私は抗デニスだ
MEGO

すべての答えは、STDIN(または最も近い代替)からの入力を受けて、完全なプログラムである必要があると思います。これは資格がありますか?
ETHproductions

0

Python 2、56バイト

i=input()
s=sum(i)/2.0
print s-i[1],s-i[2],s-i[3],s-i[0]

入力が可能x1,y1,x2,y2(x1,y1,x2,y2)

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