Бета Снежинка

12

Вызов

Зима быстро приближается со многими местами, получающими первые слои снега в течение сезона 15/16, так почему бы нам не разбить снегоуборочные машины и не закодировать себя снегом?

Получив целое число nчерез STDIN, выведите ASCII-представление снежинки беты (как описано ниже) на уровне n.

Бета Снежинка

Снежинка начинается на уровне 0 с одного х:

x

Затем в каждом углу вы добавляете одну из следующих фигур:

x
xx

Вы добавляете вышеуказанную форму в верхний правый угол. Для нижнего правого угла поверните его на 90 ° по часовой стрелке, для нижнего левого, на 180 ° по часовой стрелке и для верхнего левого, на 270 ° по часовой стрелке.

Если вы сделаете это, вы получите следующую форму:

 x x
xx xx
  x
xx xx
 x x

Обратите внимание на ориентацию фигур. Продолжая, мы добавляем больше фигур в каждый угол, используя правила ориентации, описанные выше, к диаграмме, чтобы получить уровень 2:

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

Обратите внимание, что фигуры добавляются только к xs с двумя или более открытыми сторонами (это упоминается как угол выше).

L-формы могут и будут перекрываться для значений nбольше 1. Например:

Если уровень 0:

x x

Тогда на уровне 1 должны быть совпадения (обозначенные o, не включайте oв ваш вывод):

 x o x
xxxoxxx
  x x
xxxoxxx
 x o x 

Ваша задача - вывести это ASCII-представление снежинки Беты.

бонус

Для самой короткой программы будет бонус в 50 повторений, который при nотрицательном значении выводит снежинку (на уровне n*-1) в виде изображения или графически на экран.

У вас могут быть отдельные программы для награды и основной задачи.

выигрыш

Самая короткая программа в байтах побеждает.

Бета распад
источник
4
Гамма-снежинка - это 3d-версия этого.
Конор О'Брайен,
1
@ CᴏɴᴏʀO'Bʀɪᴇɴ Ну, это идея для последующего вызова;)
Beta Decay
Можете ли вы уточнить 2 or more exposed sidesправило? Предполагая , что центр является 0,0то 1,1, 1,-1, -1,-1, -1,1все имеют 2 открытые стороны (стороны , обращенной к другим 4 балла). Разве не должно быть 3+ открытых сторон, чтобы избежать заполнения? Или поочередно он расширяется, только если у него 0 или 1 соседей (кардинал).
Джонатан Лич-Пепин
Как указано выше, это также приведет к дополнительному росту в таких случаях, как n = 2 в углах «квадрата» вокруг центра (это не пик, но он выставлен на сторонах W, NW, N (для верха слева).
Джонатан Лич-Пепин

Ответы:

8

CJam, 88 83 82 байта

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

Проверьте это здесь.

Я думаю, что я могу сэкономить, узнав, где находятся углы. Но, по крайней мере, я наконец-то знаю, как будут выглядеть следующие итерации:

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    

Глядя на них, они кажутся намного более регулярными, чем я ожидал, и какое-то аналитическое решение, которое генерирует их напрямую, может быть намного короче.

Мартин Эндер
источник
1

Python 2, 269 байт

Не размещает фигуры в каждом углу, но определяет, находится ли персонаж в снежинке, на основе координат.

Сначала генерируется один угол, а затем отражается до полной снежинки.

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
источник