Bienvenue à mon premier défi de golf de code! :) Allons droit au but.
Défi:
Étant donné deux vecteurs à virgule flottante, O (origine) et T (cible), vous devez créer un programme pour imprimer les valeurs L et R sur STDOUT.
- O est un coin du carré
- T est un coin du carré situé en face de O
- L est le point 2D (coin) qui marque l'autre point du carré incomplet
- R est le point 2D (coin) opposé à L
Règles
- Les valeurs pour O et T doivent être lues à partir de STDIN (voir exemples d'entrées).
- Encore une fois, les valeurs de L et R doivent être imprimées dans STDOUT.
Score et bonus
- Comptez les octets de votre programme.
- Si votre programme trace des lignes qui se connectent entre O à L à T à R , soustrayez 15 octets du nombre d'octets.
Exemples
La première ligne couvre les entrées (les premiers crochets pour O et les crochets suivants pour T ) et l'autre ligne représente la sortie attendue.
- [0, 0] [3, 3] Attendu: [0, 3] [3, 0]
- [0, 0] [-2, -2] Attendu: [-2, 0] [0, -2]
- [1, -1] [4, 2] Attendu: [1, 2] [4, -1]
- [0, -1] [0, 1] Attendu: [-1, 0] [1, 0]
AVIS : les entrées et sorties peuvent être des virgules flottantes!
Une information important!
- Les valeurs O et T peuvent être prises dans n'importe quel format, tant qu'elles proviennent de STDIN (ex. Inside [] ou () ...), utilisez le format de votre choix.
- L et R peuvent être imprimés dans n'importe quel ordre.
- N'oubliez pas: lorsque (O-> L-> T-> R-> O) sont connectés, chaque côté doit avoir la même longueur!
Gagnant
- C'est le code-golf, donc le moins d'octets de réponses gagne!
- La réponse du gagnant sera acceptée le dimanche 15.11.2015 20: 00-22: 00 (heure de la Finlande) (Si je ne me trompe pas, cette date est écrite comme 11.15.2015 aux États-Unis, ne vous y trompez pas).
Bon golf!
Réponses:
Sérieusement , 11 octets
Un portage de ma réponse TI-BASIC. Calcule
mean(X)+i*(X-mean(X))
.Explication:
Entrée comme une liste de deux nombres complexes:
[1-1j,4+2j]
et la sortie dans le même format:[(4-1j), (1+2j)]
.la source
æ
pour la moyenne de la liste et a provoquéî
(multiplier par i) une vectorisation, permettant une solution non concurrente de 9 octets. Sérieusement commence à devenir une langue sérieusement bonne.Σ
2 octets?Σ
a le point de code 0xF4.Sérieusement , 25 octets
,i││-++½)+-+½)++-½)±+++½)
Prend la saisie sous forme de liste:
[x1,y1,x2,y2]
Même stratégie que ma réponse Python, mais sérieusement!
Explication:
Essayez-le en ligne
la source
TI-BASIC, 16 octets
Pour une calculatrice TI-83 + ou 84+.
Sauf si j'ai mal compris, OP a dit qu'ils acceptaient bien de prendre les entrées et les sorties comme des nombres complexes. Le
i
est ici l'unité imaginaire, pas la variable statistique.TI-BASIC a une
mean(
fonction, mais ennuyeusement, il ne fonctionne pas avec des listes complexes, jetant unERR:DATA TYPE
.Entrez dans le formulaire
{1-i,4+2i}
pour[[1,-1],[4,2]]
. La sortie est au format{4-i 1+2i}
pour[[1,2][4,-1]]
.la source
Matlab,
5145464542 octetsMaintenant, l'entrée est attendue dans un vecteur de colonne:
[x0;y0;x1;y1]
(sortie dans le même format) Je viens de la modifier pour qu'elle soit un programme complet.Ou bien
Ancienne solution:
L'entrée attend des vecteurs de colonne, par exemple
f([0;0],[3;3])
Il renvoie également deux vecteurs de colonne (sous forme de matrice 2x2).
la source
Japt,
2928 octetsJapt est une version raccourcie de Ja vaScri pt . Interprète
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
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.)
É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
:Maintenant quoi? Eh bien, le tableau ajoute simplement trois des entrées et soustrait la quatrième, en suivant le modèle
1,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: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 avec
a
: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
:Encore deux octets! Maintenant, nous allons quelque part. Mais ça
Ug0 +Ug1 +Ug2 +Ug3
accapare beaucoup d'espace. Et si nous réduisions le tableau avec addition?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:
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:
Nous devons d'abord changer quelques éléments: les fonctions sont définies avec
{
et la fonction somme estx
. Cette version fonctionne telle quelle:Maintenant,
@
est un raccourci pourXYZ{
, nous permettant d'économiser un octet en passant deZ
àX
. Est également£
un raccourci pourm@
enregistrer un autre octet: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: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 :Et je pensais que 19 était incroyable ;-) Testez-le en ligne!
la source
eval(U.join`+`)
.eval
équivalent, cela économise en fait un octet!Javascript (Node.js / ES6), 154 octets
Obtenir stdin est la partie la plus longue du code. L'entrée doit être les points séparés par une virgule:
la source
ngn APL, 21 octets
Cela prend l'entrée comme une paire de nombres complexes (par exemple,
1J¯1 4J2
) et imprime la sortie de la même manière (par exemple,4J¯1 1J2
). Essayez-le en ligne dans la démo ngn / apl .la source
1 ¯1
pour l'entrée0J¯1 0J1
, ce qui est la bonne réponse. Qu'obtenez-vous?Pyth, 12 octets
Cela prend l'entrée comme une paire de nombres complexes (par exemple,
1-1j, 4+2j
) et imprime la sortie comme un tableau (par exemple,[(4-1j), (1+2j)]
). Essayez-le en ligne.la source
𝔼𝕊𝕄𝕚𝕟, 29 caractères / 43 octets
Try it here (Firefox only).
la source
CJam, 30 octets
Essayez-le en ligne
Cela prend l'entrée comme une liste de listes, par exemple pour le dernier exemple:
Explication:
la source
Prolog, 118 octets
Un peu plus lisible:
Pour démarrer le programme:
Exemple d'entrée lorsque les coins connus sont [1, -1] [4, 2]:
[1, -1,4,2]
Exemple de sortie, où X et Y contiendront les coins inconnus:
X = [1.0, 2.0],
Y = [4.0, -1.0]
Essayez-le en ligne ici
Modifier: Changé pour lire l'entrée de STDIN
la source
Python 3, 102 octets
L'entrée est prise sous la forme
x1 y1 x2 y2
, sur une seule ligne.Essayez-le en ligne
la source
Python 2, 56 octets
L'entrée peut être
x1,y1,x2,y2
ou(x1,y1,x2,y2)
la source