Cuatro ejes en espiral

9

Tome los números 0, 1, 2, 3, 4, ...y organícelos en una espiral en sentido horario, comenzando hacia abajo, escribiendo cada dígito en su propio cuadrado separado.

Luego, dado uno de los cuatro caracteres ASCII distintos y consistentes (su elección) que representan un eje y un entero de entrada n, emite los primeros ntérminos de la secuencia descrita seleccionando cuadrados a lo largo del eje correspondiente.

Por ejemplo, a continuación se muestra la espiral dispuesta hasta la mitad 29. Supongamos que usamos u / d / l / rpara nuestros cuatro personajes, que representan up / down / left / right. Luego, dado ucomo entrada, sacamos 0, 5, 1, 4 ...(el eje y positivo) hasta el ntérmino th. Si, en cambio, se nos da lcomo entrada, entonces sería 0, 3, 1, 1 ...hasta el ntercer término.

  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 son secuencias en OEIS:

Ejemplos

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]

Reglas

  • Si corresponde, puede suponer que la entrada / salida se ajustará al tipo entero nativo de su idioma.
  • Si usa números enteros para representar los cuatro ejes, puede usar números enteros negativos sin romper las reglas.
  • La entrada y la salida se pueden dar por cualquier método conveniente .
  • Un programa completo o una función son aceptables. Si es una función, puede devolver el resultado en lugar de imprimirlo.
  • Las lagunas estándar están prohibidas.
  • Este es el por lo que se aplican todas las reglas habituales de golf, y gana el código más corto (en bytes).
AdmBorkBork
fuente
¿Podemos tomar enteros negativos para un par de direcciones?
mbomb007
@ mbomb007 Claro, eso estaría bien.
AdmBorkBork
No parece muy práctico, pero ¿podemos devolver un número entero que tenga los dígitos requeridos, excepto el cero inicial (que de todos modos estaría implícito)?
Erik the Outgolfer
@AdmBorkBork Básicamente no tengo una solución en mente, solo pensé preguntar. :)
Erik the Outgolfer
Un desafío es juzgado por la salida. Entonces, si no se incluye el cero, creo que estaría mal, porque lo consideraría incorrecto si el cero se excluye para la salida de cadena. Python puede generar números enteros con ceros a la izquierda, entonces, ¿por qué no otros idiomas?
mbomb007

Respuestas:

5

Python 2 , 94 89 84 83 74 72 70 bytes

Usé WolframAlpha y determiné que un límite superior de 5 n > 4n 2 + 3n parece ser suficiente. Se puede cambiar a 9 n sin costo. Para probar entradas más grandes, use en 9*n*nlugar de 5**nevitar quedarse sin memoria.

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

Pruébalo en línea!

Las entradas para las direcciones son:

  • 3: derecha
  • -3: abajo
  • -1: izquierda
  • 1 de ventaja

Guardado 14 bytes gracias a Rod
Guardado 2 bytes gracias a Jonathan Allan

mbomb007
fuente
1

Jalea ,  19  18 bytes

Utiliza el truco 5 n de la respuesta de Python de mbomb007

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

Un enlace diádico que toma na la izquierda dy un entero de:[-3,-1,1,3]:[v,<,^,>]

Pruébalo en línea!

Una alternativa de 20 bytes que es a la vez mucho más rápida y no segfault para un n tan pequeño es:

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

Pruébalo en línea!

¿Cómo?

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
fuente
1

funcionará durante n considerable (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]

Pruébalo en línea!

Explicación

  • 3: derecha
  • -3: abajo (-3 es legítimo según los comentarios)
  • -1: izquierda
  • 1: arriba (como @ mbomb007)

Enésimo dígito de la constante de Champernowne

________________________________________________________

Método menos eficiente (no funcionará para más 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`)

Pruébalo en línea!

DanielIndie
fuente
0

Stax , 13 bytes

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

Ejecutar y depurarlo

Toma entrada con la dirección, seguido del conteo. Derecha, arriba, izquierda, abajo y son 1, 3, 5, y 7respectivamente. Se tarda un minuto completo en ejecutar los tres casos de prueba proporcionados.

recursivo
fuente