Floco de neve de Beta

12

Desafio

O inverno está se aproximando rapidamente, com muitos lugares recebendo as primeiras camadas de neve para a temporada 15/16, então por que não quebramos as máquinas de neve e nos codificamos um pouco de neve?

Dado um número inteiro nvia STDIN, produza um floco de neve de uma representação ASCII Beta (como descrito abaixo) no nível n.

Floco de neve de Beta

O floco de neve começa no nível 0 com um único x:

x

Em seguida, em cada canto, você adiciona uma destas formas:

x
xx

Você adiciona a forma acima ao canto superior direito. Para um canto inferior direito, gire-o 90 ° no sentido horário, no canto inferior esquerdo, 180 ° no sentido horário e no canto superior esquerdo, 270 ° no sentido horário.

Se você fizer isso, obtém a seguinte forma:

 x x
xx xx
  x
xx xx
 x x

Anote a orientação das formas. Continuando, adicionamos mais formas a cada canto, usando as regras de orientação descritas acima, ao diagrama para obter o nível 2:

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

Observe que as formas são adicionadas apenas a xs com dois ou mais lados expostos (que é referido como um canto acima).

As formas em L podem e se sobrepõem a valores nmaiores que 1. Por exemplo:

Se o nível 0 for:

x x

Em seguida, deve haver sobreposições no nível 1 (indicado com um o, não inclua o oem sua saída):

 x o x
xxxoxxx
  x x
xxxoxxx
 x o x 

Sua tarefa é produzir essa representação ASCII do floco de neve de Beta.

Bônus

Haverá um bônus de 50 repetições para o programa mais curto que, quando nnegativo, produz o floco de neve (no nível n*-1) como uma imagem ou graficamente na tela.

Você pode ter programas separados para a recompensa e a tarefa principal.

Ganhando

O programa mais curto em bytes vence.

Beta Decay
fonte
4
Um floco de neve gama é uma versão 3d disso.
Conor O'Brien
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Bem, isso é uma idéia para um desafio de acompanhamento;)
Decay Beta
Você pode esclarecer a 2 or more exposed sidesregra? Assumindo centro é 0,0, em seguida, 1,1, 1,-1, -1,-1, -1,1todos têm 2 lados expostos (os lados de frente para os outros 4 pontos). Não deveria ter mais de 3 lados abertos para evitar o preenchimento? Ou, alternativamente, ele só se expande se tiver 0 ou 1 vizinhos (cardeal).
Jonathan Sanguessuga-Pepin
Conforme descrito acima, isso também levaria a um crescimento adicional em casos como n = 2 nos cantos do 'quadrado' ao redor do centro (não é um pico, mas é exposto nos lados W, NW, N (para cima) )
Jonathan Leech-Pepin

Respostas:

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*

Teste aqui.

Eu acho que posso economizar muito na maneira como detecto onde estão os cantos. Mas pelo menos finalmente sei como serão as próximas iterações:

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    

Olhando para eles, eles parecem ser muito mais regulares do que eu esperava, e algum tipo de solução analítica que os gera diretamente pode ser muito menor.

Martin Ender
fonte
1

Python 2, 269 bytes

Não coloca as formas em cada canto, mas determina se um personagem está no floco de neve com base nas coordenadas.

Primeiro, um canto é gerado e espelhado para o floco de neve cheio.

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
fonte