Numeryczny problem spirali

24

Spirala liczbowa jest nieskończoną siatką, której lewy górny kwadrat ma liczbę 1. Oto pięć pierwszych warstw spirali:

wprowadź opis zdjęcia tutaj

Twoim zadaniem jest znalezienie liczby w wierszu yi kolumnie x.


Przykład:

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

Uwaga:

  1. Dowolny język programowania jest dozwolony.
  2. Jest to wyzwanie dla więc wygrywa najkrótszy kod.
  3. Powodzenia!

Źródło: https://cses.fi/problemset/task/1071

Agile_Eagle
źródło
@WW Co to znaczy?
Agile_Eagle,
1
Wygląda na to, że twoje dane wejściowe są indeksowane 1 (współrzędne zaczynają się od 1,1) (chociaż musi to być intuicyjne z przypadków testowych) czy możemy użyć indeksowania 0 (współrzędne zaczynają się od 0,0)?
Wheat Wizard
4
Jakie jest tego uzasadnienie?
Wheat Wizard
7
Myślę, że rozpoczęcie współrzędnych od (1, 1) jest absolutnie w porządku, szczególnie jeśli program jest opublikowany w ten sposób na CSES, a OP nie musi tego uzasadniać. Myślę, że tutaj golfiści przyzwyczajają się nieco do dowolnych swobód.
Lynn,
2
@ Lynn Po drugie,
Agile_Eagle,

Odpowiedzi:

19

C (gcc),  44  43 bajty

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

Wypróbuj online!

Spirala ma kilka „ramion”:

12345
22345
33345
44445
55555

Pozycja znajduje się na ramieniu max ( x , y ) (przypisana do zmiennej ). Zatem największa liczba na ramieniu to , co na przemian znajduje się w lewym dolnym rogu i prawym górnym ramieniu. Odejmowanie od daje sekwencję poruszające się wzdłuż ramienia , więc wybieramy odpowiedni znak na podstawie parzystość , dostosuj przez aby uzyskać sekwencję zaczynającą się od 0, i odejmij tę wartość od(x,y)max(x,y)zn 2nn2xyn+1,n+2,,1,0,1,,n1,n2nnn1n2.

Podziękowania dla pana Xcodera za uratowanie bajtu.

Klamka
źródło
f(x,y,z){z=x>y?x:y;z=z*z-~(z%2?x-y:y-x)-z;}oszczędza 1 bajt.
Pan Xcoder,
@ Mr.Xcoder Świetna sztuczka, dzięki!
Klamka
3
@RobertS. Tak, właśnie taką funkcję zdefiniowałem (w sekcji Kod na TIO). Na przykład f(1, 1)zwraca wartość 1. Sekcja Stopka zapętla się przez x = 1 do 5 i y = 1 do 5, wywołuje funkcję dla wszystkich takich wartości i wypisuje dane wyjściowe w siatce, aby wykazać, że funkcja jest poprawna dla wszystkich danych wejściowych przedstawionych w pytaniu.
Klamka
1
@Agile_Eagle Funkcja zwraca liczbę (nie mogła wypisać spirali - nie ma nawet żadnych pętli!).
Klamka
7

Python,  54   50  49 bajtów

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

-4 bajty dzięki @ChasBrown

-1 bajty dzięki @Shaggy

Wypróbuj online!

Pierwszy raz w golfa! Jestem bardziej niż świadomy, że nie jest to optymalne, ale cokolwiek.

Zasadniczo działa na tej samej zasadzie co kod @Doorknob C.

Don Thousand
źródło
2
Witamy w PPCG! W takim przypadku możesz zapisać 4 bajty przy użyciu tej def f(a,b):metody, patrz tutaj .
Chas Brown,
@ChasBrown Bardzo ciekawe, dziękuję!
Don Thousand
@Shaggy Dziękujemy! Postawiłem kilka wyzwań, ale nigdy nie byłem wystarczająco dobry do gry w golfa
Don Thousand
W takim razie zapraszamy do gry w golfa! :) Nie jestem facetem Pythona, ale jestem pewien, że M**2można go zastąpić M*M.
Kudłaty
@Shaggy Dziękujemy! Naprawię teraz
Don Thousand
7

MATL , 15 bajtów

X>ttq*QwoEqGd*+

Wypróbuj online!
Zbierz i wydrukuj jako matrycę

W jaki sposób?

Edycja: Ta sama technika, co odpowiedź @ Doorknob, po prostu przyszła inaczej.

Różnica między diagonalnymi elementami spirali to ciąg arytmetyczny . Suma n wyrażeń tego wynosi n ( n - 1 ) (zgodnie ze zwykłą formułą AP). Ta suma, zwiększona o 1, daje element diagonalny w pozycji ( 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

Alternatywne 21 bajtowe rozwiązanie:

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

Wypróbuj online!
Zbieraj i drukuj jako matrycę
Z powyższego wiemy, że potrzebujemy funkcji

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

m=mzax(x,y)

Niektóre podstawowe obliczenia pokażą, że jest jedno wyrażenie dla maksymalnie dwóch liczb

m=mzax(x,y)=x+y+zabs(x-y)2)

fa

fa=(x-y)jak+14((k-2))k)+1

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

Jest to funkcja implementowana przez rozwiązanie.

sundar - Przywróć Monikę
źródło
5

Japt , 16 bajtów

Zaadaptowano z rozwiązania Doorknob na kilka piw.

wV
nU²ÒNr"n-"gUv

Spróbuj


Wyjaśnienie

                  :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
Kudłaty
źródło
3

Pyth, 20 bajtów

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

Zestaw testowy

Przekład niemal dosłownym Rushabh Mehta odpowiedź „s .

Wyjaśnienie:
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
źródło
2

Galaretka , 13 12 bajtów

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

Wypróbuj online!

Oblicza wartość przekątnej za pomocą ²_’Ṁi dodaje / odejmuje do poprawnej wartości indeksu za pomocą ṀḂḤ’×I.

dylnan
źródło
2

Brain-Flak , 76 bajtów

((({}<>))<>[(({}))]<{({}[()])<>}>)<>{}((){({}[()])({})<><([{}])><>}{}<>{}<>)

Wypróbuj online!

Nitrodon
źródło
2

05AB1E , 12 11 bajtów

ZÐ<*>ŠGR}¥+

-1 bajt dzięki zmianie @EmignaÈi na G.

Port odpowiedzi MATL @sundar , więc upewnij się, że go głosujesz!

Wypróbuj online lub sprawdź wszystkie przypadki testowe .

Wyjaśnienie:

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
źródło
1
Èimoże być G.
Emigna,
@Emigna Oh smart, dzięki! : D
Kevin Cruijssen,
0

Pascal (FPC) , 90 bajtów

uses math;var x,y,z:word;begin read(x,y);z:=max(x,y);write(z*z-z+1+(1and z*2-1)*(y-x))end.

Wypróbuj online!

Odpowiedź Portu Doorknob , ale odpowiedź Sundara dała mi pomysł, na z mod 2*2-1który przekształciłem się, 1and z*2-1by usunąć przestrzeń.

AlexRacer
źródło
0

Matematyka 34 bajty

x = {5, 8};

więc:

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

(*

54

*)

David G. Stork
źródło
0

JavaScript (ES6), 46 bajtów

f=(r,c,x)=>r<c?f(c,r,1):r%2-!x?r*r-c+1:--r*r+c
James
źródło