Flocon de neige de Beta

12

Défi

L'hiver approche à grands pas et de nombreux endroits reçoivent les premières couches de neige pour la saison 15/16, alors pourquoi ne pas sortir les machines à neige et nous coder de la neige?

Étant donné un entier nvia STDIN, affichez un flocon de neige de la version Beta de la représentation ASCII (comme décrit ci-dessous) au niveau n.

Flocon de neige de Beta

Le flocon de neige commence au niveau 0 avec un seul x:

x

Ensuite, à chaque coin, vous ajoutez l'une de ces formes:

x
xx

Vous ajoutez la forme ci-dessus dans un coin supérieur droit. Pour un coin inférieur droit, faites-le pivoter de 90 ° dans le sens horaire, pour le coin inférieur gauche, 180 ° dans le sens horaire et pour le coin supérieur gauche, 270 ° dans le sens horaire.

Si vous faites cela, vous obtenez la forme suivante:

 x x
xx xx
  x
xx xx
 x x

Prenez note de l'orientation des formes. En continuant, nous ajoutons plus de formes à chaque coin, en utilisant les règles d'orientation décrites ci-dessus, au diagramme pour obtenir le niveau 2:

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

Notez que les formes ne sont ajoutées qu'à des xs avec deux ou plusieurs côtés exposés (ce qui est appelé un coin au-dessus).

Les formes en L peuvent se chevaucher et se chevaucheront pour des valeurs nsupérieures à 1. Par exemple:

Si le niveau 0 est:

x x

Ensuite, il doit y avoir des chevauchements au niveau 1 (indiqué par un o, n'incluez pas le odans votre sortie):

 x o x
xxxoxxx
  x x
xxxoxxx
 x o x 

Votre tâche consiste à générer cette représentation ASCII du flocon de neige de Beta.

Prime

Il y aura un bonus de 50 répétitions pour le programme le plus court qui, lorsqu'il nest négatif, sort le flocon de neige (au niveau n*-1) sous forme d'image ou graphiquement à l'écran.

Vous pouvez avoir un programme séparé pour la prime et la tâche principale.

Gagnant

Le programme le plus court en octets gagne.

Beta Decay
la source
4
Un flocon de neige gamma en est une version 3D.
Conor O'Brien du
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Eh bien, c'est une idée pour un défi de suivi;)
Beta Decay
Pouvez-vous clarifier la 2 or more exposed sidesrègle? En supposant que le centre est 0,0alors 1,1, 1,-1, -1,-1, -1,1ont tous les 2 faces exposées (les côtés faisant face vers les autres 4 points). Ne devrait-il pas y avoir 3+ côtés ouverts pour éviter le remplissage? Ou alternativement, il ne se développe que s'il a 0 ou 1 voisins (cardinal).
Jonathan Leech-Pepin
Comme ci-dessus, cela entraînerait également une croissance supplémentaire dans des cas comme n = 2 aux coins du `` carré '' autour du centre (ce n'est pas un pic, mais il est exposé sur les côtés W, NW, N (pour le haut à gauche).
Jonathan Leech-Pepin

Réponses:

8

CJam, 88 83 82 octets

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

Testez-le ici.

Je pense que je peux économiser beaucoup sur la façon dont je détecte les coins. Mais au moins, je sais enfin à quoi ressembleront les prochaines itérations:

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    

En les regardant, ils semblent être beaucoup plus réguliers que ce à quoi je m'attendais, et une sorte de solution analytique qui les génère directement pourrait être beaucoup plus courte.

Martin Ender
la source
1

Python 2, 269 octets

Ne place pas les formes à chaque coin, mais détermine si un personnage est dans le flocon de neige en fonction des coordonnées.

Un premier coin est généré, puis reflété autour du flocon de neige complet.

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
la source