ASCII мистецтво квадратних афінних фракталів


9

Напишіть найменшу програму, яку ви можете створити споріднені фрактали. Ви можете використовувати будь-який метод, який вам здається, що дає ті самі результати, що і правила нижче. Вам не доведеться використовувати будь-які ідеї із запропонованих методів!

Ваша програма займе два входи, перший визначить візерунок у форматі, 074виконаному з трьох цифр від 0 до 7. Другий вхід визначатиме розмір, 3буде 8x8, 4буде 16x16 і так далі (2 ^ n). Ваша програма повинна вивести правильний результат для всіх розмірів від 0 (1x1) до принаймні 5 (32x32). Якщо він створює будь-який вихід для більших чисел, він повинен бути правильним, тобто він повинен видавати правильний вихід до певного розміру, але не давати жодного виходу, що перевищує цей розмір, якщо це було б неправильно. Ви можете припустити максимальний розмір 15 (32768x32768), оскільки це вже божевільний розмір для мистецтва ASCII (1 ГБ)!

Візерунок 8х8 буде виглядати приблизно так (нижче 160). Найменше лівозначна цифра буде для блоку A, середня цифра (не грубі думки, будь ласка!) Для блоку, Bа найправіша цифра для блоку C. Щоб побудувати фрактал, зменшіть його вдвічі в обох розмірах і застосуйте правило обертання / дзеркального відображення для блоку. Щоб зменшити візерунок, розподіліть його рівномірно на 2х2 зони. У кожній області буде або 3 видимих ​​символи, або жоден. Якщо є видимі символи, розмістіть символу у відповідному місці в меншому блоці, інакше поставте пробіл. Правила 0- 3не дзеркальні, правила 4- 7дзеркальні. Правила 0і 4не обертаються, 1а 5обертаються на 90 градусів за годинниковою стрілкою, 2і6обертаються на 180 градусів 3і 7повертаються на 270 градусів за годинниковою стрілкою. З’єднайте три блоки разом у наведеному порядку Aу верхньому лівому куті, Bвнизу вліво та Cвнизу праворуч.

 AAA    
AA A    
AA      
A       
BBB CC  
B BBC   
  BBCCC 
   B CCC

Зменшується, обертається та відображається за номером правила:

 0       1       2       3       4       5       6       7  
----    ----    ----    ----    ----    ----    ----    ----
AA       BAA    CCB        C    C        BCC    AAB       AA
A       BB A     CBB      CC    CC      BBC     A BB       A
BBC     CC         A    A BB    BB A    A         CC     CBB
 BCC    C         AA    AAB      BAA    AA         C    CCB 

Правила:

  1. Не дзеркальний, Поворот на 90 градусів за годинниковою стрілкою
  2. Не дзеркальний, Поворот на 180 градусів за годинниковою стрілкою
  3. Не дзеркальний, Поворот на 270 градусів за годинниковою стрілкою
  4. Дзеркальний, але не повернутий
  5. Потім дзеркальне повернення на 90 градусів за годинниковою стрілкою
  6. Потім дзеркальне повернення на 180 градусів за годинниковою стрілкою
  7. Потім дзеркальне повернення повертається на 270 градусів за годинниковою стрілкою
  8. Правило 0: Не дзеркальне відображення, Не повертається

Дзеркальне відображення завжди робиться спочатку і робиться по діагоналі через порожній кут, наприклад, правило 0 проти правила 4:

 0       4  
----    ----
AA /    C  /
A /     CC/ 
BBC     BB A
/BCC    /BAA

Тільки правила 1, 6і 0використовуються в зазначеній вище моделі, в такому порядку. Після того, як трансформації будуть застосовані і блоки зшиті між собою, це буде мати вигляд нижче, за винятком того, що я відклав один блок один від одного пробілом. Ваш код не матиме цього додаткового місця в ньому. Якщо порівнювати його з зображенням "батьків", ви побачите, що він має видимі символи в однакових положеннях.

 BAA
BB A
CC  
C   

AAB  AA  
A BB A   
  CC BBC 
   C  BCC

Інший спосіб генерувати зображення без зменшення: Почніть з одного символу:

X

Застосуйте перетворення для кожного з трьох блоків (жоден, оскільки це лише один символ) і з'єднайте блоки разом:

X
XX

Знову застосуйте перетворення для кожного з трьох блоків:

1 
--
XX
X 

6     0 
--    --
XX    X 
 X    XX

Зшийте їх разом:

XX
X 
XXX 
 XXX

Знову застосуйте перетворення для кожного з трьох блоків:

 1  
----
 XXX
XX X
XX  
X   

 6       0  
----    ----
XXX     XX  
X XX    X   
  XX    XXX 
   X     XXX

Зшийте їх разом:

 XXX    
XX X    
XX      
X       
XXX XX  
X XXX   
  XXXXX 
   X XXX

Ви можете використовувати будь-які символи для друку або символи (0x21 - 0x7E) для видимої частини шаблону, але лише пробіл (0x20) для пробілів. Додаткові пробіли дозволені, але не повинно бути пробілів поза цілою площею (тобто для квадрата 8х8 не може бути символів минулого стовпця 8).

Існує 512 різних правил, але деякі з них створюють ту саму схему. Як бічна примітка, будь-який візерунок, що містить лише, 0і 4створить трикутник Сєрпінського (8 різних правил).

Ви можете за бажанням розмістити свій улюблений шаблон і правило, яке його генерує. Якщо ви робите, переконайтеся, що розмір становить не менше 3 (8x8), щоб відрізнити його від аналогічних правил.


@trichoplax Ви можете почати з повністю заповненого квадрата або квадрата, який містить лише 1 видимий символ. У будь-якому випадку, повторення правил n разів, де n - розмір вводу, гарантуватиме однакові результати. Однак вам не потрібно генерувати шаблон таким чином, лише генеруйте той самий візерунок, як це робите таким чином.
CJ Dennis

@trichoplax Я ціную ваш внесок. Те, як я бачу речі, не обов'язково так, як інші люди бачать речі, і я не знаю, що мені це важко!
CJ Dennis

2
+1 Дякую, ви зробили пояснення набагато зрозуміліше! Надалі я рекомендую вам запустити речі через нашу пісочницю, щоб люди могли отримати чіткіше уявлення про те, що ви просите достроково. Я над цим викликом працюю незабаром :)
BrainSteel

Так, кожен бачить речі по-різному. Раді дати відгуки - гарне питання варто уточнити. Зараз добре читається.
трихоплакс

@BrainSteel Дякую, зробимо! Я багато років працював на SE, але я все ще відносно новий в PCG!
CJ Dennis

Відповіді:


1

CJam, 63 57 54 52 байт

0aarari*{\f{\~7"W%z"a*3"Wf%"t<s~}({__Ser+}%\~.++}/N*

Як це працює :

Основна ідея полягає в тому, що ви запускаєте цикл, другий вхід кількість разів. У кожному циклі, починаючи з одного масиву масиву, що містить 0( [[0]]), ми будуємо фрактал для наступного кроку, використовуючи три правила, заповнюємо порожній квадрант і готуємо квадранти для наступного циклу.

0aa                           e# Starting condition, equivalent to a single A
   ra                         e# Read the rule string and wrap it in an array
     ri*                      e# Repeat the rule array, second input number of times
        { ...  }/             e# Loop for each rule in the rule array
                              e# In each loop, we will have the current fractal and
                              e# then the rule on stack
\f{\~7"W%z"a*3"Wf%"t<s~}      
\f{                    }      e# Move the rule on top of stack and for each of the rule
                              e# character, run this loop on the current fractal
   \~                         e# Move the rule char on top and convert to int by face value
     7"W%z"a*3"Wf%"t          e# This is the array which has the logic to perform the rules
                              e# ["W%z" "W%z" "W%z" "Wf%" "W%z" "W%z" "W%z"]
                    <s        e# Based on the rule number value, take that many first items
                              e# from the above array and do a toString on the array
                              e# For rule 0 through 7, you will get the following strings:
                              e# 0: "", 1: "W%z", 2: "W%zW%z", 3: "W%zW%zW%z",
                              e# 4: "W%zW%zW%zWf%", 5: "W%zW%zW%zWf%W%z",
                              e# 6: "W%zW%zW%zWf%W%zW%z", 7: "W%zW%zW%zWf%W%zW%zW%z"
                              e# This works because each W%z will rotate the block of
                              e# fractal 90 degrees in clockwise direction.
                              e# For rule 4, where we need to mirror diagonally, we first
                              e# rotate it 279 degrees clock wise and then reverse each row
                              e# of the block. The rest of the rules after 4 take that
                              e# mirroring as base and rotate 90 degrees additionally
                      ~       e# Simply evaluate the string to apply the rule.
\f{ ... }                     e# After this for each loop, we get 3 copies of the fractal
                              e# block before the for loop. Each copy gets each one of the
                              e# three rule gets applied.
         ({      }%           e# We take out the first part corresponding to the 1st
                              e# quadrant and run each row through this loop to fill the
                              e# second quadrant with spaces
           __Ser              e# Take a copy of the row and replace everything in the
                              e# copy with spaces
                +             e# Append it to the original row
                   \~         e# Bring the last two quadrant array on top and unwrap it
                     .+       e# Append corresponding rows from the 4th quadrant to 3rd
                       +      e# Append the rows from lower half to the upper half
                              e# Now we have a full block ready to be run through
                              e# the next iteration which will double its size
                          N*  e# Finally, we join the rows of final fractal block with
                              e# newlines and automatically print the result

Спробуйте його онлайн тут


Дуже гарна! Це створює занадто мало символів для друку, якщо шаблон починається з, 0а Джеймс Бонд має ліцензію на вбивство. 007: IndexOutOfBoundsException
CJ Dennis

@CJDennis Є помилка з провідними нулями. Виправлено зараз.
Оптимізатор

Молодці! Вихід виглядає ідеально зараз!
CJ Dennis

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.