обзор
Напишите программу, которая распечатывает простые фрактальные шаблоны с заданным битовым шаблоном, кодирующим фрактал, плюс масштабный коэффициент для каждого поколения фрактала и количество поколений.
объяснение
Вот ASCII-представление ковра Серпинского :
Поколение 0:
#
Поколение 1:
# # #
# #
# # #
Поколение 2:
# # # # # # # # #
# # # # # #
# # # # # # # # #
# # # # # #
# # # #
# # # # # #
# # # # # # # # #
# # # # # #
# # # # # # # # #
Поколение n + 1 ковра Серпинского ASCII состоит из сетки 3х3, содержащей 8 копий поколения n, при этом отсутствует центральный элемент сетки.
Итак, поскольку он определяется с использованием сетки 3х3 и увеличивается в 3 раза по ширине и высоте с каждым поколением, мы можем сказать, что он имеет масштабный коэффициент 3.
Мы могли бы определить битовый шаблон для ковра Серпинского, пронумеровав элементы в сетке 3x3 от 0 до 8, сверху вниз, слева направо и установив соответствующий бит целого числа, если поколение n + 1 содержит копия поколения 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
Выход (ковер Серпинского 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. В большинстве случаев это огромное количество неиспользуемого пробела