Треугольник Кларка


10

Хорошо, я недавно получил небольшой треугольник, так что вот еще один.

Треугольник Кларка - это треугольник, где крайний левый элемент каждой строки равен 1, а крайний правый элемент состоит из кратных 6, которые увеличиваются с увеличением номера строки. Вот визуализация

     1 6
    1 . 12
   1 . . 18
  1 . . . 24
 1 . . . . 30
1 . . . . . 36

Точно так же, как Треугольник Паскаля, все остальные записи являются суммой чисел справа вверху и слева вверху.

Вот первые несколько заполненных строк

          1   6
        1   7  12
      1   8  19  18
    1   9  27  37  24
  1  10  36  64  61  30
1  11  46  100 125 91  36

задача

Учитывая номер строки (начиная с верха) и номер столбца (начиная с первого ненулевого элемента в этой строке), выведите значение в этой конкретной ячейке. Оба входа могут иметь индекс 1 или 0 (вы можете смешивать и сочетать, если хотите). Выход за границы треугольника не определен, и вы можете делать все, что пожелаете, когда запрашиваете эти значения.

Это , цель - минимизировать количество байтов в вашем решении.

OEIS A046902


1
Можем ли мы построить решение с нулем в первом ряду? как в последовательности OEIS
Йорг Хюльсерманн

1
@ JörgHülsermann Так как для этого треугольника, который здесь определен, нет границ, вы можете делать все, что захотите.
Специальный охотник за

Ответы:


7

MATL , 15 байт

[lBB]i:"TTY+]i)

Первый вход - строка на основе 0; второй столбец на основе 1.

Попробуйте онлайн!

объяснение

[lBB]   % Push [1 6 6]
i       % Input: row number (0-based)
:"      % Repeat that many times
  TT    %   Push [1 1]
  Y+    %   Convolution, increasing size. This computes the sum of overlapping
        %   pairs, including the endpoints. So for example [1 6 6] becomes
        %   [1 7 12 6], which will later become [1 8 19 18 6], ...
]       % End
i       % Input: column number (1-based)
)       % Use as index. Implicit display


5

CJam , 22 18 байт

-4 байта благодаря Мартину Эндеру

X6_]ri{0X$+.+}*ri=

Ввод (0-based row) (0-based column)

Попробуйте онлайн!

объяснение

X6_]  e# Push the list [1 6 6]. This is the first row, but each row will have an extra 6 at
      e# the end, which is out of bounds.
ri    e# Push the first input as an integer.
{     e# The following block calculates the next row given a row on top of the stack:
 0X$+ e#  Copy the top list on the stack and prepend 0.
 .+   e#  Element-wise addition with the list before prepending 0. This adds each element of
      e#  with the one to its left, except the initial 1 gets added to 0 and the final number
      e#  gets added to the out-of-bounds 6. The out-of-bounds 6 is unchanged since one list
      e#  is longer.
}*    e# Run this block (row index) times.
ri=   e# Get the (column index)th item of the final list.

Другой способ получения попарных сумм - сдвинуть одну копию влево и использовать .+. Обычно проблема заключается в том, что он сохраняет конечный элемент без его суммирования (что обходится в байтах), но в этом случае это на самом деле экономит байты, потому что тогда вам не нужно добавлять a 6на каждую итерацию. Вы можете сохранить еще больше байтов, потому что сдвиг влево свободен, если вы добавляете только 0одну копию:X6_]ri{0X$+.+}*ri=
Мартин Эндер,

_0\+вместо того 0X$+же количества байтов, если вы предпочитаете.
Мартин Эндер

@MartinEnder О, я вижу, вы получаете дополнительные 6 в конце каждого ряда, который находится за пределами, так что это не имеет значения. Умно, спасибо.
Бизнес кошка



3

Python 3 , 64 60 52 байта

f=lambda r,c:c<2or c>r and r*6or f(r-1,c-1)+f(r-1,c)

Попробуйте онлайн!

Рекурсивное решение с использованием 1-индексации. Выводы «Правда» вместо 1 ради игры в гольф.


Благодаря:

  • @totallyhuman за сохранение 4 байта!
  • @Rod для сохранения 8 байтов!


2
52 байта, заменяющих if / else булевыми операторами и с более гибким выводом
Rod

@ Род, это блестящее решение. Я все еще пытаюсь понять, почему это работает. Я все еще довольно новичок здесь (это только мой второй ответ на сайте), поэтому я не уверен в протоколе: должен ли я включить вашу версию в мой ответ, даже если вы перешли с Python 3 на 2?
Погоня Фогели

3
@icosahedron версия Python в этом случае не имеет значения, так что вам не придётся возражать. Как правило, переключение между версиями Python для использования функций считается нормальным.
Уриэль

@Uriel спасибо за разъяснения.
Погоня Фогели


1

Mathematica, 32 байта

b=Binomial;b[#,#2-1]6+b[#-1,#2]&

вход

[строка, столбец]
[1-индексированный, 0-индексированный]


1

JavaScript (ES6), 38 байт

f=(r,c)=>c?r>c?f(--r,c)+f(r,--c):r*6:1

Сбой для отрицательных столбцов и возвращает кратные значения шести для отрицательных строк или столбцов с большими значениями.


1

C # (.NET Core) , 44 байта

f=(c,r)=>c<=1?1:c>r?6*r:f(c-1,r-1)+f(c,r-1);

Берет столбец, затем строку, оба с 1 индексом. Можно взять строку затем колонку путем замены входов: (r,c). Вернется row * 6для координат за пределами границ справа (т.е. column > row + 1) и 1для координат за пределами слева (т.е. column < 1).


1

PHP , 64 байта

рекурсивная функция

строки 1-индексация столбцов 0-индексация

Выход для строки = 0 и столбца = 0 равен 0, как в последовательности OEIS

function f($r,$c){return$c-$r?$c?f($r-=1,$c-1)+f($r,$c):1:$r*6;}

Попробуйте онлайн!

PHP , 126 байт

строки 1-индексация столбцов 0-индексация

Выход для строки = 0 и столбца = 0 равен 0, как в последовательности OEIS

for(;$r<=$argv[1];$r++)for($z++,$c=~0;++$c<$z;)$t[+$r][$c]=$c<$r?$c?$t[$r-1][$c-1]+$t[$r-1][$c]:1:$r*6;echo$t[$r-1][$argv[2]];

Попробуйте онлайн!


0

R 77 байт

Reduce(function(x,y)zoo::rollsum(c(0,x,6),2),double(scan()-1),c(1,6))[scan()]

Требуется zooбиблиотека; читает из стандартного ввода (входные данные разделены двумя символами новой строки) и возвращает значение с NAвыбором за пределами границ.

Попробуйте онлайн!


0

Желе , 13 байт

,"’U0¦c/x6,1S

Монадическая ссылка принимая список [row, entry](0 индексации для записей, 1 индексации для строк), возвращая значение.

Попробуйте онлайн!

Как?

,"’U0¦c/x6,1S - Link: list of numbers, [row, entry]
  ’           - decrement     -> [row-1, entry-1]
 "            - zip with:
,             -   pair        -> [[row, row-1], [entry, entry-1]]
     ¦        - sparse application of:
   U          -   upend
    0         - for indexes: 0 -> [[row, row-1], [entry-1, entry]]
       /      - reduce by:
      c       -   choose       -> [(row choose entry-1), (row-1 choose entry)]
         6,1  - 6 paired with 1 = [6,1]
        x     - times        i.e. [a, a, a, a, a, a, a, b]
            S - sum            -> 6*(row choose entry-1) + (row-1 choose entry)
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.