Une spirale numérique est une grille infinie dont le carré supérieur gauche a le chiffre 1. Voici les cinq premières couches de la spirale:
Votre tâche consiste à trouver le nombre dans la ligne y et la colonne x.
Exemple:
Input: 2 3
Out : 8
Input: 1 1
Out : 1
Input: 4 2
Out : 15
Remarque:
- Tout langage de programmation est autorisé.
- Il s'agit d'un défi de code-golf , donc le code le plus court l'emporte.
- Bonne chance!
Réponses:
C (gcc),
4443 octetsEssayez-le en ligne!
La spirale a plusieurs "bras":
z
Merci à M. Xcoder d' avoir enregistré un octet.
la source
f(x,y,z){z=x>y?x:y;z=z*z-~(z%2?x-y:y-x)-z;}
enregistre 1 octet.f(1, 1)
renvoie la valeur1
. La section Pied de page parcourt x = 1 à 5 et y = 1 à 5, appelle la fonction pour toutes ces valeurs et imprime sa sortie dans une grille, pour démontrer que la fonction est correcte pour toutes les entrées indiquées dans la question.Python,
545049 octets-4 octets grâce à @ChasBrown
-1 octets grâce à @Shaggy
Essayez-le en ligne!
Golf pour la première fois! Je suis plus que conscient que ce n'est pas optimal, mais peu importe.
Fonctionne essentiellement sur le même principe que le code @Doorknob C.
la source
def f(a,b):
approche, voir ici .M**2
peux être remplacé parM*M
.MATL , 15 octets
Essayez-le en ligne!
Recueillir et imprimer sous forme de matrice
Comment?
Edit: Même technique que la réponse de @ Doorknob, vient d'arriver différemment.
La différence entre les éléments diagonaux de la spirale est la séquence arithmétique . La somme de n termes de ceci est n ( n - 1 ) (par la formule AP habituelle). Cette somme, incrémentée de 1, donne l'élément diagonal en position ( n , n ) .0 , 2 , 4 , 6 , 8 , … n n ( n - 1 ) ( n , n )
Étant donné , nous trouvons le maximum de ces deux, qui est la "couche" de la spirale à laquelle ce point appartient. Ensuite, nous trouvons la valeur diagonale de cette couche comme v = n ( n - 1 ) + 1 . Pour les couches paires, la valeur en ( x , y ) est alors v + x - y , pour les couches impaires v - x + y .( x , y) v = n ( n - 1 ) + 1 ( x , y) v + x - y v - x + y
Solution alternative de 21 octets:
Essayez-le en ligne!
Recueillir et imprimer sous forme de matrice
D'après ce qui précède, nous savons que la fonction que nous voulons est
Un calcul de base montrera qu'une expression pour un maximum de deux nombres est
C'est la fonction que la solution implémente.
la source
Japt , 16 octets
Adapté de la solution de Doorknob sur quelques bières.
Essayez-le
Explication
la source
Pyth, 20 octets
Suite de tests
Une traduction presque littérale de Rushabh Mehta réponse de .
Explication:la source
Gelée , 13 octets
Essayez-le en ligne!
Utilise la méthode de la poignée de porte . Bien trop long.
la source
»Ḃ-*×_‘+»²_»ʋ
Gelée ,
1312 octetsEssayez-le en ligne!
Calcule le terme diagonal avec
²_’Ṁ
et ajoute / soustrait à la valeur d'index correcte avecṀḂḤ’×I
.la source
Brain-Flak , 76 octets
Essayez-le en ligne!
la source
05AB1E ,
1211 octets-1 octets grâce à @Emigna changement
Èi
àG
.Port de la réponse MATL de @sundar , alors assurez-vous de lui donner un vote positif!
Essayez-le en ligne ou vérifiez tous les cas de test .
Explication:
la source
Èi
pourrait êtreG
.Pascal (FPC) , 90 octets
Essayez-le en ligne!
Réponse de Port of Doorknob , mais la réponse de Sundar m'a donné une idée pour
z mod 2*2-1
laquelle je me suis transformé en1and z*2-1
pour supprimer de l'espace.la source
Mathematica 34 octets
alors:
(*
54
*)
la source
Julia 1.0 , 35 octets
Essayez-le en ligne!
la source
JavaScript (ES6), 46 octets
la source
Java (JDK 10) , 39 octets
Essayez-le en ligne!
Crédits
la source