Copo de nieve de Beta

12

Desafío

El invierno se acerca rápidamente con muchos lugares que reciben las primeras capas de nieve para la temporada 15/16, entonces, ¿por qué no rompemos las máquinas de nieve y codificamos algo de nieve?

Dado un número entero a ntravés de STDIN, genera una representación ASCII del copo de nieve de Beta (como se describe a continuación) a nivel n.

Copo de nieve de Beta

El copo de nieve comienza en el nivel 0 con una sola x:

x

Luego, en cada esquina agrega una de estas formas:

x
xx

Agrega la forma anterior a una esquina superior derecha. Para una esquina inferior derecha, gírela 90 ° en sentido horario, para la esquina inferior izquierda, 180 ° en sentido horario y para la esquina superior izquierda, 270 ° en sentido horario.

Si haces eso, obtienes la siguiente forma:

 x x
xx xx
  x
xx xx
 x x

Tome nota de la orientación de las formas. Continuando agregamos más de las formas a cada esquina, usando las reglas de orientación descritas anteriormente, al diagrama para obtener el nivel 2:

  x x x
 xxxxxxx
xx x x xx
 xxx xxx
xx  x  xx
 xxx xxx
xx x x xx
 xxxxxxx
  x x x

Tenga en cuenta que las formas solo se agregan a xs con dos o más lados expuestos (lo que se conoce como una esquina arriba).

Las formas en L pueden superponerse para valores nsuperiores a 1. Por ejemplo:

Si el nivel 0 es:

x x

Luego debe haber superposiciones en el nivel 1 (indicado con un o, no incluya el oen su salida):

 x o x
xxxoxxx
  x x
xxxoxxx
 x o x 

Su tarea es generar esta representación ASCII del copo de nieve de Beta.

Prima

Habrá una bonificación de 50 repeticiones para el programa más corto que, cuando nes negativo, genera el copo de nieve (a nivel n*-1) como una imagen o gráficamente en la pantalla.

Puede tener programas separados para la recompensa y la tarea principal.

Victorioso

El programa más corto en bytes gana.

Decaimiento Beta
fuente
44
Un copo de nieve gamma es una versión en 3D de esto.
Conor O'Brien
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Bueno, esa es una idea para un desafío de seguimiento;)
Decaimiento Beta
¿Puedes aclarar la 2 or more exposed sidesregla? Suponiendo centro está 0,0a continuación 1,1, 1,-1, -1,-1, -1,1todos tienen 2 lados expuestos (los lados de cara a los otros 4 puntos). ¿No deberían ser más de 3 lados abiertos para evitar el relleno? O, alternativamente, solo se expande si tiene 0 o 1 vecinos (cardinal).
Jonathan Leech-Pepin
Según lo anterior, también conduciría a un crecimiento adicional en casos como n = 2 en las esquinas del 'cuadrado' alrededor del centro (no es un pico, pero está expuesto en los lados W, NW, N (para la parte superior izquierda)
Jonathan Leech-Pepin

Respuestas:

8

CJam, 88 83 82 bytes

1]]{{0f+zW%}8*{YYb_m*{~W$m>fm>}%z:z8Ybff=__1m>\1fm>]:zWf%(\:..|}4*..|}q~*" x"ff=N*

Pruébalo aquí.

Creo que puedo ahorrar mucho en cómo detecto dónde están las esquinas. Pero al menos finalmente sé cómo serán las próximas iteraciones:

N = 3 :

   x x x x   
  xxxxxxxxx  
 xx x x x xx 
xx xxxxxxx xx
 xxx x x xxx 
xx xxx xxx xx
 xxx  x  xxx 
xx xxx xxx xx
 xxx x x xxx 
xx xxxxxxx xx
 xx x x x xx 
  xxxxxxxxx  
   x x x x   

N = 4:

    x x x x x    
   xxxxxxxxxxx   
  xx x x x x xx  
 xx xxxxxxxxx xx 
xx xx x x x xx xx
 xxx xxxxxxx xxx 
xx xxx x x xxx xx
 xxx xxx xxx xxx 
xx xxx  x  xxx xx
 xxx xxx xxx xxx 
xx xxx x x xxx xx
 xxx xxxxxxx xxx 
xx xx x x x xx xx
 xx xxxxxxxxx xx 
  xx x x x x xx  
   xxxxxxxxxxx   
    x x x x x    

Al observar esto, parecen ser mucho más regulares de lo que esperaba, y algún tipo de solución analítica que los genere directamente podría ser mucho más corta.

Martin Ender
fuente
1

Python 2, 269 bytes

No coloca las formas en cada esquina, pero determina si un personaje está en el copo de nieve según las coordenadas.

Primero se genera una esquina, y luego se refleja alrededor del copo de nieve completo.

i=input()
d=2*i+1
s=[x[:]for x in[[0]*d]*d]
s[0][0]=1
if i:s[1][1]=1
for j in range(2,d):
 for v in range(j+1):s[j][v]=s[v][j]=(j+v)%3!=1and j+v<d+i if v>j/2 else j%2==1or j%4+v%2in[0,3]
for l in[l[:0:-1]+l for l in s[:0:-1]+s]:print''.join(['X'if n else' 'for n in l])
TFeld
fuente