Płatek śniegu Beta

12

Wyzwanie

Zima zbliża się wielkimi krokami, a wiele miejsc otrzymuje pierwsze warstwy śniegu na sezon 15/16, więc dlaczego nie wyłamiemy maszyn śniegowych i sami nie zakodujemy?

Biorąc pod uwagę liczbę całkowitą nza pośrednictwem STDIN, wyprowadzaj płatek śniegu reprezentacji ASCII Beta (jak opisano poniżej) na poziomie n.

Płatek śniegu Beta

Płatek śniegu zaczyna się na poziomie 0 z jednym x:

x

Następnie w każdym rogu dodajesz jeden z tych kształtów:

x
xx

Powyższy kształt dodajesz do prawego górnego rogu. Aby uzyskać prawy dolny róg, obróć go o 90 ° zgodnie z ruchem wskazówek zegara, dla lewego dolnego rogu, 180 ° zgodnie z ruchem wskazówek zegara i dla lewego górnego rogu, 270 ° zgodnie z ruchem wskazówek zegara.

Jeśli to zrobisz, uzyskasz następujący kształt:

 x x
xx xx
  x
xx xx
 x x

Zwróć uwagę na orientację kształtów. Kontynuując, dodajemy więcej kształtów do każdego rogu, korzystając z opisanych powyżej zasad orientacji, aby uzyskać poziom 2:

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

Zauważ, że kształty są dodawane do xs tylko z dwiema lub więcej odsłoniętymi bokami (co jest określane jako róg powyżej).

Kształty L mogą i będą się nakładać na wartości nwiększe niż 1. Na przykład:

Jeśli poziom 0 to:

x x

Następnie muszą istnieć nakładki na poziomie 1 (oznaczone jako o, nie uwzględniaj ow danych wyjściowych):

 x o x
xxxoxxx
  x x
xxxoxxx
 x o x 

Twoim zadaniem jest wygenerowanie reprezentacji ASCII płatka śniegu Beta.

Premia

Będzie premia 50 powtórzeń za najkrótszy program, który, gdy njest ujemny, wyświetla płatek śniegu (na poziomie n*-1) jako obraz lub graficznie na ekranie.

Możesz mieć osobne programy dla nagrody i głównego zadania.

Zwycięski

Najkrótszy program w bajtach wygrywa.

Rozpad beta
źródło
4
Płatek śniegu gamma to trójwymiarowa wersja tego.
Conor O'Brien
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Cóż, to jest pomysł na kolejne wyzwanie;)
Beta Decay
Czy możesz wyjaśnić 2 or more exposed sideszasadę? Zakładając, że środek jest 0,0wtedy 1,1, 1,-1, -1,-1, -1,1mają 2 odsłonięte strony (boki zwrócone w kierunku pozostałych 4 punkty). Czy nie powinny to być 3+ otwarte strony, aby uniknąć wypełnienia? Lub naprzemiennie rozwija się tylko wtedy, gdy ma 0 lub 1 sąsiadów (kardynał).
Jonathan Leech-Pepin,
Jak wyżej, doprowadziłoby to również do dodatkowego wzrostu w przypadkach takich jak n = 2 w rogach „kwadratu” wokół centrum (nie jest to szczyt, ale jest odsłonięty po bokach W, NW, N (dla góry po lewej)
Jonathan Leech-Pepin

Odpowiedzi:

8

CJam, 88 83 82 bajtów

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

Sprawdź to tutaj.

Myślę, że mogę dużo zaoszczędzić dzięki temu, że wykrywam, gdzie są narożniki. Ale przynajmniej w końcu wiem, jak wyglądają kolejne iteracje:

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    

Patrząc na nie, wydają się one znacznie bardziej regularne niż się spodziewałem, a jakieś rozwiązanie analityczne, które generuje je bezpośrednio, może być znacznie krótsze.

Martin Ender
źródło
1

Python 2, 269 bajtów

Nie umieszcza kształtów w każdym rogu, ale określa, czy postać znajduje się w płatku śniegu na podstawie współrzędnych.

Najpierw generowany jest jeden róg, a następnie odbijany w lustrze do pełnego płatka śniegu.

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
źródło