Это версия ASCII этого вызова . Первоначальный пост был отделен по запросу Мартина Эндера
Введение
Подобно последовательности Фибоначчи, последовательность Падована ( OEIS A000931 ) представляет собой последовательность чисел, которая получается путем добавления предыдущих терминов в последовательность. Начальные значения определяются как:
P(0) = P(1) = P(2) = 1
Все 0-й, 1-й и 2-й члены равны 1. Отношение повторения указано ниже:
P(n) = P(n - 2) + P(n - 3)
Таким образом, он дает следующую последовательность:
1, 1, 1, 2, 2, 3, 4, 5, 7, 9, 12, 16, 21, 28, 37, 49, 65, 86, 114, 151, 200, 265, 351, ...
Использование этих чисел в качестве длины сторон равносторонних треугольников дает хорошую спираль, когда вы размещаете их все вместе, во многом как спираль Фибоначчи:
Изображение предоставлено Википедией
задача
Ваша задача состоит в том, чтобы написать программу, воссоздающую эту спираль в соответствии с искусством ASCII, с вводом, соответствующим определенному термину. Так как треугольник с длиной стороны 1 (1 символ) невозможно хорошо представить в ASCII, длины сторон были расширены с коэффициентом 2. Таким образом, треугольник с длиной стороны 1 фактически представлен так:
/\
/__\
Так, например, если входное значение было 5 (5-й член), выходное значение должно быть:
/\
/ \
/ \
/______\
\ /\
\ /__\
\ /\ /
\/__\/
Первые 5 слагаемых были 1, 1, 1, 2, 2, поэтому треугольник имел длину сторон 2, 2, 2, 4, 4 из-за расширения. Еще один пример для ввода 8:
__________
/\ /\
/ \ / \
/ \ / \
/______\ / \
\ /\ / \
\ /__\/ \
\ /\ / \
\/__\/______________\
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\ /
\/
правила
- Вы должны напечатать результат, и ввод должен быть целым числом, соответствующим номеру термина
- Допускается завершающий и ведущий переводы строк, также допускаются завершающие пробелы после строк
- Ваша заявка должна быть в состоянии обработать по крайней мере до 10-го семестра (9)
- Ваша заявка должна быть полной программой или функцией, которая принимает данные и печатает результат
- Вращения выходных данных допускаются с кратностью 60 градусов, но размер треугольников должен оставаться неизменным вместе с представлением
- Также возможно движение против часовой стрелки
- Стандартные лазейки запрещены
Вы можете предположить, что ввод будет> 0, и будет указан правильный формат ввода.
счет
Это код-гольф , поэтому выигрывает самый короткий код в байтах. Всех с новым годом!
Ответы:
Befunge,
871836798 байтПопробуйте онлайн!
Как часто бывает в Befunge, уловка заключается в алгоритме, который позволяет нам отображать шаблон сверху вниз, поскольку просто невозможно сначала отобразить его в памяти при ограниченном доступном пространстве.
Это работает, сначала создав простую структуру данных, представляющую ребра, необходимые для рисования спирали. Затем второй этап анализирует эту структуру сверху вниз, визуализируя фрагменты ребер, необходимые для каждой строки вывода.
Используя эту технику, мы можем поддерживать до n = 15 в эталонной реализации, прежде чем у нас возникнет проблема переполнения в 8-битных ячейках памяти. Интерпретаторы с большим размером ячейки должны иметь возможность поддерживать до n = 25, прежде чем закончится память.
источник
идти, 768 байт
Это, конечно, не оптимально, но это неплохое начало. Я знаю, что это, вероятно, немного просто для стандартов игры в гольф, но это было весело, и я надеюсь, что это не имеет значения, если я оставлю некоторые заметки будущему себе.
Как это работает
По сути, я имитирую «рисованную черепаху», как в LOGO, на сетке пикселей ASCII, но черепаха может выполнять только эти три команды:
Теперь для каждого треугольника я иду следующим образом, где P - это 2-е число n-го Падована:
Четвертый «fd» означает, что я пересматриваю первую сторону каждого треугольника. Это помогает вернуться к хорошей отправной точке для следующего треугольника. Половина правого поворота гарантирует, что следующий треугольник будет в правильной ориентации.
Для игры в черепаху я храню 5 переменных состояния в массиве 态: положение x, положение y, скорость x, скорость y и «руна рисования». На каждом кадре анимации x + = x скорость, y + = y скорость, и рисуется руна.
Затем я установил таблицу 表, в которой рассказывается, как на самом деле выполнить поворот. Код поворота хитрый из-за того, как работает искусство ASCII. Это не прямолинейное движение, как на пиксельном дисплее. Направление черепахи, определяемое скоростью x и y, определяет изменения, необходимые для правильного поворота.
В свою очередь, он смотрит на текущие скорости x и y и объединяет их в индекс.
Этот индекс используется для поиска набора из 5 значений в таблице 表. Эти 5 значений в таблице then затем добавляются к каждой из 5 переменных в состоянии 态. Черепаха затем эффективно поворачивается и готова к следующему «fd».
Для rth, половина правого поворота, есть отдельный раздел таблицы.. Он смещен на 7 * 5 или 35 записей из первой таблицы в 表.
Наконец, я сделал простое кодирование целых чисел таблицы в строку ascii.
Я знаю, что мог бы «сохранить байты», удалив Hanzi, но, как я уже сказал, это не оптимально, и в игре больше возможностей для игры в гольф ... Я уберу их, когда нет другой возможной оптимизации. Эти Hanzi на самом деле имеют значение, основанное на их фактическом значении, и хотя я не знаю китайский язык, это помогает мне думать о программе.
Для проверки кода вам понадобится полный файл golang с этим заголовком
и этот нижний колонтитул
Благодарность
источник