Quatro eixos em espiral

9

Pegue os números 0, 1, 2, 3, 4, ...e organize-os em uma espiral no sentido horário, começando para baixo, escrevendo cada dígito em seu próprio quadrado separado.

Em seguida, dado um dos quatro caracteres ASCII distintos e consistentes (sua escolha) representando um eixo e um número inteiro de entrada n, imprima os primeiros ntermos da sequência descrita selecionando quadrados ao longo do eixo correspondente.

Por exemplo, abaixo está a espiral arranjada até a metade 29. Suponha que usamos u / d / l / rpara nossos quatro caracteres, representando up / down / left / right. Então, dados ucomo entrada, produzimos 0, 5, 1, 4 ...(o eixo y positivo) até o nquinto termo. Se, em vez disso, recebêssemos lcomo entrada, seria 0, 3, 1, 1 ...até o nquinto termo.

  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

Estas são sequências no OEIS:

Exemplos

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]

Regras

  • Se aplicável, você pode supor que a entrada / saída caiba no tipo Inteiro nativo do seu idioma.
  • Se você estiver usando números inteiros para representar os quatro eixos, poderá usar números inteiros negativos sem violar as regras.
  • A entrada e saída podem ser fornecidas por qualquer método conveniente .
  • Um programa completo ou uma função são aceitáveis. Se uma função, você pode retornar a saída em vez de imprimi-la.
  • As brechas padrão são proibidas.
  • Isso é portanto todas as regras usuais de golfe se aplicam e o código mais curto (em bytes) vence.
AdmBorkBork
fonte
Podemos usar números inteiros negativos para algumas direções?
mbomb007
@ mbomb007 Claro, isso seria bom.
AdmBorkBork 17/04
Não parece muito prático, mas podemos retornar um número inteiro com os dígitos necessários, exceto o zero inicial (que seria implícito de qualquer maneira)?
Erik o Outgolfer
@AdmBorkBork Basicamente, não tenho essa solução em mente, pensei em perguntar. :)
Erik the Outgolfer
Um desafio é julgado pela saída. Portanto, se o zero não for incluído, acho que seria errado, porque você consideraria errado se o zero for excluído para a saída da string. O Python pode gerar números inteiros com zeros à esquerda, então porque não outras linguagens.
mbomb007

Respostas:

5

Python 2 , 94 89 84 83 74 72 70 bytes

Eu usei o WolframAlpha e determinei que um limite superior de 5 n > 4n 2 + 3n parece ser suficiente. Pode ser alterado para 9 n sem nenhum custo. Para tentar entradas maiores, use em 9*n*nvez de 5**npara evitar a falta de memória.

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

Experimente online!

As entradas para instruções são:

  • 3: direita
  • -3: baixo
  • -1: esquerda
  • 1 para cima

Economizou 14 bytes graças a Rod
Economizou 2 bytes graças a Jonathan Allan

mbomb007
fonte
1

Geléia ,  19  18 bytes

Usa o truque 5 n da resposta Python do mbomb007

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

Um link diádico nà esquerda e de inteiro de:[-3,-1,1,3]:[v,<,^,>]

Experimente online!

Uma alternativa de 20 bytes que é muito mais rápida e não falha automaticamente para n tão pequeno é:

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

Experimente online!

Como?

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
Jonathan Allan
fonte
1

funcionará por n considerável (como +1000)

JavaScript (Node.js) , 104 bytes

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]

Experimente online!

Explicação

  • 3: direita
  • -3: baixo (-3 é legítimo de acordo com os comentários)
  • -1: esquerda
  • 1: up (como @ mbomb007)

C-ésimo dígito da constante de Champernowne

________________________________________________________

Método menos eficiente (não funcionará para mais de 1000)

JavaScript (Node.js) , 81 bytes

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

Experimente online!

DanielIndie
fonte
0

Stax , 13 bytes

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

Execute e depure

Leva entrada com a direção, seguida pela contagem. Direita, cima, esquerda, e para baixo são 1, 3, 5e, 7respectivamente. Demora um minuto inteiro para executar os três casos de teste fornecidos.

recursivo
fonte