Zahlenspiralenproblem

24

Eine Zahlenspirale ist ein unendliches Gitter, dessen oberes linkes Quadrat die Nummer 1 hat. Hier sind die ersten fünf Schichten der Spirale:

Bildbeschreibung hier eingeben

Ihre Aufgabe ist es, die Nummer in Zeile y und Spalte x herauszufinden.


Beispiel:

Input: 2 3
Out  : 8
Input: 1 1
Out  : 1
Input: 4 2
Out  : 15

Hinweis:

  1. Jede Programmiersprache ist erlaubt.
  2. Dies ist eine Herausforderung, bei der der kürzeste Code gewinnt.
  3. Viel Glück!

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

Agile_Eagle
quelle
@WW Was heißt das?
Agile_Eagle
1
Es sieht so aus, als wären Ihre Eingaben 1-indiziert (Koordinaten beginnen bei 1,1) (obwohl dies aus den Testfällen hervorgeht). Können wir eine 0-Indizierung verwenden (Koordinaten beginnen bei 0,0)?
Weizen-Zauberer
4
Was ist die Begründung dafür?
Weizen-Zauberer
7
Ich denke, es ist absolut in Ordnung, wenn die Koordinaten bei (1, 1) beginnen, insbesondere wenn das Programm auf CSES so eingestellt ist und das OP dies nicht zu rechtfertigen braucht. Ich denke, die Golfer hier gewöhnen sich etwas zu sehr an etwas willkürliche Freiheiten.
Lynn
2
@Lynn Ich Sekunde, dass
Agile_Eagle

Antworten:

19

C (gcc),  44  43 Bytes

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

Probieren Sie es online!

Die Spirale hat mehrere "Arme":

12345
22345
33345
44445
55555

(x,y)n n 2 x y - n + 1 , - n + 2 , ... , - 1 , 0 , 1 , ... , n - 1 , n - 2 n n n - 1 n 2max(x,y)znn2xyn+1,-n+2,,-1,0,1,,n-1,n-2nnn-1n2

Vielen Dank an Herrn Xcoder für das Speichern eines Bytes.

Türknauf
quelle
f(x,y,z){z=x>y?x:y;z=z*z-~(z%2?x-y:y-x)-z;}Spart 1 Byte.
Mr. Xcoder
@ Mr.Xcoder Ordentlicher Trick, danke!
Türklinke
3
@RobertS. Ja, das ist die Funktion, die ich definiert habe (im Abschnitt Code von TIO). Gibt beispielsweise f(1, 1)den Wert zurück 1. Der Abschnitt Fußzeile durchläuft x = 1 bis 5 und y = 1 bis 5, ruft die Funktion für alle diese Werte auf und druckt die Ausgabe in einem Raster, um zu demonstrieren, dass die Funktion für alle in der Frage gezeigten Eingaben korrekt ist.
Türknauf
1
@Agile_Eagle Die Funktion gibt die Zahl zurück (die Spirale konnte nicht ausgegeben werden - es gibt nicht einmal Schleifen!).
Türklinke
7

Python,  54   50  49 Bytes

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

-4 Bytes dank @ChasBrown

-1 Bytes dank @Shaggy

Probieren Sie es online!

Zum ersten Mal Golf spielen! Mir ist mehr als bewusst, dass dies nicht optimal ist, aber was auch immer.

Läuft im Wesentlichen nach demselben Prinzip wie @Doorknob C-Code.

Don Tausend
quelle
2
Willkommen bei PPCG! In diesem Fall können Sie mit dem def f(a,b):Ansatz 4 Bytes einsparen , siehe hier .
Chas Brown
@ChasBrown Sehr interessant, danke!
Don Thousand
@ Shaggy Danke! Ich habe einige Herausforderungen gepostet, war aber noch nie gut genug zum Golfen
Don Thousand
Dann willkommen beim Golf! :) Ich bin kein Python-Typ, aber ich bin mir ziemlich sicher, dass M**2ich ihn ersetzen kann M*M.
Shaggy
@ Shaggy Danke! Wird jetzt
Don Thousand
7

MATL , 15 Bytes

X>ttq*QwoEqGd*+

Probieren Sie es online!
Sammle und drucke als Matrix

Wie?

Edit: Gleiche Technik wie @ Doorknobs Antwort, nur anders angekommen.

Der Unterschied zwischen den diagonalen Elementen der Spirale ist die arithmetische Folge . Die Summe von n Termen davon ist n ( n - 1 ) (durch die übliche AP-Formel). Diese um 1 erhöhte Summe ergibt das Diagonalelement an der Position ( n , n ) .0,2,4,6,8,nn(n-1)(n,n)

(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

Alternative 21-Byte-Lösung:

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

Probieren Sie es online!
Sammeln und Drucken als Matrix
Aus dem oben Gesagten wissen wir, dass die gewünschte Funktion ist

f=m(m-1)+1+(-1)m(x-y)

m=meinx(x,y)

Einige grundlegende Berechnungen zeigen, dass ein Ausdruck für maximal zwei Zahlen ist

m=meinx(x,y)=x+y+einbs(x-y)2

f

f=(x-y)ichk+14((k-2)k)+1

k=einbs(x-y)+x+y

Dies ist die Funktion, die die Lösung implementiert.

Sundar - Setzen Sie Monica wieder ein
quelle
5

Japt , 16 Bytes

Adaptiert von Doorknobs Lösung über ein paar Biere.

wV
nU²ÒNr"n-"gUv

Versuch es


Erläuterung

                  :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
Zottelig
quelle
3

Pyth, 20 Bytes

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

Testsuite

Eine fast wörtliche Übersetzung von Rushabh Mehtas Antwort .

Erläuterung:
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
quelle
2

Jelly , 13-12 Bytes

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

Probieren Sie es online!

Berechnet den diagonalen Term mit ²_’Ṁund addiert / subtrahiert mit zum korrekten Indexwert ṀḂḤ’×I.

dylnan
quelle
2

05AB1E , 12 11 Bytes

ZÐ<*>ŠGR}¥+

-1 Byte dank @Emigna Wechsel Èizu G.

Port of @sundars MATL-Antwort , also stelle sicher, dass du ihn positiv bewertest!

Probieren Sie es online aus oder überprüfen Sie alle Testfälle .

Erläuterung:

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
quelle
1
Èikönnte sein G.
Emigna
@Emigna Oh schlau, danke! : D
Kevin Cruijssen
0

Mathematica 34 Bytes

x = {5, 8};

so:

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

(*

54

*)

David G. Stork
quelle
0

JavaScript (ES6), 46 Byte

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