Problème de spirale numérique

24

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:

entrez la description de l'image ici

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:

  1. Tout langage de programmation est autorisé.
  2. Il s'agit d'un défi de , donc le code le plus court l'emporte.
  3. Bonne chance!

Source: https://cses.fi/problemset/task/1071

Agile_Eagle
la source
@WW Qu'est-ce que cela signifie?
Agile_Eagle
1
Il semble que vos entrées soient indexées à 1 (les coordonnées commencent à 1,1) (bien que cela doive être intuitif à partir des cas de test) pouvons-nous utiliser l'indexation à 0 (les coordonnées commencent à 0,0)?
Wheat Wizard
4
Quel en est le raisonnement?
Wheat Wizard du
7
Je pense qu'il est tout à fait correct que les coordonnées commencent à (1, 1), surtout si le programme est affiché de cette façon sur CSES, et que le PO n'a pas besoin de justifier cela. Je pense que les golfeurs ici s'habituent un peu trop à des libertés quelque peu arbitraires.
Lynn
2
@Lynn J'appuie cela
Agile_Eagle

Réponses:

19

C (gcc),  44  43 octets

f(x,y,z){z=x>y?x:y;z=z*z-~(z%2?y-x:x-y)-z;}

Essayez-le en ligne!

La spirale a plusieurs "bras":

12345
22345
33345
44445
55555

(x,y)n n 2 x y - n + 1 , - n + 2 , , - 1 , 0 , 1 , , n - 1 , n - 2max(x,y)znn2xyn+1,n+2,,1,0,1,,n1,n2nnn1n2

Merci à M. Xcoder d' avoir enregistré un octet.

Poignée de porte
la source
f(x,y,z){z=x>y?x:y;z=z*z-~(z%2?x-y:y-x)-z;}enregistre 1 octet.
M. Xcoder
@ Mr.Xcoder Neat trick, merci!
Poignée de porte
3
@RobertS. Oui, c'est ce que fait la fonction que j'ai définie (dans la section Code sur TIO). Par exemple, f(1, 1)renvoie la valeur 1. 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.
Poignée de porte
1
@Agile_Eagle La fonction retourne le nombre (elle n'a pas pu sortir la spirale - elle n'a même pas de boucles!).
Poignée de porte
7

Python,  54   50  49 octets

def f(a,b):M=max(a,b);return(a-b)*(-1)**M+M*M-M+1

-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.

Don mille
la source
2
Bienvenue chez PPCG! Dans ce cas, vous pouvez enregistrer 4 octets en utilisant l' def f(a,b):approche, voir ici .
Chas Brown
@ChasBrown Très intéressant, merci!
Don Thousand
@Shaggy Merci! J'ai posté quelques défis, mais je n'ai jamais été assez bon pour jouer au golf
Don Thousand
Dans ce cas, bienvenue au Golf! :) Je ne suis pas un gars Python mais je suis sûr que je M**2peux être remplacé par M*M.
Shaggy
@Shaggy Merci! Corrige maintenant
Don Thousand
7

MATL , 15 octets

X>ttq*QwoEqGd*+

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,nn(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-yv-X+y

X>        % Get the maximum of the input coordinates, say n
ttq*      % Duplicate that and multiply by n-1
Q         % Add 1 to that. This is the diagonal value v at layer n
wo        % Bring the original n on top and check if it's odd (1 or 0)
Eq        % Change 1 or 0 to 1 or -1
Gd        % Push input (x, y) again, get y - x
*         % Multiply by 1 or -1
          % For odd layers, no change. For even layers, y-x becomes x-y
+         % Add that to the diagonal value v
          % Implicit output

Solution alternative de 21 octets:

Pdt|Gs+ttqq*4/QJb^b*+

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

F=m(m-1)+1+(-1)m(X-y)

m=muneX(X,y)

Un calcul de base montrera qu'une expression pour un maximum de deux nombres est

m=muneX(X,y)=X+y+unebs(X-y)2

F

F=(X-y)jek+14((k-2)k)+1

k=unebs(X-y)+X+y

C'est la fonction que la solution implémente.

Sundar - Rétablir Monica
la source
5

Japt , 16 octets

Adapté de la solution de Doorknob sur quelques bières.

wV
nU²ÒNr"n-"gUv

Essayez-le


Explication

                  :Implicit input of integers U=x and V=y
wV                :Maximum of U & V
\n                :Reassign to U
 U²               :U squared
   Ò              :-~
      "n-"        :Literal string
           Uv     :Is U divisible by 2? Return 0 or 1
          g       :Get the character in the string at that index
    Nr            :Reduce the array of inputs by that, where n is inverse subtraction (XnY = Y-X)
n                 :Subtract U from the result of the above
Hirsute
la source
3

Pyth, 20 octets

A~Qh.MZQh-+*-GH^_1Q*

Suite de tests

Une traduction presque littérale de Rushabh Mehta réponse de .

Explication:
A~Qh.MZQh-+*-GH^_1Q*    | Full code
A~Qh.MZQh-+*-GH^_1Q*QQQ | Code with implicit variables filled
                        | Assign Q as the evaluated input (implicit)
A                       | Assign [G,H] as
 ~Q                     |  Q, then assign Q as
   h.MZQ                |   Q's maximal value.
                        | Print (implicit)
        h-+*-GH^_1Q*QQQ |  (G-H)*(-1)^Q+Q*Q-Q+1
hakr14
la source
2

Gelée , 13 12 octets

ṀḂḤ’×I+²_’ṀƲ

Essayez-le en ligne!

Calcule le terme diagonal avec ²_’Ṁet ajoute / soustrait à la valeur d'index correcte avec ṀḂḤ’×I.

dylnan
la source
2

05AB1E , 12 11 octets

ZÐ<*>ŠGR}¥+

-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:

Z              # Get the maximum of the (implicit) input-coordinate
               #  i.e. [4,5] → 5
 Ð             # Triplicate this maximum
  <            # Decrease it by 1
               #  i.e. 5 - 1 → 4
   *           # Multiply it
               #  i.e. 5 * 4 → 20
    >          # Increase it by 1
               #  i.e. 20 + 1 → 21
     Š         # Triple swap the top threes values on the stack (a,b,c to c,a,b)
               #  i.e. [4,5], 5, 21 → 21, [4,5], 5
      G }      # Loop n amount of times
       R       #  Reverse the input-coordinate each iteration
               #   i.e. 5 and [4,5] → [5,4]→[4,5]→[5,4]→[4,5] → [5,4]
         ¥     # Calculate the delta of the coordinate
               #  [5,4] → [1]
          +    # And add it to the earlier calculate value (output the result implicitly)
               #  21 + [1] → [22]
Kevin Cruijssen
la source
1
Èipourrait être G.
Emigna
@Emigna Oh intelligent, merci! : D
Kevin Cruijssen
0

Mathematica 34 octets

x = {5, 8};

alors:

m = Max[x];
Subtract @@ x (-1)^m + m^2 - m + 1

(*

54

*)

David G. Stork
la source
0

JavaScript (ES6), 46 octets

f=(r,c,x)=>r<c?f(c,r,1):r%2-!x?r*r-c+1:--r*r+c
James
la source