Japt, 29 28 Bytes
Japt ist eine verkürzte Version von Ja vaScri pt . Dolmetscher
1o5 mZ=>$eval$(Uq'+)/2-UgZ%4
Beachten Sie, dass für die Pfeilfunktionen ein ES6-kompatibler Browser erforderlich ist, z. B. die neueren Versionen von Firefox. Die Eingabe erfolgt als Array mit 4 Elementen, z [1,-1,4,2].
Wie es funktioniert
// 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
Wie es gespielt wurde
Ich habe zuerst versucht, einfach den @ Mego-Python-Ansatz zu kopieren. Dies ließ mich mit diesem 48-Byte-Monster zurück:
(Hinweis: Die Eingabe sollte derzeit nicht in ein Array eingeschlossen werden.)
[U-V+W+X /2,(U+V-W+X /2,(U+V+W-X /2,(V+W+X-U /2]
Da jedes dieser Elemente durch 2 geteilt werden muss, ist es kürzer, das gesamte Array wie folgt abzubilden mY=>Y/2:
[U-V+W+X,U+V-W+X,U+V+W-X,V+W+X-U]mY=>Y/2
Was jetzt? Nun, das Array addiert einfach drei der Eingänge und subtrahiert den vierten, indem es dem Muster folgt 1,2,3,0. Wir könnten also die Eingaben in ein Array packen, sie dann addieren, durch 2 dividieren und das erforderliche Element subtrahieren:
[1,2,3,0]mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ
Schön, ein Byte gespart! Aber ist es möglich, das Array am Anfang zu verkleinern? Lassen Sie uns versuchen, es in einen String zu packen und dann wieder in ein Array aufzuteilen a:
"1230"a mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ
Schau dir das an, ein weiteres Byte gespeichert. Aber gibt es einen noch besseren Weg? Nun, wir können die Tatsache nutzen, dass [1,2,3,0] ≡ [1,2,3,4] mod 4:
1o5 mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ%4
Noch zwei Bytes! Jetzt gehen wir irgendwohin. Aber das Ug0 +Ug1 +Ug2 +Ug3kostet viel Platz. Was ist, wenn wir das Array durch Hinzufügen verkleinern?
1o5 mZ=>Ur(X,Y =>X+Y /2-UgZ%4
Wow, das hat wirklich geholfen! Jetzt sind wir auf 29 Bytes reduziert. Und dank @ ן nןuɟ ן oן konnte ich sogar ein weiteres Byte weniger Golf spielen. Aber wenn wir ein eingebautes Array verwenden könnten, um das Array zu summieren, wäre es viel kürzer:
1o5 mZ=>Uu /2-UgZ%4
19 Bytes! Tolle! Leider verfügt Japt noch nicht über solche Einbauten. Ich werde das hinzufügen, wenn ich eine Chance bekomme. Vorschläge sind willkommen, entweder für das Programm oder die Sprache!
Nun, seit Version 1.4.4 habe ich eine ganze Reihe weiterer Funktionen in Japt implementiert, als ich ursprünglich geplant hatte. Beginnend mit dem ursprünglichen Plan für die kürzere Version:
1o5 mZ=>Uu /2-UgZ%4
Zuerst müssen wir ein paar Dinge ändern: Funktionen werden mit definiert {, und die Summenfunktion ist x. Diese Version funktioniert wie sie ist:
1o5 mZ{Ux /2-UgZ%4
Nun @ist eine Abkürzung für XYZ{, so dass wir ein Byte speichern , indem Sie von einem Wechsel Zzu X. Außerdem gibt £es eine Abkürzung zum m@Speichern eines weiteren Bytes:
1o5 £Ux /2-UgX%4
Kürzlich habe ich eine Funktion implementiert, bei der ein Uam Anfang des Programms normalerweise weggelassen werden kann. Aufgrund eines Implementierungsfehlers funktioniert dies jedoch auch mit Funktionen:
1o5 £x /2-UgX%4
Schließlich wird die gFunktion jetzt umbrochen, wenn der Index hinter dem Ende der Zeichenfolge liegt, sodass wir %4insgesamt 13 Byte entfernen können :
1o5 £x /2-UgX
Und ich fand 19 großartig ;-) Teste es online!