Огляд
Напишіть програму, яка виводить прості фрактальні візерунки із заданим бітовим малюнком, що кодує фрактал, плюс коефіцієнт масштабу за покоління фрактала та кількість поколінь.
Пояснення
Ось представлення ASCII килима Sierpinski :
Покоління 0:
#
Покоління 1:
# # #
# #
# # #
Покоління 2:
# # # # # # # # #
# # # # # #
# # # # # # # # #
# # # # # #
# # # #
# # # # # #
# # # # # # # # #
# # # # # #
# # # # # # # # #
Покоління n + 1 килима ASCII Sierpinski складається з сітки 3х3, що містить 8 примірників покоління n, центральний елемент сітки відсутній.
Отже, оскільки він визначається за допомогою сітки 3х3 і отримує в 3 рази більше ширини та висоти кожного покоління, можна сказати, що він має масштабний коефіцієнт 3.
Ми могли б визначити біт-шаблон для килима Sierpinski, пронумерувавши елементи в сітці 3x3 від 0 до 8, зверху вниз, зліва направо та встановивши відповідний біт цілого числа, якщо покоління n + 1 містить a копія покоління n у цій сітці:
bit: place value: bit pattern: bit value:
0 1 2 1 2 4 1 1 1 1 2 4
3 4 5 8 16 32 1 0 1 8 0 32
6 7 8 64 128 256 1 1 1 64 128 256
integer value = 1 + 2 + 4 + 8 + 32 + 64 + 128 + 256 = 495
Для коефіцієнта масштабу 2, бітовий малюнок буде розташований так:
0 1
2 3
і так далі.
Ваше завдання - написати програму, яка приймає бітовий малюнок у цій формі, коефіцієнт масштабу (наприклад, 3 для килима Серпінського) та номер покоління та виводить фрактал ASCII.
Вхідні дані
Ваша програма повинна приймати 3 цілих числа у такому порядку: бітовий малюнок, коефіцієнт масштабу (від 2 до 5 включно) та кількість генерацій (від 0 до 5 включно).
Не потрібно проводити перевірку вхідних даних для цих значень, і це цілком добре, якщо програма працює для значень, більших за вказані діапазони.
Вхідні дані можна передавати у будь-якій формі (кортежі, список, розділений комами / пробілом тощо)
Вихідні дані
Програма повинна вивести фрактал, що складається з #
символу, а потім пробіл у позиціях, де визначено фрактал, подвійні пробіли, де його немає, та символ нового рядка в кінці кожного рядка, або друкуючи їх, або повертаючи рядок від функції.
Приклади
Вхід:
495,3,3
Вихід (килимове покоління Sierpinski 3):
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
Вхід:
7,2,5
Вихід ( Сірпінський трикутник ):
# # # # # # # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # #
# # # # # # # # # # # # # # # #
# # # # # # # #
# # # # # # # # # # # # # # # #
# # # # # # # #
# # # # # # # #
# # # #
# # # # # # # # # # # # # # # #
# # # # # # # #
# # # # # # # #
# # # #
# # # # # # # #
# # # #
# # # #
# #
# # # # # # # # # # # # # # # #
# # # # # # # #
# # # # # # # #
# # # #
# # # # # # # #
# # # #
# # # #
# #
# # # # # # # #
# # # #
# # # #
# #
# # # #
# #
# #
#
Вхід:
325,3,3
Вихід ( канторний пил ):
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
# # # # # # # #
Вхідні дані
186,3,3
Вихід ( фрактал Vicsek ):
#
# # #
#
# # #
# # # # # # # # #
# # #
#
# # #
#
# # #
# # # # # # # # #
# # #
# # # # # # # # #
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # #
# # #
# # # # # # # # #
# # #
#
# # #
#
# # #
# # # # # # # # #
# # #
#
# # #
#
Вхід:
279,3,3
Вихід (приклад асиметричного фрактала):
# # # # # # # # # # # # # # # # # # # # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # # # # # # # #
# # #
# # #
# # # # # # # # #
# # #
# # #
# # # # # # # # #
# # #
# # #
# # #
#
#
# # #
#
#
# # # # # # # # #
# # #
# # #
# # #
#
#
# # #
#
#
тощо.
Примітки:
- Це код-гольф, тому найкоротша відповідь у байтах виграє
- Ваша програма може бути або окремою, або функцією, яка викликається з 3 вхідних параметрів і повертає (або друкує) рядок
- Покоління 0 визначається як
#
(з#
подальшим пробілом) навіть для бітового шаблону 0. - Останній рядок у останньому рядку необов’язковий, але дозволений, як і будь-яка кількість пробілів у кожному рядку.
279,3,3
,?
"##"
на"# "
. Я бачу, що один кінцевий пробіл в кінці рядка включений у ваші приклади, це потрібно? . За останнім правилом я вважаю, що це необов’язково, але той факт, що вам потрібен простір для генерації 0, здивує мене. Також я думаю, що вам слід вказати максимальний пробіл та нові рядки (у вас це множина). Як крайній приклад, я завжди міг почати з масиву 5 ^ 6 = 15625 рядків з 2 * 5 ^ 6 пробілами, а потім замінити#
s. У більшості випадків це величезна кількість невикористаного пробілу