A veces, cuando estoy realmente aburrido ( realmente aburrido), me gusta dibujar un segmento de línea y dibujar puntos en él.
Primero, dibujo un segmento de línea de cierto tamaño, que es 2 ^ N para algún valor de N. La línea estará representada por una serie de .
caracteres.
................
Luego, trazo un punto en el extremo izquierdo. Los puntos serán representados por X
personajes.
X...............
Entonces, sigo un patrón. Comenzando en el punto trazado más recientemente (que llamaré A), avanzo al siguiente punto trazado (B) en la línea (ajustando según sea necesario). Luego, avanzo al siguiente punto trazado en la línea (C). Luego, trazo un nuevo punto a medio camino entre este tercer punto (C) y el siguiente punto ya trazado (D).
Cada vez que se ajusta alrededor de la línea, el "centro" se determina de manera envolvente. El punto recién trazado siempre está a la derecha de C.
Digamos que la siguiente línea era mi línea actual. Así es como trazaría los siguientes dos puntos. Para este ejemplo, etiquetaré cada punto importante con una letra.
X...A...X.X...X.
^
X...A...B.X...X.
^
X...A...B.C...X.
^
X...A...B.C...D.
^
X...X...X.X.A.X.
^
X...X...X.X.A.B.
^
C...X...X.X.A.B.
^
C...D...X.X.A.B.
^
X.A.X...X.X.X.X.
^
Volviendo al ejemplo anterior, el siguiente punto se trazará en el medio de la línea.
X.......X.......
Este es quizás un caso un poco especial: avanzar al siguiente punto simplemente te deja donde comenzaste. El único punto intermedio útil es el punto intermedio "cíclico" (el punto intermedio en la línea), en lugar de trazar un punto encima de sí mismo.
A continuación se muestra la serie de puntos que trazaría en la línea desde aquí hasta el final.
X.......X.......
X.......X...X...
X.......X.X.X...
X...X...X.X.X...
X...X...X.XXX...
X.X.X...X.XXX...
X.X.X...XXXXX...
Ya no hay espacio para trazar el siguiente punto, ya que tendría que estar encajado entre dos puntos adyacentes, por lo que he alcanzado la profundidad máxima para el valor dado de N = 4. La última línea en la lista anterior es "completa ".
El reto
El objetivo es escribir el programa más corto / función con nombre que imprimirá / devolverá la línea completa para un valor dado de N. Lo anterior muestra N = 4.
Entrada
La entrada será un único número entero no negativo N. La longitud de la línea generada será 2 ^ N.
Salida
La salida será la línea completa de longitud 2 ^ N, formada por .
y X
caracteres. Una nueva línea final no importa.
Ejemplo de E / S
0
X
1
XX
2
X.XX
3
X.X.XXX.
4
X.X.X...XXXXX...
5
X.X.X...X...X...X.XXX.XXX.......
(c%b+b)%b
? ¿Esperasc
ser negativo?c=0
yd=0
se puede acortar a justoc
yd
.int
los tipos definidos en el nivel de clase se inicializan automáticamente a 0.Haskell, 182 bytes
Uso:
f 5
. Salida:X.X.X...X...X...X.XXX.XXX.......
.Desafortunadamente, Haskell no tiene una función de fusión en las bibliotecas estándar, por lo que tengo que proporcionar la mía (->
%
). Afortunadamente, tengo que fusionar solo listas infinitas, por lo que no tengo que cubrir los casos base, es decir, listas vacías. Todavía cuesta 40 bytes.Cómo funciona: en lugar de configurar los
X
s directamente en una matriz, mantengo una lista de posiciones donde están. Además, no me doy vuelta,2^N
pero sigo aumentando las posiciones hacia el infinito (por ejemplo, para N = 2 con unX
en la parte delantera, la lista de posiciones se ve así[0,4,8,12,16,20,…]
). Tomo el tercer y cuarto elemento (c
yd
), calculo la nueva posición(c+d)/2
, la guardo para la lista de salida, fusiono la lista de posición anterior de la posición 4 (lad
) con una nueva que comienza(c+d)/2
y se repite. Me detengo cuando(c+d)/2
es igualc
. Finalmente agrego un0
a la lista de salida e imprimoX
s en las posiciones dadas y en.
otros lugares.fuente
Mathematica,
110102112108fuente