Снежинки Коха (также известные как звезда Коха и остров Кох) является математическим кривой , и один из самых ранних фрактальных кривых , чтобы было описаны. Он основан на кривой Коха, появившейся в статье 1904 года, озаглавленной «На непрерывной кривой без касательных, конструируемой из элементарной геометрии» (оригинальное французское название: «Sur une courbe continue sans tangente, obtenue par uns construction géométrique élémentaire») шведский математик Хельге фон Кох.
Вот некоторые представления ascii различных итераций:
n=1
__
\/
n=2
__/\__
\ /
/_ _\
\/
n=3
__/\__
\ /
__/\__/ \__/\__
\ /
/_ _\
\ /
__/ \__
\ /
/_ __ __ _\
\/ \ / \/
/_ _\
\/
Поскольку очевидно, что разрешение представления ascii ограничено, мы должны увеличить размер снежинки в 3 раза для каждой итерации, чтобы показать дополнительную детализацию.
Напишите кратчайший код для вывода снежинки в том же стиле для n = 4
Ваша программа не должна принимать никаких данных.
Ваша программа должна записать снежинку в консоль.
Ответы:
Python, 338 байт
Просто еще один юникод-эксплойт
бежать в идеоне
источник
Python,
650612594574 символовЭто работает, расширяя треугольник в 3 раза каждый раз. Чтобы сделать это, нам нужно отслеживать, является ли каждый символ левой или правой границей (например, как
/
расширяется, зависит от того, какая сторона/
является внутренней). Мы используем разные символы для двух возможных случаев, а именно:d
Переменный обрабатывает специальный случай , когда разложениеa
должны распространяться в 3x3 в следующей строке.источник
('acEei',r'_/\\ ')
=>('aecEi','_\/\ ')
сохраняет еще 1 Вы также можете проверитьunicode.translate()
.16-битный машинный код MS-DOS: 199 байт
Расшифруйте с помощью этого сайта , сохраните как файл 'koch.com' и выполните из командной строки WinXP.
Обновить
Вот простая для чтения версия на ассемблере:
источник
"scAA...w==".decode("base64")
для декодирования в Python2 (не работает для Python3)Perl
176175 байтРазмещение этого в качестве отдельного ответа, потому что он использует двоичный исходный файл, который, возможно, немного обманывает. Но, учитывая, что это все еще исходный код Perl , я думаю, что замечательно, что он превосходит решение машинного кода MS-DOS !
Источник как base64-закодированный
Несколько более читаемый
Замените все экземпляры
/<[0-9a-f]+>/
соответствующими двоичными данными:В этой версии снежинка кодируется следующим образом:
8 бит в каждом байте разделены следующим образом:
R
кодирует ряд пробелов. Самый длинный цикл - 27 символов, поэтому все серии вписываются в 5 бит.C
кодирует последовательность символов, которые просто ищутся в массиве литералов. (Раньше у меня были немного более безумные кодировки, где содержался только массив/ \ _
, но код Perl, необходимый для его декодирования, был длиннее ...)Мне повезло, что двоичные данные не содержат каких-либо
"
/'
или\
которые должны быть экранированы. Я не планировал этого. Но даже если бы это произошло, я, возможно, мог бы просто изменить порядок элементов в массиве, чтобы это исправить.Удивительно, насколько просто это решение сравнивается с десятками других решений, через которые я прошел, прежде чем придумал это. Я экспериментировал со многими различными побитовыми кодировками, более сложными, чем этот, и мне никогда не приходило в голову, что более простой код может стоить этого просто потому, что код Perl для его декодирования будет короче. Я также пытался сжимать повторы в данных, используя переменную интерполяцию (см. Другой ответ), но с самой новой версией, которая больше не получает символов.
источник
Питон, 284
С немного больше пробелов:
Левая сторона сжата; правая сторона воспроизводится с левой стороны.
источник
Perl,
224223 символаНесколько более читаемый
Как это устроено
Для объяснения того, как это работает, см. Другой ответ, в котором я отправляю то же самое в двоичном виде . Мне очень жаль, что я не генерирую снежинку Коха, просто сжимаю ее ...
Предыдущие версии
(359) Кодировалась вся снежинка, а не только левая половина. Пробелы были включены в битовую кодировку; пока нет длины пробега. Использовал несколько интерполированных переменных плюс
@_
массив, доступ к которому осуществлялся с помощьюs/\d/$_[$&]/eg
. Новые строки были закодированы как!
.(289) Первая версия, которая закодировала только левую половину снежинки.
(267) Первая версия, в которой использовалось кодирование длин серий для пробелов.
(266) Изменить
' '
на$"
.(224) Принципиально другое сжатие, закодированное как base-64. (Теперь эквивалентно бинарной версии .)
(223) Понял, что я могу поместить отпечаток в последнюю подложку и таким образом сохранить точку с запятой.
источник