Dibuja la secuencia de Recamán con ASCII


12

La secuencia de Recamán ( A005132 ) es una secuencia matemática, definida como tal:

A(n)={0if n=0A(n1)nif A(n1)n is positive and not already in the sequenceA(n1)+notherwise

Una explicación verbal alternativa más simple es la siguiente:

Resta a menos que no puedas (el número es negativo o se ha usado antes), en cuyo caso suma.

Los primeros términos son0,1,3,6,2,7,13,20,12,21,11

Ahora, ya existe este desafío que le pide que genere el ntérmino de la secuencia. Este es un poco diferente.

Desafío

Dado un número n, dibuja los primeros ntérminos de la secuencia. ¿Qué quiero decir con 'dibujar'? Déjame demostrarte:

  1. Dibuja un número de max([A(y) for y<=n])unidades de línea de largo. Asumiremos que nes 5, por ahora, por lo que la recta numérica tiene 6 unidades de largo (ya que la mayor de , , , y es ). Haga la línea desde los guiones bajos, comenzando en 0:A(1)=0A(2)=1A(3)=3A(4)=6A(5)=26

______

  1. Comience con la transición entre el primer y el segundo término: es decir, 0 y 1. Use |y -para dibujar un cuadrado (igual longitud y altura), hacia arriba. En este caso, tendremos que perdernos el -porque la distancia es solo 1.
||
______
  1. Ahora, dibujaremos en el siguiente paso ( a ) en la parte inferior de la línea (alternamos entre arriba y abajo cada vez):A(2)=1A(3)=3
||
______
 | |
 |-|

Como puede ver, esta línea también tiene una altura de 2, ya que la altura debe ser igual a la distancia entre los dos términos.

Si continuamos, eventualmente llegaremos a:

   |--|
   |  |
|| |  |
______
 |||  |
 |||  |
  |   |
  |---|

Reglas

  • Si hay una -y |colisionando, la última tiene prioridad.
  • Puede haber espacios anteriores / posteriores antes / después de la imagen, pero no se permiten s / _s anteriores / posteriores -(la excepción es 0- o 1- indexación)
  • Puede elegir establecer el punto 0 justo antes del primero _en la recta numérica, o justo después.
  • No hay caracteres alternativos para -, |o _pueden ser utilizados.
  • Este es el , por lo que la respuesta más corta en bytes gana.

Caso de prueba

Aquí hay otro caso de prueba, con n=10

            |-------|
            ||-----||
            ||     ||
  |----|    ||     ||
  |    |    ||     ||
  ||--||    ||     ||
  ||  ||    ||     ||
||||  ||    ||     ||
_____________________
 |||  ||   |||     ||
 |||  ||   |||     ||
  |   ||   |||     ||
  |---||   |||     ||
       |   |||     ||
       |---|||     ||
           ||------||
           |--------|

No está claro dónde se debe colocar el borde izquierdo del cuadrado.
Daniil Tutubalin

@DaniilTutubalin No estoy seguro de entender lo que quieres decir.
Geza Kerecsenyi

Básicamente, la declaración solo especifica que necesitamos dibujar cuadrados (ancho = alto) y que deben alternar entre arriba y abajo. No hay instrucciones sobre el tamaño y la posición de los cuadrados. En el caso de prueba, veo que 2 cuadrados pueden tener la misma posición del borde izquierdo.
Daniil Tutubalin

Creo que As you can see, this line also has a height of 2, since the height must be equal to the distance between the two terms., además de You can choose to set the 0 point just before the first _ on the number line, or just after it.terminar esto bastante bien.
Geza Kerecsenyi

Creo que el caso de prueba para n = 10 está mal desde 13-> 20 en adelante.
Nick Kennedy

Respuestas:


4

Jalea , 70 65 bytes

µ_ż+ɗLṪ>Ƈ-ḟ⁸Ḣṭµ¡µL;ⱮṀ’ṭr,;ɗƝJW,RN¹ƭƲ€$+Lp""ƲZẎ€Ʋ‘ŒṬ×"J$»/ị“-|_ ”Y

Pruébalo en línea!

Un programa completo que toma un número entero través de STDIN y genera el arte ASCII basado en indexación cero.n

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.