обзор
Напишите программу, которая распечатывает простые фрактальные шаблоны с заданным битовым шаблоном, кодирующим фрактал, плюс масштабный коэффициент для каждого поколения фрактала и количество поколений.
объяснение
Вот 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. - Конечный символ новой строки в последней строке является необязательным, но разрешенным, как и любое количество пробелов в каждой строке.
"##"
на"# "
. Я вижу, что один пробел в конце строки включен в ваши примеры, это требуется? , В соответствии с последним правилом я бы предположил, что это необязательно, но тот факт, что для поколения 0 вам нужен завершающий пробел, заставляет задуматься. Также я думаю, что вы должны указать максимально допустимые пробелы и символы новой строки (у вас это множественное число). В качестве крайнего примера я всегда могу начать с массива из 5 ^ 6 = 15625 строк по 2 * 5 ^ 6 пробелов, а затем заменить#
s. В большинстве случаев это огромное количество неиспользуемого пробела279,3,3
?Ответы:
APL (Dyalog Unicode) , 37 байтов SBCS
Попробуйте онлайн!
источник
Обыкновенный Лисп,
248242 байтаUngolfed
объяснение
dotimes
) и вычисляем, должна ли быть нарисована каждая ячейка (подход, подобный raycasting). Это делается путем рекурсивного просмотра фрактала соf
вспомогательной функцией."# "
или напечатайте" "
. Конечно, мы также печатаем переводы строк в конце каждой строки.Например, треугольник Серпинского представлен
S=7
иR=2
. В поколении 3 размер квадрата составляет 2 3 = 8. Для каждой ячейки (x, y) происходит следующее:f
вызывается с x , y , g, связанным с 3 и s, связанным с 4 (8/2)truncate
возвращает как частное, так и остаток, которые связаны соответственно с px и x (мы повторно используем один и тот же символ x , но это не проблема).f
рекурсивно с новыми привязками для x и y . Теперь это относительная позиция внутри внутреннего фрактала. Проходим G-1 за поколение и с / 2 чтобы представить половину длины фрактала.пример
Вычисление 8-го поколения ковра Серпинского с использованием
(fractal 495 3 8)
занимает 24,7 секунды и создает выходной текстовый файл размером 83 МБ. Я написал слегка модифицированную версию, которая выводит изображение. Для тех же параметров файл GIF весит 1,5 МБ (то же время вычислений):Vicsek (нажмите, чтобы увидеть оригинальный размер):
источник
)
подряд!Pyth, 38 байт
Попробуйте онлайн: Regular Input / Test Suite
Объяснение следует позже.
источник
186 3 5
(онлайн-переводчика), но кроме этого я действительно впечатлен тем, насколько это коротко.Рубин, 154
Оценка только для функции. Представлено без присмотра ниже в тестовой программе. Единственная игра в гольф, на которую я сейчас претендую, это удаление комментариев и отступов. Я буду в гольф позже. На данный момент мне весело играть с программой.
Функция принимает шесть аргументов, но при первоначальном вызове в спецификации указываются только первые 3 аргумента. Это приводит к тому, что для трех оставшихся аргументов устанавливаются значения по умолчанию, и, в частности,
a
создается строка, в которой хранится вывод, и инициализируется строками пробелов, оканчивающимися символами новой строки. Как побочный эффект глобальной переменной$w
также создается , указывающая количество символов в строке.Когда функция вызывает себя рекурсивно, она предоставляет все шесть аргументов, включая строку
a
и координаты x и y верхнего левого угла следующей рекурсииОстальная часть программы довольно проста, как указано в комментариях.
Выход
Вот набор фракталов, свободно основанных на форме букв слова GOLF. Более реалистичные буквы можно получить с помощью больших растровых изображений. Как показывает последний пример, наиболее интересные фракталы обнаружены случайно.
источник
CJam, 45
Реализация моей первой идеи. Попробуйте онлайн
По сути, он начинается с матрицы 1 * 1, содержащей 3 (разница между '#' и ''), затем многократно умножает каждое число в матрице на битовую комбинацию (матрица 0/1) и объединяет полученные матрицы в одну большая матрица. В конце он добавляет пробел к каждому числу и соединяет пробелами и символами новой строки.
2-я идея, 49
Попробуйте онлайн
При этом все координаты выходной матрицы генерируются как массивы пар чисел <count count>, меньших, чем масштабный коэффициент (все такие комбинации), затем для каждой пары чисел он получает соответствующий бит из шаблона и для каждого массива координат он умножает биты и умножает на 3. Окончательная обработка такая же.
Там, вероятно, есть место для большего количества игры в гольф.
источник
C, 316 байтов
Un-golfed:
источник
Скала
293299ungolfed:
Примеры:
первый срез, вероятно, можно играть в гольф немного дальше ...
источник
#
. Помимо того, что этого требует спецификация, он действительно улучшает внешний вид вашей продукции.Matlab, 115 байт
Продукт Kronecker
kron
делает все намного проще:источник
de2bi
работает, только если у вас есть набор инструментов системы связи. Не работает без этого. Это будет необходимоdec2bin
.de2bi
это не то же самое, чтоdec2bin
.)C 158 байтов
источник
К5, 70 байт
Это начало:
В бою:
источник