Kepingan Salju Beta

12

Tantangan

Musim dingin semakin dekat dengan banyak tempat menerima lapisan salju pertama untuk musim 15/16, jadi mengapa kita tidak mengeluarkan mesin salju dan memberi kode pada kita salju?

Diberikan bilangan bulat nmelalui STDIN, menghasilkan representasi ASCII kepingan salju Beta (seperti yang dijelaskan di bawah) di tingkat n.

Kepingan Salju Beta

Kepingan salju dimulai pada level 0 dengan satu x:

x

Lalu, di setiap sudut Anda menambahkan salah satu dari bentuk ini:

x
xx

Anda menambahkan bentuk di atas ke sudut kanan atas. Untuk sudut kanan bawah, putar 90 ° searah jarum jam, untuk kiri bawah, 180 ° searah jarum jam dan untuk kiri atas, 270 ° searah jarum jam.

Jika Anda melakukannya, Anda mendapatkan bentuk berikut:

 x x
xx xx
  x
xx xx
 x x

Perhatikan orientasi bentuk. Melanjutkan kita menambahkan lebih banyak bentuk ke setiap sudut, menggunakan aturan orientasi yang dijelaskan di atas, ke diagram untuk mendapatkan level 2:

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

Perhatikan bahwa bentuk hanya ditambahkan ke xs dengan dua sisi terbuka atau lebih (yang disebut sebagai sudut di atas).

Bentuk-L dapat dan akan tumpang tindih untuk nilai yang nlebih besar dari 1. Misalnya:

Jika level 0 adalah:

x x

Maka harus ada tumpang tindih di level 1 (ditunjukkan dengan o, jangan termasuk odalam output Anda):

 x o x
xxxoxxx
  x x
xxxoxxx
 x o x 

Tugas Anda adalah menampilkan representasi kepingan salju Beta dari ASCII ini.

Bonus

Akan ada bonus 50 rep untuk program terpendek yang, ketika nnegatif, mengeluarkan kepingan salju (pada level n*-1) sebagai gambar atau secara grafik ke layar.

Anda mungkin memiliki program terpisah untuk karunia dan tugas utama.

Kemenangan

Program terpendek dalam byte menang.

Peluruhan Beta
sumber
4
Kepingan salju gamma adalah versi 3d dari ini.
Conor O'Brien
1
@CᴏɴᴏʀO'Bʀɪᴇɴ Nah itu ide untuk tantangan tindak lanjut;)
Beta Decay
Bisakah Anda menjelaskan 2 or more exposed sidesaturannya? Dengan asumsi center 0,0kemudian 1,1, 1,-1, -1,-1, -1,1semua memiliki 2 sisi terkena (sisi menghadap ke arah yang lain 4 poin). Bukankah seharusnya 3+ sisi terbuka untuk menghindari pengisian? Atau bergantian hanya mengembang jika memiliki 0 atau 1 tetangga (kardinal).
Jonathan Leech-Pepin
Seperti di atas, itu juga akan menyebabkan pertumbuhan tambahan dalam kasus-kasus seperti n = 2 di sudut-sudut 'kotak' di sekitar pusat (itu bukan puncak, tetapi itu diekspos di sisi W, NW, N (untuk atas kiri)
Jonathan Leech-Pepin

Jawaban:

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*

Uji di sini.

Saya pikir saya bisa menghemat banyak dalam cara saya mendeteksi di mana sudut-sudutnya. Tapi setidaknya saya akhirnya tahu seperti apa iterasi selanjutnya:

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    

Melihat ini, mereka tampaknya jauh lebih teratur daripada yang saya harapkan, dan semacam solusi analitik yang menghasilkan mereka secara langsung mungkin jauh lebih pendek.

Martin Ender
sumber
1

Python 2, 269 byte

Tidak menempatkan bentuk di setiap sudut, tetapi menentukan apakah suatu karakter berada di kepingan salju berdasarkan koordinat.

Pertama salah satu sudut dihasilkan, dan kemudian cermin ke kepingan salju penuh.

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
sumber