Задача про число спіралі


24

Спіраль чисел - нескінченна сітка, у верхньому лівому квадраті якої є число 1. Ось перші п’ять шарів спіралі:

введіть тут опис зображення

Ваше завдання - знайти число у рядку y та стовпчику x.


Приклад:

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

Примітка:

  1. Будь-яка мова програмування дозволена.
  2. Це проблема з тому найкоротший виграш коду.
  3. Удачі!

Джерело: https://cses.fi/problemset/task/1071


@WW Що це означає?
Agile_Eagle

1
Схоже, ваші входи індексуються 1 (координати починаються з 1,1) (хоча це має бути зрозуміло з тестових випадків) чи можемо ми використовувати 0 індексації (координати починаються з 0,0)?
Пшеничний майстер

4
Які міркування для цього?
Пшеничний майстер

7
Я думаю, що цілком нормально, щоб координати починалися з (1, 1), особливо якщо програма розміщена таким чином на CSES, і ОП не потребує цього виправдовувати. Я думаю, що гольфісти тут занадто звикають до дещо довільних свобод.
Лінн

2
@Lynn Я другий, що
Agile_Eagle

Відповіді:


19

C (gcc),  44  43 байт

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

Спробуйте в Інтернеті!

У спіралі є кілька «ручок»:

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,,n1,n2nnn1n2

Дякую містеру Xcoder за збереження байта.


f(x,y,z){z=x>y?x:y;z=z*z-~(z%2?x-y:y-x)-z;}економить 1 байт.
Містер Xcoder

@ Mr.Xcoder Акуратний трюк, спасибі!
Дверна ручка


3
@RobertS. Так, саме це робить функція, яку я визначив (у розділі Код на TIO). Наприклад, f(1, 1)повертає значення 1. Розділ Footer проходить через x = 1 - 5 та y = 1 - 5, викликає функцію для всіх таких значень та друкує її вихід у сітці, щоб продемонструвати, що функція є правильною для всіх входів, показаних у питанні.
Doorknob

1
@Agile_Eagle Функція повертає число (вона не могла вивести спіраль - у неї навіть немає циклів!).
Дверна ручка

7

Пітон,  54   50  49 байт

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

-4 байти завдяки @ChasBrown

-1 байт завдяки @Shaggy

Спробуйте в Інтернеті!

Перший раз гольф! Я більше ніж усвідомлюю, що це не оптимально, але все одно.

По суті працює за тим же принципом, що і код @Doorknob C.


2
Ласкаво просимо до PPCG! У цьому випадку ви можете зберегти 4 байти за допомогою def f(a,b):підходу, дивіться тут .
Chas Brown

@ChasBrown Дуже цікаво, дякую!
Дон Тисяча

@Shaggy Дякую! Я поставив кілька викликів, але ніколи не був достатньо хорошим для гри в гольф
Дон Тисяча

Тоді в такому випадку ласкаво просимо до Гольфу! :) Я не хлопець Python, але я впевнений, що M**2його можна замінити M*M.
Кудлатий

@Shaggy Дякую! Виправить зараз
Дон Тисяча

7

MATL , 15 байт

X>ttq*QwoEqGd*+

Спробуйте в Інтернеті!
Збирайте та друкуйте як матрицю

Як?

Редагувати: та сама техніка, що і у відповіді @ Doorknob.

Різниця між діагональними елементами спіралі - це арифметична послідовність . Сума доданків цього дорівнює (за звичайною формулою AP). Ця сума, збільшена на 1, дає діагональний елемент у положенні .n n ( n - 1 ) ( n , n )0,2,4,6,8,nn(n1)(n,n)

Враховуючи , ми знаходимо максимум цих двох, який є «шаром» спіралі, до якого належить ця точка. Тоді ми знаходимо діагональне значення цього шару як . Для парних шарів значенням є , для непарних шарів .v = n ( n - 1 ) + 1 ( x , y ) v + x - y v - x + y(x,y)v=n(n1)+1(x,y)v+xyvx+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

Черговий 21-байтний розчин:

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

Спробуйте в Інтернеті!
Збирати та друкувати як матрицю
Із вищесказаного ми знаємо, що потрібна функція

f=m(m1)+1+(1)m(xy)

де .m=max(x,y)

Деякі основні розрахунки покажуть, що один вираз для максимум двох чисел є

m=max(x,y)=x+y+abs(xy)2

Підключивши одну до іншої, ми виявимо, що одна альтернативна форма для - це:f

f=(xy)ik+14((k2)k)+1

де .k=abs(xy)+x+y

Це функція, яку реалізує рішення.


5

Japt , 16 байт

Адаптований з розчину Дорноба за кілька сортів пива.

wV
nU²ÒNr"n-"gUv

Спробуй це


Пояснення

                  :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

3

Pyth, 20 байт

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

Тестовий набір

Майже дослівний переклад Rushabh Мехта відповіді «s .

Пояснення:
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




2

05AB1E , 12 11 байт

ZÐ<*>ŠGR}¥+

-1 байт, завдяки @Emigna змінився Èiна G.

MATL відповідь порту @sundar , тому не забудьте підтримати його!

Спробуйте в Інтернеті або перевірте всі тестові випадки .

Пояснення:

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]

1
Èiмогло бути G.
Емінья

@Emigna О, розумний, дякую! : D
Кевін Круїссен





Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.