Japt, 29 28 octets
Japt est une version raccourcie de Ja vaScri pt . Interprète
1o5 mZ=>$eval$(Uq'+)/2-UgZ%4
Notez que les fonctions fléchées nécessitent un navigateur compatible ES6, comme les nouvelles versions de Firefox. L'entrée entre dans un tableau de 4 éléments, par exemple [1,-1,4,2]
.
Comment ça fonctionne
// 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
Comment il a été joué au golf
J'ai d'abord essayé de copier simplement l'approche Python de @ Mego. Cela m'a laissé avec ce monstre de 48 octets:
(Remarque: l'entrée ne doit pas actuellement être enveloppée dans un tableau.)
[U-V+W+X /2,(U+V-W+X /2,(U+V+W-X /2,(V+W+X-U /2]
Étant donné que chacun de ces éléments doit être divisé par 2, il est plus court de mapper l'ensemble du tableau avec mY=>Y/2
:
[U-V+W+X,U+V-W+X,U+V+W-X,V+W+X-U]mY=>Y/2
Maintenant quoi? Eh bien, le tableau ajoute simplement trois des entrées et soustrait la quatrième, en suivant le modèle1,2,3,0
. Ainsi, nous pourrions regrouper les entrées dans un tableau, puis les additionner, diviser par 2 et soustraire l'élément nécessaire:
[1,2,3,0]mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ
Nice, sauvé un octet! Mais est-il possible de réduire le tableau au début? Essayons de le compresser dans une chaîne, puis de le diviser en un tableau aveca
:
"1230"a mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ
Regardez ça, un autre octet enregistré. Mais existe-t-il un meilleur moyen? Eh bien, nous pouvons utiliser le fait que[1,2,3,0] ≡ [1,2,3,4] mod 4
:
1o5 mZ=>(Ug0 +Ug1 +Ug2 +Ug3)/2-UgZ%4
Encore deux octets! Maintenant, nous allons quelque part. Mais çaUg0 +Ug1 +Ug2 +Ug3
accapare beaucoup d'espace. Et si nous réduisions le tableau avec addition?
1o5 mZ=>Ur(X,Y =>X+Y /2-UgZ%4
Wow, ça a vraiment aidé! Nous en sommes maintenant à 29 octets. Et grâce à @ ן nɟuɐɯɹɐ ן oɯ, j'ai même pu jouer un autre octet sur la réduction. Mais si nous pouvions utiliser un intégré pour additionner le tableau, ce serait beaucoup plus court:
1o5 mZ=>Uu /2-UgZ%4
19 octets! Incroyable! Malheureusement, Japt ne dispose pas encore de tels modules intégrés. J'ajouterai cela quand j'aurai une chance. Les suggestions sont les bienvenues, pour le programme ou la langue!
Eh bien, depuis la version 1.4.4, j'ai implémenté dans Japt un peu plus de fonctionnalités que je ne l'avais prévu à l'origine. En commençant par le plan d'origine pour la version plus courte:
1o5 mZ=>Uu /2-UgZ%4
Nous devons d'abord changer quelques éléments: les fonctions sont définies avec {
et la fonction somme estx
. Cette version fonctionne telle quelle:
1o5 mZ{Ux /2-UgZ%4
Maintenant, @
est un raccourci pour XYZ{
, nous permettant d'économiser un octet en passant de Z
à X
. Est également £
un raccourci pourm@
enregistrer un autre octet:
1o5 £Ux /2-UgX%4
Récemment, j'ai implémenté une fonctionnalité où un U
au début du programme peut généralement être omis. Cependant, en raison d'une erreur d'implémentation, cela fonctionne également avec les fonctions:
1o5 £x /2-UgX%4
Enfin, la g
fonction encapsule maintenant si l'index dépasse la fin de la chaîne, ce qui nous permet de supprimer le %4
pour un total de 13 octets :
1o5 £x /2-UgX
Et je pensais que 19 était incroyable ;-) Testez-le en ligne!