Проблема числовой спирали


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
@ Линн, я второй
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

Позиция расположена на рычаге (назначена переменной ). Тогда наибольшее число на плече равно , которое чередуется между левым нижним и правым верхним положением на плече. Вычитание из дает последовательность движущихся вдоль плеча , поэтому мы выбираем соответствующий знак на основе четность , отрегулируйте на чтобы получить последовательность, начинающуюся с 0, и вычтите это значение из .(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. Нижний колонтитул секция петли через й = 1 до 5 и у = 1 до 5, вызывает функцию для всех таких значений, и выводит его выход в виде сетки, чтобы продемонстрировать , что функция является правильной для всех входов , показанных на вопросе.
Дверная ручка

1
@Agile_Eagle Функция возвращает число (она не может вывести спираль - у нее даже нет петель!).
дверная ручка

7

Python,  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):подход, см. Здесь .
Час Браун

@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 байт

Адаптировано из решения Doorknob на несколько сортов пива.

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

Желе , 13 12 байт

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

Попробуйте онлайн!

Вычисляет диагональный член с помощью ²_’Ṁи добавляет / вычитает к правильному значению индекса с помощью ṀḂḤ’×I.



2

05AB1E , 12 11 байт

ZÐ<*>ŠGR}¥+

-1 байт благодаря @Emigna, изменяющему Èiна G.

Порт @Sundar 's MATL ответа , так что обязательно проголосуйте за него!

Попробуйте онлайн или проверьте все контрольные примеры .

Объяснение:

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

@ Emigna О, умный, спасибо! : D
Кевин Круйссен





Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.