Это коса Паскаля:
1 4 15 56 209 780 2911 10864 40545 151316 564719
1 3 11 41 153 571 2131 7953 29681 110771 413403 1542841
1 4 15 56 209 780 2911 10864 40545 151316 564719
Я полностью выдумал это. Насколько я могу судить, у Блеза Паскаля не было косички, и если он это сделал, то, вероятно, он был сделан из волос, а не из цифр.
Это определяется так:
- Первый столбец имеет один
1
в середине. - Второй столбец имеет
1
вверху и внизу. - Теперь мы чередуем размещение числа в середине или двух копий числа сверху и снизу.
- Если число идет сверху или снизу, это будет сумма двух соседних чисел (например
56 = 15 + 41
). Если немного наклонить голову, это похоже на шаг в треугольнике Паскаля. - Если число идет посередине, это будет сумма всех трех соседних чисел (например
41 = 15 + 11 + 15
).
Ваша задача будет напечатать (некоторую часть) эту косу.
вход
Вы должны написать программу или функцию, которая получает одно целое число n
, дающее индекс последнего столбца, который будет выведен.
Вы можете выбрать, соответствует ли первый столбец (печатая только один 1
в средней строке) n = 0
или n = 1
. Это должен быть последовательный выбор во всех возможных входах.
Выход
Выведите Косу Паскаля до n
th-го столбца. Пробелы должны точно соответствовать приведенному выше примеру макета, за исключением того, что вы можете заполнить более короткую строку (и) длиной более длинной строки (ей) пробелами и при желании вывести один завершающий перевод строки.
Другими словами, каждый столбец должен быть точно такой же ширины, как число (или пара равных чисел) в этом столбце, числа в последовательных столбцах не должны перекрываться, и между столбцами не должно быть пробелов.
Вы можете либо распечатать результат в STDOUT (или ближайшую альтернативу), либо, если вы напишите функцию, вы можете вернуть либо строку с тем же содержимым, либо список из трех строк (по одной для каждой строки).
Более подробная информация
Вы можете предположить, что n
он не будет меньше индекса первого столбца (поэтому не меньше 0
или 1
зависит от вашей индексации). Вы также можете предположить, что последнее число в косе меньше 256 или самое большое число, представляемое родным целочисленным типом вашего языка, в зависимости от того, что больше . Поэтому, если ваш собственный целочисленный тип может хранить только байты, вы можете предположить, что наибольшее значение n
равно 9
или 10
(в зависимости от того, используете ли вы 0- или 1-основанное n
), и если оно может хранить 32-разрядные целые числа со знаком, n
будет самое большее 33
или 34
.
Применяются стандартные правила игры в гольф . Самый короткий код выигрывает.
OEIS
Вот несколько соответствующих ссылок OEIS. Конечно, они содержат спойлеры для разных способов генерации чисел в косе:
Тестовые случаи
В этих тестах используется 1-базовое индексирование. Каждый тестовый пример состоит из четырех строк, первая из которых является вводом, а остальные три - выходом.
1
1
---
2
1
1
1
---
3
1
1 3
1
---
5
1 4
1 3 11
1 4
---
10
1 4 15 56 209
1 3 11 41 153
1 4 15 56 209
---
15
1 4 15 56 209 780 2911
1 3 11 41 153 571 2131 7953
1 4 15 56 209 780 2911
---
24
1 4 15 56 209 780 2911 10864 40545 151316 564719 2107560
1 3 11 41 153 571 2131 7953 29681 110771 413403 1542841
1 4 15 56 209 780 2911 10864 40545 151316 564719 2107560
Ответы:
Желе ,
313029 байтЭто монадическая ссылка; он принимает индекс столбца на основе 0 в качестве аргумента и возвращает список строк.
Попробуйте онлайн!
Как это работает
источник
Pyth , 44 байта
Генерация номера заняла 20 байтов, а форматирование - 24 байта.
Попробуйте онлайн!
источник
Python 2, 120 байт
Попробуйте это на Ideone.
источник
MATL , 38 байт
Попробуйте онлайн!
Вычисление массива с (уникальными) числами занимает первые 17 байтов. Форматирование занимает оставшиеся 21 байт.
объяснение
Часть 1: генерация чисел
Это создает массив с номерами от первых и вторых строк в порядке возрастания:
[1; 1; 3; 4; 11; 15; ...]
. Она начинается с1
,1
. Каждое новое число итеративно получается из предыдущих двух. Из них второе умножается на1
или в2
зависимости от индекса итерации, а затем суммируется с первым для получения нового числа.Количество итераций равно входу
n
. Это означает, чтоn+2
числа генерируются. После того, как массив сгенерирован, его нужно урезать, чтобыn
сохранить только первые записи.Часть 2: форматировать вывод
Для каждого числа в полученном массиве это генерирует две строки: строковое представление числа и строку одинаковой длины, состоящую из повторяющегося символа 0 (символ 0 отображается как пробел в MATL). Для четных итераций эти две строки меняются местами.
Затем две строки соединяются вертикально. Таким образом,
n
двумерные символьные массивы создаются следующим образом (используется·
для представления символа 0):Эти массивы затем соединяются горизонтально для получения
Наконец, этот массив двумерных символов разбивается на две строки, а первая дублируется в верхней части стека. Три строки отображаются по порядку, каждая на отдельной строке, производя желаемый результат
источник
Haskell, 101 байт
Определяет функцию
f :: Int → [String]
.Майкл Кляйн напомнил мне, что мне не нужно вызывать
unlines
результат, экономя 7 байтов. Благодарность!Я сохранил байт, заменив
" 9"!!mod i 2
наcycle" 9"!!i
.Еще три байта, написав два базовых списка вместо использования
drop
.Моя девушка указала, что я могу сохранить еще два байта, начав
0
вместо ответов1
.источник
C,
183177176 байтовобъяснение
Си никогда не собирается выигрывать призы за краткость против языка более высокого уровня, но упражнение является интересной и хорошей практикой.
Макрос F сбрасывает шесть байтов за счет читабельности. Переменные объявляются глобально, чтобы избежать нескольких объявлений. Мне нужен был символьный буфер для sprintf, но поскольку K & R не справляется с проверкой типов, sprintf и printf могут интерпретировать t [9] как указатель на 36-байтовый буфер. Это сохраняет отдельную декларацию.
Симпатичная функция печати, где r - номер строки. Sprintf форматирует число и вычисляет ширину столбца. Чтобы сэкономить место, мы просто вызываем это три раза, по одному для каждой строки вывода; выражение ri & 1 фильтрует то, что печатается.
Функция точки входа, аргумент - количество столбцов. Вычисляет массив значений столбца a [], затем вызывает функцию печати p один раз для каждой строки вывода.
Пример вызова (не включен в ответ и количество байтов):
обновленный
Включено встроенное предложение sprintf от tomsmeding. Это уменьшило счет с 183 до 177 символов. Это также позволяет удалить фигурные скобки вокруг блока printf (sprintf ()), поскольку теперь это только один оператор, но он сохранил только один символ, поскольку ему все еще требуется пробел в качестве разделителя. Так что до 176.
источник
w
где оно используется? Вы, кажется, используете его только один раз.itoa
вместо sprintf?PowerShell v2 +, 133 байта
44 байта для вычисления значений, 70 байтов для формулировки ASCII
Принимает ввод
$n
как столбец с нулевым индексом. Устанавливает начало нашего массива последовательностей$a=1,1
. Затем мы возвращаемся к$n
с,1..$n|%{...}
чтобы создать массив. На каждой итерации мы объединяем сумму (два элемента назад) + (предыдущий элемент) * (нечетный или четный индекс). Это будет генерировать$a=1,1,3,4,11...
до$n+2
.Итак, нам нужно нарезать
$a
только первые0..$n
элементы и передать их через другой цикл|%{...}
. На каждой итерации мы устанавливаем хелпер$z
равным количеству пробелов плюс текущий элемент в виде строки. Затем мы разбиваем, объединяется ли это$x
(верхний и нижний ряды) или$y
(средний ряд) простым нечетнымif
/else
. Затем мы вычисляем количество пробелов$l
, беря текущее число, его строковое и беря его.Length
.Наконец, мы помещаем
$x
,$y
и$x
снова в конвейер, и вывод неявный. Поскольку.ToString()
разделителем по умолчанию для массива при печати в STDOUT является символ новой строки, мы получаем его бесплатно.пример
источник
PHP 265 байт
Un-golfed:
Python 278 байт
источник
Рубин, 120 байт
Возвращает многострочную строку.
Попробуйте онлайн!
источник
Matlab, 223 символа, 226 байтов
Развернулся и прокомментировал:
источник
PHP,
135124123120 байтИспользуя преимущества неявных типов и переменных переменных,
треть кода (37 байт) уходит в пробелы, 64 байта в целом используются для вывода
сломать
источник
Пакетный, 250 байт
Поскольку первая и третья строки одинаковы, нам просто нужно построить две строки. Здесь
d
представляет строку, которая заканчивается последней записью иs
представляет строку, которая заканчивается пробелами; последние четыре строки гарантируют, что они напечатаны в соответствующем порядке.i
это просто счетчик циклов (это немного дешевле, чем обратный отсчет%1
).j
это переключение между удвоением предыдущего числа перед добавлением его к текущему номеру, чтобы получить следующий номер.m
иn
содержать эти цифры.l
кроме того, что он используется как временный для вычисления следующего числа, он также заменяет цифры на пробелыs
;s
а такжеd
обмениваются каждый раз через промежуточную переменнуюt
.источник