Чотири спіралі


9

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

Потім, задавши один з чотирьох чітких і послідовних символів ASCII (на ваш вибір), що представляють вісь, і вхідне ціле число n, виведіть перші nчлени послідовності, описані, вибравши квадрати уздовж відповідної осі.

Наприклад, внизу розташована спіраль до прорізу наскрізь 29. Припустимо, ми використовуємо u / d / l / rдля наших чотирьох символів, що представляють up / down / left / right. Тоді, даючи uяк вхід, ми виводимо 0, 5, 1, 4 ...(позитивну вісь y) до першого числа n. Якби нас замість цього дали lяк вхідні дані, то це було б 0, 3, 1, 1 ...до цього nтерміну.

  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.
  • Якщо ви використовуєте цілі числа для представлення чотирьох осей, ви можете використовувати негативні цілі числа, не порушуючи правила.
  • Введення та вихід можуть бути надані будь-яким зручним способом .
  • Прийнятна або повна програма, або функція. Якщо функція, ви можете повернути вихід, а не надрукувати його.
  • Стандартні лазівки заборонені.
  • Це є тому застосовуються всі звичайні правила гольфу, і найкоротший код (у байтах) виграє.

Чи можемо ми взяти від’ємні цілі числа за пару напрямків?
mbomb007

@ mbomb007 Звичайно, це було б добре.
AdmBorkBork

Це не здається дуже практичним, але чи можемо ми повернути ціле число, яке має необхідні цифри, окрім провідного нуля (який би мався на увазі)?
Ерік Аутгольфер

@AdmBorkBork В основному я не маю на увазі такого рішення, просто подумав запитати. :)
Ерік Аутгольфер

Про виклик судять за результатами. Тож якщо нуль не включений, я думаю, що це було б неправильно, тому що ви вважаєте його неправильним, якщо нуль виключається для виведення рядка. Python може виводити цілі числа з провідними нулями, так чому б не інші мови.
mbomb007

Відповіді:


5

Пітон 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 байти завдяки Джонатану Аллану



1

Желе ,  19  18 байт

Використовує 5 n хитрість з відповіді Pybom на 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

буде працювати протягом значних n (як +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`)

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


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