Четыре спиральные оси

9

Возьмите числа 0, 1, 2, 3, 4, ...и расположите их по часовой стрелке, начиная вниз, записывая каждую цифру в отдельный квадрат.

Затем, учитывая один из четырех различных и согласованных символов ASCII (по вашему выбору), представляющих ось, и входное целое число n, выведите первые nчлены последовательности, описанной путем выбора квадратов вдоль соответствующей оси.

Например, ниже расположена расположенная спираль до середины 29. Предположим, мы используем u / d / l / rдля наших четырех символов, представляющих up / down / left / right. Затем, в uкачестве входных данных, мы выводим 0, 5, 1, 4 ...(положительная ось Y) до nth-го члена. Если бы мы вместо этого были заданы в lкачестве входных данных, то это было бы 0, 3, 1, 1 ...до nth срок.

  2---3---2---4---2---5---2
  |                       |
  2   1---3---1---4---1   6
  |   |               |   |
  2   2   4---5---6   5   2
  |   |   |       |   |   |
  1   1   3   0   7   1   7
  |   |   |   |   |   |   |
  2   1   2---1   8   6   2
  |   |           |   |   |
  0   1---0---1---9   1   8
  |                   |   |
  2---9---1---8---1---7   2

Это последовательности в OEIS:

Примеры

d 19
[0, 1, 1, 8, 3, 7, 6, 2, 1, 5, 1, 1, 6, 2, 2, 1, 3, 4, 0]

r 72
[0, 7, 1, 7, 4, 2, 8, 1, 1, 3, 1, 2, 0, 2, 3, 1, 3, 4, 6, 5, 5, 5, 7, 7, 8, 8, 9, 6, 8, 1, 1, 1, 2, 3, 1, 8, 0, 6, 1, 7, 0, 9, 2, 8, 4, 3, 2, 1, 1, 7, 2, 6, 2, 1, 3, 3, 5, 5, 3, 2, 2, 0, 4, 3, 2, 5, 4, 6, 5, 0, 5, 1]

u 1
[0]

правила

  • Если применимо, вы можете предположить, что ввод / вывод будет соответствовать типу Integer вашего языка.
  • Если вы используете целые числа для представления четырех осей, вы можете использовать отрицательные целые числа, не нарушая правил.
  • Вход и выход могут быть заданы любым удобным способом .
  • Допустимы либо полная программа, либо функция. Если функция, вы можете вернуть вывод, а не распечатать его.
  • Стандартные лазейки запрещены.
  • Это поэтому применяются все обычные правила игры в гольф, и выигрывает самый короткий код (в байтах).
AdmBorkBork
источник
Можем ли мы взять отрицательные целые числа для пары направлений?
mbomb007
@ mbomb007 Конечно, все будет в порядке.
AdmBorkBork
Не кажется очень практичным, но можем ли мы вернуть целое число, содержащее требуемые цифры, кроме начального нуля (который в любом случае будет подразумеваться)?
Эрик Outgolfer
@ AdmBorkBork В принципе, я не имею в виду такое решение, просто подумал спросить. :)
Эрик Outgolfer
Задача оценивается по результатам. Так что, если ноль не включен, я думаю, что это будет неправильно, потому что вы посчитаете это неправильным, если ноль исключен для вывода строки. Python может выводить целые числа с ведущими нулями, так почему бы не другие языки.
mbomb007

Ответы:

5

Python 2 , 94 89 84 83 74 72 70 байт

Я использовал WolframAlpha и определил, что верхней границы 5 n > 4n 2 + 3n кажется достаточно. Это может быть изменено на 9 н бесплатно. Для более крупных входов используйте 9*n*nвместо того, 5**nчтобы избежать нехватки памяти.

lambda d,n:["".join(map(str,range(5**n)))[x*(4*x+d)]for x in range(n)]

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

Входные данные для направлений:

  • 3: правильно
  • -3: вниз
  • -1: слева
  • 1: вверх

Сохранено 14 байтов благодаря Роду.
Сохранено 2 байта благодаря Джонатану Аллану.

mbomb007
источник
1

Желе ,  19  18 байт

Использует 5 n трюк из ответа Python от mbomb007

4,0jḅɗ@€ị5*D€FʋṖ0;

Двоичная ссылка, взятая nслева dи целое число из:[-3,-1,1,3]:[v,<,^,>]

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

20-байтная альтернатива, которая намного быстрее и не имеет сегрегации для такого маленького n:

²×5D€ƲFị@4,0jḅɗ@€Ṗ0;

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

Как?

4,0jḅɗ@€ị5*D€FʋṖ0; - Link: integer, n; integer, d
     ɗ@€           - last three links as a dyad with sw@pped arguments for €ach (of implicit range [1,n])
4,0                -   literal list [4,0]
   j               -   join with d = [4,d,0]
    ḅ              -   convert from base n = 4*n^2+d*n+0
        ị          - index into...
              ʋ    - last four links as a monad:
         5         -   five
          *        -   exponentiate = 5^n
           D€      -   decimal list of each (in implicit range [1,5^n])
            F      -   flatten into a single list of the digits
               Ṗ   - pop (drop the final element)
                0; - prepend a zero
Джонатан Аллан
источник
1

Значительно будет работать (вроде +1000)

JavaScript (Node.js) , 104 байта

f=(d,n)=>--n?[...f(d,n),C(n*(4*n+d))]:[0]
C=(n,N=i=0)=>n>N?C(n-N,(p=10**i)*9*++i):+((p+--n/i|0)+"")[n%i]

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

объяснение

  • 3: правильно
  • -3: вниз (-3 является законным согласно комментариям)
  • -1: слева
  • 1: вверх (например, @ mbomb007)

Четвёртая цифра константы Шамперноуна

________________________________________________________

Менее эффективный метод (не будет работать на 1000+)

JavaScript (Node.js) , 81 байт

f=(d,n)=>eval(`for(r=[],s=i=I="";I<n;)(s+=i++)[u=I*(4*I+d)]&&r.push(s[I++,u]),r`)

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

DanielIndie
источник
0

Stax , 13 байт

â╞ê←τ"(]]⌐┘?N

Запустите и отладьте его

Он принимает входные данные с указанием направления, а затем счет. Вправо, вверх, влево и вниз являются 1, 3, 5, и 7соответственно. Выполнение трех предоставленных тестовых примеров занимает целую минуту.

рекурсивный
источник