Japt, 29 28 bytes
Japt es una versión abreviada de Ja vaScri pt . Interprete
1o5 mZ=>$eval$(Uq'+)/2-UgZ%4
Tenga en cuenta que las funciones de flecha requieren un navegador compatible con ES6, como las versiones más recientes de Firefox. La entrada entra como una matriz de 4 elementos, por ejemplo [1,-1,4,2]
.
Cómo funciona
// 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
Cómo fue golfizado
Primero intenté simplemente copiar el enfoque Python de @ Mego. Esto me dejó con este monstruo de 48 bytes:
(Nota: la entrada no debe estar envuelta actualmente en una matriz).
[U-V+W+X /2,(U+V-W+X /2,(U+V+W-X /2,(V+W+X-U /2]
Dado que cada uno de estos elementos debe dividirse entre 2, es más corto asignar toda la matriz con mY=>Y/2
:
[U-V+W+X,U+V-W+X,U+V+W-X,V+W+X-U]mY=>Y/2
¿Ahora que? Bueno, la matriz ahora simplemente agrega tres de las entradas y resta la cuarta, siguiendo el patrón 1,2,3,0
. Entonces, podríamos empacar las entradas en una matriz, luego sumarlas, dividirlas por 2 y restar el elemento necesario:
[1,2,3,0]mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ
¡Bien guardado un byte! Pero, ¿es posible reducir la matriz al principio? Intentemos empaquetarlo en una cadena, luego dividirlo en una matriz con a
:
"1230"a mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ
Mira eso, otro byte guardado. ¿Pero hay una manera aún mejor? Bueno, podemos usar el hecho de que [1,2,3,0] ≡ [1,2,3,4] mod 4
:
1o5 mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ%4
¡Otros dos bytes! Ahora vamos a alguna parte. Pero eso Ug0 +Ug1 +Ug2 +Ug3
está acaparando mucho espacio. ¿Qué pasa si reducimos la matriz con la suma?
1o5 mZ=>Ur(X,Y =>X+Y /2-UgZ%4
Wow, eso realmente ayudó! Ahora tenemos 29 bytes. Y gracias a @ ן nɟuɐɯɹɐ ן oɯ, incluso pude jugar golf a otro byte de la reducción. Pero si pudiéramos usar un incorporado para sumar la matriz, sería mucho más corto:
1o5 mZ=>Uu /2-UgZ%4
19 bytes! ¡Increíble! Desafortunadamente, Japt aún no tiene tales incorporaciones. Agregaré esto cuando tenga la oportunidad. ¡Las sugerencias son bienvenidas, ya sea para el programa o el idioma!
Bueno, a partir de la v1.4.4, he implementado muchas más funciones en Japt de lo que había planeado originalmente. Comenzando con el plan original para la versión más corta:
1o5 mZ=>Uu /2-UgZ%4
Primero necesitamos cambiar algunas cosas: las funciones se definen con {
, y la función de suma es x
. Esta versión funciona como está:
1o5 mZ{Ux /2-UgZ%4
Ahora, @
es una forma abreviada de XYZ{
, que nos permite guardar un byte cambiando de Z
a X
. Además, £
es un atajo para m@
guardar otro byte:
1o5 £Ux /2-UgX%4
Recientemente implementé una función U
en la que al principio del programa generalmente se puede omitir. Sin embargo, debido a un error de implementación, esto también funciona con funciones:
1o5 £x /2-UgX%4
Finalmente, la g
función ahora se ajusta si el índice ha pasado el final de la cadena, lo que nos permite eliminar el %4
total de 13 bytes :
1o5 £x /2-UgX
Y pensé que 19 era increíble ;-) ¡ Pruébelo en línea!