¿Quién no ama un buen fractal? La alfombra Sierpinski es un ejemplo clásico de un fractal.
Para completar esta tarea, se le pedirá que genere una alfombra de tipo e imprima la imagen resultante en stdout
(vea el ejemplo a continuación para formatear) , que representa la alfombra nivelada. Los pasos se pueden encontrar en este artículo de Wikipedia .
Este valor se tomará de stdin
o equivalente.
Por ejemplo, una entrada de 4 produciría una alfombra de nivel 4:
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■ ■
Una entrada de 3 produciría una alfombra de nivel 3:
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■
■ ■ ■ ■ ■ ■ ■ ■ ■
Una entrada de 2 produciría una alfombra de nivel 2:
■ ■ ■
■ ■
■ ■ ■
Y una entrada de 1 produciría una alfombra de nivel 1 (solo un cuadrado):
■
Tenga en cuenta los espacios entre las columnas.
La idea es usar el carácter ■ para bloques y espacio para espacios
La línea comienza con el ■ carácter.
Como siempre, la solución más pequeña gana por recuento de caracteres (debido a caracteres no estándar).
Alternativamente, se puede usar # en lugar del carácter ■ en idiomas que no admiten Unicode.
Respuestas:
CJam,
3837313028 caracteresBueno, estamos contando por caracteres, así que hagamos un poco de desempaquetado Unicode:
Pruébalo aquí. Simplemente ponga el nivel deseado en el campo de entrada.
Explicación
Después de la conversión de base, esto es
que es lo mismo que lo siguiente, solo con el carácter Unicode escrito como
9632c
:Este código se basa en la siguiente observación: si miramos las coordenadas (x, y) de cada celda, obtenemos una celda vacía, siempre que tanto x como y tengan una
1
misma posición en su representación de base 3. Si lo piensa, el patrón de repetición a pequeña escala es el dígito significativo de base 3, luego el siguiente dígito más significativo gobierna la siguiente repetición a mayor escala y así sucesivamente.El contenido de la matriz resultante se imprime automáticamente.
Gracias a Dennis por reducir tres bytes.
fuente
#0<'■S
->#~S'■
guarda 1 personaje.[1_]a#~
con3Yba&
.&
produce un valor verdadero / falso (o incluso que existe). Puede valer la pena una publicación en los consejos de CJam para la forma canónica de probar si una matriz contiene algún elemento.Matlab
(113) (110) (99)(85)Puede probarlo aquí (deberá reemplazarlo
input('')
con la entrada que desee).Ahora 99 gracias a feersum! ¡Y ahora hasta 85 gracias a RTL!
Golfizado:
Sin golf:
Explicación:
Estoy abusando del producto kronecker para esta tarea. (Es un producto especial definido para dos matrices de tamaño arbitrario. Ejemplo:
Luego
Así que aquí hay un ejemplo para n = 5 (en el antiguo método de conteo es 4);
fuente
d=zeros(size([c,c]))
usted debe usard=[c c]*0
.d
puede ser evitado por abusarkron
una vez más:disp(char(kron(c,[1,0])*3+32));
,Haskell,
114108fuente
Python - 100
fuente
Perl 5: 68 caracteres
n en stdin.
Primero se genera una representación ternaria con código decimal de la lista de coordenadas
@,
(nombre elegido, por lo que no hay necesidad de espacio entre@,
yfor
) utilizando los dígitos 0, 1 y 3. Ahora, agregar las coordenadas x e y en el dominio decimal tendrá un 2 en el resultado si y solo si hubiera dos unos en posiciones coincidentes.//
se utiliza para propagar la variable predeterminada$_
desde el bucle externo (for
) a la variable posterior a la coincidencia$'
cuando está sombreada por lamap
variable predeterminada en el bucle interno.fuente
Java,
330283 CaracteresParam es el tamaño que deseas. A menos que haya una optimización para el algoritmo, intenté aplastar todo.
Gracias a que @StretchManiac eliminó el
i
método y limpió las declaraciones, aplastó un poco.Código legible
fuente
String[]a
, y si solo lo está usandoi
una vez, sería mejor deshacerse del método.""+s
en tup
método? Son tres personajes adicionales sin ningún propósito. Incluso si el tipo des
fuera algo másString
, aún sería completamente innecesario.static void p(int s){System.out.print((char)s);}
y en main make itint s=35;
,s=32;
yp(10);
(en lugar dep("\n");
) y guarde algunos caracteres más.Integer.valueOf
anew Byte
Raqueta
230229225220No es la mejor hora de Racket para jugar al golf.
Golfizado:
Sin golf:
fuente
C:
123118111104caracteresBasado en una idea similar a mi solución perl. Después de agregar algunos espacios:
Utiliza un sistema ternario que codifica cada dígito con 2 bits. Los valores ilegales (que tienen dos en posición impar-par) se filtran con
x & (x>>1) & 0b01010101
. Ambas coordenadas se almacenan en un valor, por lo que la comprobación del color del píxel se reduce ax & (x >> 2 * n) & 0b01010101
.n
se almacena como una potencia de 2 por conveniencia.Editar
Reemplazado
define
con una constante simplem
.Editar 2
0x5555555
La máscara se puede representar con(1LL<<32)/3
, pero solo necesitamosn
esos bits, por lo quen/3
es suficiente.Editar 3
Ajustes menores. Una ganancia de 2 caracteres que depende de que se ejecute scanf antes del valor de carga de
n
para la ejecución de--n
. La eol solo puede seguir#
, duh.fuente
HTML / JavaScript, 205 caracteres
Obfuscatweet , 205 caracteres
HTML / JS, 298 caracteres
Debido a cómo HTML juega con espacios en blanco, algunos caracteres tuvieron que estar dedicados al carácter nbsp. Además, la fuente predeterminada de la mayoría de los navegadores no es Courier, por lo que también tuve que configurarla. Unos 20 caracteres de estilo. Si esto requiere un método de entrada directa, puedo agregarlo, pero cambiar la entrada actualmente está configurando n a un valor diferente.
Manifestación
HTML / JS legible
fuente
CJam,
38353231 caracteresPruébalo en línea.
Ejecución de ejemplo
Cómo funciona
convierte la cadena Unicode de base 60,000 (
6e4b
) a base 128 (128b
), se convierte en Character (:c
) y evalúa la cadena resultante (~
).Como resultado, se ejecuta el siguiente código:
fuente
Python 3 -
116113 caracteresEDITAR: Bueno, usé el truco que no me gusta demasiado y comprimí el código en 3 bytes. No sé si esa es la mejor manera posible, pero lo seguiré.
Puede contener algunos caracteres no imprimibles, así que aquí hay una versión imprimible de la cadena.
No demasiado bueno, pero al menos supera algunos idiomas.
A qué se expande:
Algo poco gélido en caso de que alguien no pueda ver cómo funciona:
fuente
Mathematica, 71 bytes
entrada
salida
fuente
CJam, 76 caracteres
Esta es una traducción directa de la fórmula dada aquí.
Pruébalo aquí
fuente
Bash + coreutils, 105 caracteres unicode
Como estamos contando caracteres y no bytes:
En su forma decodificada:
Pure Bash, 143 bytes
La entrada se toma de los argumentos de la línea de comandos:
Salida:
fuente
DO#
Programa completo - 237:
LINQPad - 166 +
Math.Ceiling(Math.Log(a + 1) / Math.Log(10))
fuente
using System;class P{static void Main(string[]a){string g,h;for(int b=(int)Math.Pow(3,int.Parse(a[0])-1),c=-1,d,e,f;++c<b;Console.WriteLine(g))for(g="",d=0;d<b;g+=h)for(h="■",e=c,f=d++;e>0|f>0;e/=3,f/=3)h=e%3==1&f%3==1?" ":h;}}
( 229 bytes / 227 caracteres ) (■
= 3 bytes, por lo que también puedes reemplazarlo#
para ahorrar 2 bytes). Principalmente coloqué todo dentro de los bucles for para que no haya necesidad de corchetesC - 154
Entrada de stdin. Traté de encontrar una buena manera de evitar una función adicional, pero no pude encontrar ninguna.
El recuento de caracteres incluye solo los espacios necesarios.
fuente
PHP, 194 caracteres
El
n
recibido como primer argumento en la línea de comando.Legible
fuente
■
lugar de#
, puede guardar 2 caracteres eliminando las comillas.Scala 230 caracteres
Código de golf:
Código sin golf:
Solo se incluyen los espacios necesarios.
fuente
V , 21 bytes (no competitivos)
Pruébalo en línea!
Hexdump:
V es más nuevo que el desafío, por lo que debe marcarse como no competitivo. Pero aún así, es agradable ver que esta respuesta es muuuucho más corta que todas las demás, incluso cuando se cuentan bytes en lugar de caracteres.
fuente
ok, 40 bytes
Pruébalo en línea.
Comienza con
1
, y luego lo dibuja en una cuadrícula(1 1 1;1 0 1;1 1 1)
, que luego dibuja en una cuadrícula de la misma manera, etc. repite el número necesario de veces.fuente
Python 2 , 91 bytes
Pruébalo en línea!
fuente
C # (.NET Core) , 162 bytes
Pruébalo en línea!
Degolfed
fuente
SOGL V0.12 , 27 bytes
Pruébalo aquí!
fuente
R , 92 caracteres
94 bytes con el carácter especial.
Pruébalo en línea!
fuente
Lienzo ,
171617 caracteresPruébalo aquí!
-1: se utiliza en
[
lugar de{
eliminar el primero;
dentro del bucle.+1: comportamiento errenoo fijo:
■
ahora corresponde al nivel 1, como se especifica en la publicación original.fuente
■
es multibyte. Lo dice hacia abajo en la publicación original.Pip
-S
, 30 caracteres.Pruébalo en línea!
La idea básica: considere una cuadrícula de coordenadas en la base 3. Los agujeros en la alfombra ocurren donde 1) un trit en la coordenada x es
1
, y 2) el trit en la misma posición en la coordenada y también lo es1
.Solución similar, mismo número de caracteres pero -2 bytes:
{2N({aTB3R2i}MSg)?s'■}MC3**a/3
fuente
K (ngn / k) , 50 bytes
gracias @DLosc por recordarme que debería generar espacios entre las columnas
Pruébalo en línea!
fuente