Japt、29 28バイト
JaptはJa 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{私たちは、から切り替えることでバイトを保存することができ、ZへX。また、£のショートカットはm@別のバイトを保存します:
1o5 £Ux /2-UgX%4
最近U、プログラムの開始時に通常は省略できる機能を実装しました。ただし、実装ミスのため、これは関数でも機能します。
1o5 £x /2-UgX%4
最後に、gインデックスが文字列の末尾を超えている場合、関数はラップ%4し、合計13バイトを削除できるようになります。
1o5 £x /2-UgX
そして、19はすごいと思った;-) オンラインでテストしてください!