Ромб Паскаля (который на самом деле является треугольником) получается путем добавления в шаблон:
*
***
x
вместо того
* *
x
Это означает, что каждая ячейка является суммой трех ячеек в строке непосредственно над ней и одной ячейки в ряду 2 над ней. Точно так же, как треугольник Паскаля, в нулевом ряду есть один, 1
который генерирует треугольник.
Вот первая пара строк ромба Паскаля
1
1 1 1
1 2 4 2 1
1 3 8 9 8 3 1
задача
С учетом номера строки (начиная с верха) и номера столбца (начиная с первого ненулевого элемента в этой строке) выведите значение в этой конкретной ячейке. Оба входа могут быть либо 1, либо 0 проиндексированы (вы можете смешивать и сочетать, если хотите).
Это код-гольф, поэтому вы должны стремиться к тому, чтобы размер файла вашего исходного кода был как можно меньше.
Ответы:
Haskell ,
5955 байтРомб Паскаля? Больше похоже на ромб Хаскелла! я прав?
4 байта сохранены благодаря Эрджану Йохансену
Я думал, что я должен попробовать свои собственные проблемы и попрактиковаться в своем Хаскеле. Надеюсь, это вдохновит больше людей ответить на этот вопрос.
Попробуйте онлайн!
объяснение
Это немного устарело с последним гольфом
Вместо расчета
Мы рассчитываем
Это наклоняет весь наш треугольник, чтобы стать
Это выстраивает в ряд все наши строки, упрощая индексацию n-го элемента любого столбца. Затем мы определяем наши базовые случаи.
Нулевой ряд все нули, так
Есть один
1
в позиции,1,1
поэтому мы определяем, чтоИ мы определяем оставшуюся часть первого ряда также нулями
Затем мы определяем общий случай рекурсивно, используя шаблон, описанный выше:
источник
n!k=sum[(n-2)!(k-2)+sum(map((n-1)!)[k-2..k])|n>1]
.Паскаль , 122 байта
Ну, это ромб Паскаля .
37 байтов сохранено благодаря @manatwork
Попробуйте онлайн!
источник
if
состояния бессмысленны. (1-го числаif
вы сохраняете 2 символа, а 2-гоif
символа 1, не оставляя пробела междуthen
ключевым словом и предыдущей цифрой.) О, и переменная r совершенно не нужна.;
доfunction
«сend
.>=
<=
? Мне все еще нужно сохранитьif n=0
function f(n,k:integer):integer;begin f:=1-Ord((k<0)or(k>n*2));if n>0then f:=f(n-1,k-2)+f(n-1,k-1)+f(n-1,k)+f(n-2,k-2)end;
PHP , 86 байт
рекурсивным способом только функция строки и столбца 0-проиндексированы
Попробуйте онлайн!
PHP , 114 байт
рекурсивный способ полной строки программы и столбца 0-Indexed
Попробуйте онлайн!
PHP , 129 байт
строка и столбец 0-проиндексированы
Попробуйте онлайн!
источник
Желе ,
222019 байтПринимает основанную на 0 пару индексов в качестве аргумента командной строки.
Попробуйте онлайн!
источник
MATL ,
222019 байтовОба входа основаны на 0.
Попробуйте онлайн!
объяснение
Позвольте
r
иc
обозначить два входа, указав 0 и строки и столбца соответственно.Каждая новая строка в ромбе Паскаля может быть построена из матрицы, содержащей предыдущие две строки, путем свертки с ядром
[1 1 1; 0 1 0]
и сохранения двух последних строк результата. Это делаетсяr
раз, начиная с матрицы1
.Оказывается, короче использовать ядро
[0 1 0; 1 1 1; 0 1 0]
, которое является предопределенным литералом. Это создает дополнительную строку, которая будет отброшена.Рассмотрим, к примеру
r = 3
, чтобы были3
итерации.Начиная с
свертка
[0 1 0; 1 1 1; 0 1 0]
даетСохранение двух последних строк (в данном случае всей матрицы) и их замена дает
Свертывание выше
[0 1 0; 1 1 1; 0 1 0]
даетМатрица, образованная из двух последних замененных строк:
Это содержит новую строку внизу, а предыдущий расширен нулями.
Свертка снова дает
Взяв последние два ряда поменялись местами дает
После того как
r
итерации выполнены, выходные данные содержатся в последней строке окончательной матрицы. Например, дляc = 2
(на основе 0) результат будет8
. Вместо индексации последней строки и нужного столбца можно использовать трюк, который использует симметрию каждой строки: конечная матрица транспонируетсяи его
-c
-й элемент взят. При этом используется линейное индексирование, то есть матрица индексируется одним индексом в порядке старших столбцов . Поскольку индексирование является модульным ,0
-entry - это правый нижний угол (значение1
), а-2
-я запись - на два шага выше (значение8
).источник
Пари / ГП , 60 байт
Попробуйте онлайн!
источник
Haskell , 74 байта
Попробуйте онлайн!
Позвоните
n # m
, гдеn
строка иm
столбец.источник
m<=2*n&&m>=0
может быть простоn>0
.Mathematica, 56 байт
Чистая функция, принимающая два целочисленных аргумента (первый ряд, второй столбец) и возвращающая целое число. Работает и для отрицательных целочисленных аргументов, возвращая
0
. Довольно простая рекурсивная структура:If[#<1,Boole[##==0],...]
определяет поведение в базовом случае для 0-й строки (и выше), а такжеSum[#0[#-i,#2-j],{i,2},{j,2i-2,2}]
реализует рекурсивное определение.источник
Python 2 ,
706665 байтПопробуйте онлайн!
источник
JavaScript (ES6), 68 байт
источник
Mathematica, 53 байта
Использование производящей функции.
источник
Python 3 ,
8284 байтаЭто рекурсивная реализация с 1-индексированными строками и столбцами. (С технической точки зрения необходимо получить
f=
перед, кто-то, дайте мне знать, если я должен изменить его на 84 байта. Все еще новый и не уверен на 100% в правилах.)При этом используется рекурсивная формула, найденная на странице OEIS , но со
k
смещенной влево для правильного выравнивания. По совпадению,sum(f(n-1,k-i)for i in(0,1,2))
такой же размер какf(n-1,k)+f(n-1,k-1)+f(n-1,k-2)
. Вся функция - этоand or
трюк Питона , где первое условие проверяет, находится ли k внутри треугольника, а не на границе, и в этом случае используется рекурсивная формула. Если это не так,or
возвращается часть после , которая проверяет,k
находится ли она(1, 2*n-1)
, то есть на границе, возвращаяTrue
иFalse
.k+1in(2,2*n)
на один байт корочеk in(1,2*n-1)
. Оборачивая это в скобках и помещая+
перед ними, преобразуется в целое число, что и нужно.Попробуйте онлайн!
источник
f=
.True
а не1
потому, что он ведет себя как1
Python. Это позволяет вам удалить+(...)
в конце. Я понимаю, что если вы не хотите этого делать, потому что это сделает вывод немного странным, это вариант.Java (OpenJDK 8) , 87 байт
Попробуйте онлайн!
Сначала я был доволен итеративным методом с 160 байтами ... Хммм ... давайте просто забудем об этом, хорошо?
источник
Python 3 , 75 байт
Это рекурсивная лямбда, которая принимает столбец и строку как целые числа с 0 индексами.
Вот (немного) более читаемая версия с функцией печати:
источник