Japt, 29 28 byte
Japt è una versione abbreviata di Ja vaScri pt . Interprete
1o5 mZ=>$eval$(Uq'+)/2-UgZ%4
Si noti che le funzioni freccia richiedono un browser conforme a ES6, come le versioni più recenti di Firefox. L'ingresso entra in un array di 4 elementi, ad es [1,-1,4,2].
Come funziona
// 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
Come è stato giocato a golf
Per prima cosa ho provato semplicemente a copiare l'approccio Python di @ Mego. Questo mi ha lasciato con questo mostro a 48 byte:
(Nota: l'ingresso non dovrebbe essere attualmente racchiuso in un array.)
[U-V+W+X /2,(U+V-W+X /2,(U+V+W-X /2,(V+W+X-U /2]
Poiché ciascuno di questi elementi deve essere diviso per 2, è più breve mappare l'intero array con mY=>Y/2:
[U-V+W+X,U+V-W+X,U+V+W-X,V+W+X-U]mY=>Y/2
E adesso? Bene, l'array ora sta semplicemente aggiungendo tre degli input e sottraendo il quarto, seguendo il modello 1,2,3,0. Quindi, potremmo raggruppare gli input in un array, quindi sommarli, dividerli per 2 e sottrarre l'elemento necessario:
[1,2,3,0]mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ
Bello, risparmiato un byte! Ma è possibile ridurre l'array all'inizio? Proviamo a impacchettarlo in una stringa, quindi a dividerlo in un array con a:
"1230"a mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ
Guarda quello, un altro byte salvato. Ma c'è un modo ancora migliore? Bene, possiamo usare il fatto che [1,2,3,0] ≡ [1,2,3,4] mod 4:
1o5 mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ%4
Altri due byte! Ora andiamo da qualche parte. Ma questo Ug0 +Ug1 +Ug2 +Ug3sta occupando molto spazio. E se riducessimo l'array con l'aggiunta?
1o5 mZ=>Ur(X,Y =>X+Y /2-UgZ%4
Caspita, mi ha davvero aiutato! Ora siamo scesi a 29 byte. E grazie a @ ן nɟuɐɯɹɐ ן oɯ, sono stato anche in grado di golf un altro byte dalla riduzione. Ma se potessimo usare un built-in per sommare l'array, sarebbe molto più breve:
1o5 mZ=>Uu /2-UgZ%4
19 byte! Sorprendente! Sfortunatamente, Japt non ha ancora questi built-in. Lo aggiungerò quando ne avrò la possibilità. Suggerimenti sono ben accetti, sia per il programma che per la lingua!
Bene, a partire dalla v1.4.4, ho implementato in Japt alcune funzionalità in più rispetto a quanto inizialmente previsto. A partire dal piano originale per la versione più corta:
1o5 mZ=>Uu /2-UgZ%4
Per prima cosa dobbiamo cambiare alcune cose: le funzioni sono definite con {, e la funzione somma è x. Questa versione funziona così com'è:
1o5 mZ{Ux /2-UgZ%4
Ora, @è una scorciatoia per XYZ{, che ci consente di salvare un byte passando da Za X. Inoltre, £è una scorciatoia per il m@salvataggio di un altro byte:
1o5 £Ux /2-UgX%4
Di recente ho implementato una funzionalità in cui Ua all'inizio del programma di solito può essere esclusa. A causa di un errore di implementazione, tuttavia, funziona anche con le funzioni:
1o5 £x /2-UgX%4
Infine, la gfunzione ora termina se l'indice è oltre la fine della stringa, permettendoci di rimuovere il %4per un totale di 13 byte :
1o5 £x /2-UgX
E ho pensato che 19 fosse incredibile ;-) Provalo online!