Visión general
Escriba un programa que imprima patrones fractales simples dado un patrón de bits que codifica el fractal, más el factor de escala por generación del fractal y el número de generaciones.
Explicación
Aquí hay una representación ASCII de la alfombra Sierpinski :
Generación 0:
#
Generación 1:
# # #
# #
# # #
Generación 2:
# # # # # # # # #
# # # # # #
# # # # # # # # #
# # # # # #
# # # #
# # # # # #
# # # # # # # # #
# # # # # #
# # # # # # # # #
La generación n + 1 de la alfombra ASCII Sierpinski está compuesta por una cuadrícula de 3x3 que contiene 8 copias de la generación n, con el elemento central de la cuadrícula ausente.
Entonces, debido a que se define usando una cuadrícula de 3x3 y aumenta 3 veces más en ancho y alto cada generación, podemos decir que tiene un factor de escala de 3.
Podríamos definir un patrón de bits para la alfombra Sierpinski numerando los elementos en la cuadrícula de 3x3 de 0 a 8, de arriba a abajo, de izquierda a derecha, y configurando el bit correspondiente de un entero si la generación n + 1 contiene un copia de la generación n en esa posición de la cuadrícula:
bit: place value: bit pattern: bit value:
0 1 2 1 2 4 1 1 1 1 2 4
3 4 5 8 16 32 1 0 1 8 0 32
6 7 8 64 128 256 1 1 1 64 128 256
integer value = 1 + 2 + 4 + 8 + 32 + 64 + 128 + 256 = 495
Para un factor de escala de 2, el patrón de bits se organizaría así:
0 1
2 3
y así.
Su tarea es escribir un programa que acepte un patrón de bits en esta forma, un factor de escala (por ejemplo, 3 para la alfombra Sierpinski) y un número de generación y genera un fractal ASCII.
Entrada
Su programa debe aceptar 3 enteros en el siguiente orden: un patrón de bits, un factor de escala (que va de 2 a 5, inclusive) y un conteo de generación (que va de 0 a 5, inclusive).
No necesita realizar ninguna validación de entrada en estos valores y está perfectamente bien si el programa funciona para valores mayores que los rangos especificados.
Las entradas se pueden pasar de cualquier forma (tuplas, listas separadas por comas / espacios, etc.)
Salida
El programa debe generar un fractal compuesto por el #
carácter seguido de un espacio en las posiciones donde se define el fractal, espacios dobles donde no está, y un carácter de nueva línea al final de cada línea, ya sea imprimiéndolos o devolviendo una cadena de una función.
Ejemplos
Entrada:
495,3,3
Salida (Alfombra Sierpinski generación 3):
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
Entrada:
7,2,5
Salida ( Triángulo de Sierpinski ):
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # #
# # # # # # # #
# # # # # # # # # # # # # # # #
# # # # # # # #
# # # # # # # #
# # # #
# # # # # # # # # # # # # # # #
# # # # # # # #
# # # # # # # #
# # # #
# # # # # # # #
# # # #
# # # #
# #
# # # # # # # # # # # # # # # #
# # # # # # # #
# # # # # # # #
# # # #
# # # # # # # #
# # # #
# # # #
# #
# # # # # # # #
# # # #
# # # #
# #
# # # #
# #
# #
#
Entrada:
325,3,3
Salida ( Cantor Dust ):
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
Entrada
186,3,3
Salida ( fractal de Vicsek ):
#
# # #
#
# # #
# # # # # # # # #
# # #
#
# # #
#
# # #
# # # # # # # # #
# # #
# # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # #
# # #
# # # # # # # # #
# # #
#
# # #
#
# # #
# # # # # # # # #
# # #
#
# # #
#
Entrada:
279,3,3
Salida (ejemplo de un fractal asimétrico):
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # #
# # #
# # # # # # # # #
# # #
# # #
# # # # # # # # #
# # #
# # #
# # #
#
#
# # #
#
#
# # # # # # # # #
# # #
# # #
# # #
#
#
# # #
#
#
etc.
Notas:
- Este es el código de golf, por lo que gana la respuesta más corta en bytes
- Su programa puede ser independiente o una función que se llama con los 3 parámetros de entrada y devuelve (o imprime) una cadena
- La generación 0 se define como
#
(#
seguida de un espacio) incluso para un patrón de bits de 0. - Una nueva línea final en la última línea es opcional pero está permitida, al igual que cualquier cantidad de espacio en blanco final en cada línea.
"##"
a"# "
. Veo que el espacio final al final de la línea está incluido en sus ejemplos, ¿es obligatorio? . Según la última regla, supongo que es opcional, pero el hecho de que requiera un espacio final para la generación 0 me hace preguntarme. También creo que debe indicar el espacio en blanco máximo y las nuevas líneas (lo tiene en plural) permitido. Como ejemplo extremo, siempre podría comenzar con una matriz de 5 ^ 6 = 15625 líneas de 2 * 5 ^ 6 espacios y luego sustituir el#
s. En la mayoría de los casos de entrada, es una enorme cantidad de espacio en blanco sin usar279,3,3
?Respuestas:
APL (Dyalog Unicode) , SBCS de 37 bytes
Pruébalo en línea!
fuente
Lisp común,
248242 bytesSin golf
Explicación
dotimes
) y calculamos si cada celda debe dibujarse (enfoque similar a la emisión de rayos). Esto se hace mirando recursivamente dentro del fractal con laf
función auxiliar."# "
o imprimirá" "
. Por supuesto, también imprimimos nuevas líneas al final de cada fila.Por ejemplo, el triángulo de Sierpinsky está representado por
S=7
yR=2
. En la generación 3, el tamaño del cuadrado es 2 3 = 8. Para cada celda (x, y) , sucede lo siguiente:f
se llama con x , y , g unido a 3 ys unido a 4 (8/2)truncate
devuelve tanto el cociente como el resto, que están vinculados respectivamente a px y x (reutilizamos el mismo símbolo x , pero esto no es un problema).f
recursivamente con los nuevos enlaces para x e y . Esas son ahora la posición relativa dentro del fractal interno. Pasamos G-1 para la generación y s / 2 para representar la longitud media del fractal.Ejemplo
Calcular la octava generación de la Alfombra Sierpinski usando
(fractal 495 3 8)
toma 24.7 segundos y genera un archivo de texto de salida de 83 MB. Escribí una versión ligeramente modificada que genera una imagen. Para los mismos parámetros, el archivo GIF pesa 1.5 MB (mismo tiempo de cálculo):Vicsek (haga clic para ver el tamaño original):
fuente
)
en una fila!Pyth, 38 bytes
Pruébelo en línea: Regular Input / Test Suite
La explicación sigue más tarde.
fuente
186 3 5
(intérprete en línea), pero aparte de eso, estoy realmente impresionado por lo breve que es.Rubí, 154
La puntuación es solo para la función. Presentado sin golf en el siguiente programa de prueba. El único juego de golf que estoy reclamando en este momento es la eliminación de comentarios y sangrías. Jugaré golf más tarde. Por el momento, me estoy divirtiendo jugando con el programa.
La función toma seis argumentos, pero en la llamada inicial solo se proporcionan los primeros 3 según la especificación. Esto hace que los tres argumentos restantes se establezcan en valores predeterminados y, en particular, la cadena
a
donde se almacena la salida se crea e inicializa en líneas de espacios terminadas por nuevas líneas. Como efecto secundario,$w
también se crea la variable global , que indica el número de símbolos por línea.Cuando la función se llama a sí misma de forma recursiva, proporciona los seis argumentos, incluida la cadena
a
y las coordenadas x e y de la esquina superior izquierda de la siguiente recursiónEl resto del programa es bastante sencillo, como se indica en los comentarios.
Salida
Aquí hay un conjunto de fractales basados libremente en la forma de las letras de la palabra GOLF. Se podrían lograr letras más realistas con mapas de bits más grandes. Como muestra el último ejemplo, los fractales más interesantes se descubren por accidente.
fuente
CJam, 45
Implementación de mi primera idea. Pruébalo en línea
Básicamente, comienza con una matriz 1 * 1 que contiene 3 (la diferencia entre '#' y ''), luego multiplica repetidamente cada número en la matriz con el patrón de bits (matriz 0/1), y combina las matrices resultantes en una matriz más grande Al final, agrega un espacio a cada número y se une con espacios y líneas nuevas.
2da idea, 49
Pruébalo en línea
Esto genera todas las coordenadas de la matriz de salida como matrices de <número de generación> pares de números más pequeños que el factor de escala (todas esas combinaciones), luego para cada par de números obtiene el bit correspondiente del patrón, y para cada matriz de coordenadas multiplica los bits y multiplica por 3. El procesamiento final es el mismo.
Probablemente haya espacio para más golf.
fuente
C, 316 bytes
Sin golf:
fuente
Scala
293299sin golf:
ejemplos:
primer corte, probablemente se pueda jugar un poco más ...
fuente
#
. Además de ser requerido por la especificación, realmente mejora la apariencia de su salida.Matlab, 115 bytes
El
kron
producto Kronecker hace que todo sea mucho más fácil:fuente
de2bi
solo funciona si tiene la Caja de herramientas de sistemas de comunicaciones. No funciona sin eso. Sería necesariodec2bin
.de2bi
no es lo mismo quedec2bin
.)C, 158 bytes
fuente
K5, 70 bytes
Es un comienzo:
En acción:
fuente