Beta's Snowflake


12

Sfida

L'inverno si sta avvicinando rapidamente con molti luoghi che ricevono i primi strati di neve per la stagione 15/16, quindi perché non rompere le macchine da neve e programmare un po 'di neve?

Dato un numero intero ntramite STDIN, genera una rappresentazione ASCII del fiocco di neve Beta (come descritto di seguito) a livello n.

Beta's Snowflake

Il fiocco di neve inizia al livello 0 con una singola x:

x

Quindi, su ogni angolo aggiungi una di queste forme:

x
xx

Aggiungi la forma sopra a un angolo in alto a destra. Per un angolo in basso a destra, ruotarlo di 90 ° in senso orario, per in basso a sinistra, 180 ° in senso orario e per in alto a sinistra, 270 ° in senso orario.

Se lo fai, ottieni la seguente forma:

 x x
xx xx
  x
xx xx
 x x

Prendi nota dell'orientamento delle forme. Proseguendo aggiungiamo più forme ad ogni angolo, usando le regole di orientamento sopra descritte, al diagramma per ottenere il livello 2:

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

Si noti che le forme vengono aggiunte solo a xs con due o più lati esposti (che viene indicato come un angolo sopra).

Le L-forme possono e si sovrapporranno per valori nsuperiori a 1. Ad esempio:

Se il livello 0 è:

x x

Quindi devono esserci sovrapposizioni nel livello 1 (indicato con un o, non includere il onell'output):

 x o x
xxxoxxx
  x x
xxxoxxx
 x o x 

Il tuo compito è produrre questa rappresentazione ASCII del fiocco di neve di Beta.

indennità

Ci sarà un bonus di 50 ripetizioni per il programma più breve che, quando nè negativo, genera il fiocco di neve (a livello n*-1) come immagine o graficamente sullo schermo.

Potresti avere un programma separato per la taglia e l'attività principale.

vincente

Vince il programma più breve in byte.


4
Un fiocco di neve gamma è una versione 3d di questo.
Conor O'Brien,

1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Beh, questa è un'idea per una sfida di follow-up;)
Decadimento beta

Puoi chiarire la 2 or more exposed sidesregola? Supponendo centro è 0,0quindi 1,1, 1,-1, -1,-1, -1,1tutti hanno 2 lati esposti (lati rivolti verso gli altri 4 punti). Non dovrebbero essere 3+ lati aperti per evitare di riempire? O in alternativa si espande solo se ha 0 o 1 vicini (cardinali).
Jonathan Leech-Pepin,

Come sopra, porterebbe anche a una crescita aggiuntiva in casi come n = 2 agli angoli del "quadrato" attorno al centro (non è un picco, ma è esposto sui lati W, NW, N (per la parte superiore a sinistra)
Jonathan Leech-Pepin,

Risposte:


8

CJam, 88 83 82 byte

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

Provalo qui.

Penso di poter risparmiare molto nel modo in cui rilevo dove sono gli angoli. Ma almeno finalmente so come saranno le prossime iterazioni:

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    

Guardando questi, sembrano essere molto più regolari di quanto mi aspettassi e una sorta di soluzione analitica che li genera direttamente potrebbe essere molto più breve.


1

Python 2, 269 byte

Non posiziona le forme in ciascun angolo, ma determina se un personaggio si trova nel fiocco di neve in base alle coordinate.

Viene generato il primo angolo, quindi specchiato attorno al fiocco di neve pieno.

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])
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.