Давайте сделаем треугольник


15

Большинство людей знакомы с треугольником Паскаля.

    1
   1 1
  1 2 1
 1 3 3 1
1 4 6 4 1

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

Например, чтобы вычислить ячейку, обозначенную x

   1
  1 1
 2 2 2
4 5 5 4
   x

Мы бы суммировали следующие ячейки

   .
  . .
 2 . 2
. 5 5 .
   x

Делаем нашу новую камеру 14.

задача

Учитывая номер строки ( n ) и расстояние слева ( r ), вычислите и выведите r- ю ненулевую запись слева на n- й строке. (эквивалент по треугольнику Паскаля nCr ). Вы можете предположить, что r меньше n .

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

Контрольные примеры

0,0 -> 1
1,0 -> 1
2,0 -> 2
4,2 -> 14
6,3 -> 106

Вот первая пара строк в форме треугольника:

                  1
                1   1
              2   2   2
            4   5   5   4
          8  12  14  12   8
       16  28  37  37  28  16
     32  64  94  106 94  64  32
   64  144 232 289 289 232 144 64
 128 320 560 760 838 760 560 320 128


Могут ли наши материалы использовать индексирование на основе 1 вместо этого?
Kritixi Lithos

9
@ KritixiLithos Конечно. Это сделает меня грустным, хотя.
Пост Рок Гарф Хантер

Ответы:


8

Желе , 18 17 байт

SṚ0;+Sṭ
1WWÇ⁸¡ṪṙḢ

Использует индексирование на основе 0.

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

Как это устроено

1WWÇ⁸¡ṪṙḢ  Main link. Arguments: n, r

1          Set the return value to 1.
 W         Wrap; yield [1].
  W        Wrap; yield [[1]].
           This is the triangle with one row.
   Ç⁸¡     Call the helper link n times.
           Each iteration adds one row to the triangle.
      Ṫ    Tail; take the last array, i.e., the row n of the triangle.
       ṙ   Rotate row n r units to the left.
        Ḣ  Head; take the first element, i.e., entry r of row n.


SṚ0;+Sṭ    Helper link. Argument: T (triangle)

S          Take the column-wise sums, i.e., sum the ascending diagonals of the 
           centered triangle, left to right.
 Ṛ         Reverse the array of sums. The result is equal to the sums of the 
           descending diagonals of the centered triangle, also left to right.
  0;       Prepend a 0. This is required because the first element of the next row 
           doesn't have a descending diagonal.
     S     Take the column-wise sum of T.
    +      Add the ascending to the descending diagonals.

5

Python 3 , 72 байта

1 байт благодаря Kritixi Lithos.

f=lambda n,r:n>=r>=0and(0**n or sum(f(i,r)+f(i,r+i-n)for i in range(n)))

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


1
Вы можете переставить, чтобы получить это: n>=r>=0andи сохранить байт
Kritixi Lithos

@EinkornEnchanter, если n0, то это дает 1; в противном случае он дает 0. Это как n and ... or 1, но короче.
Утренняя монахиня

Я вижу, хорошее злоупотребление нарушенным поведением тогда +1.
Пост Рок Гарф Хантер


@Arnauld Это не делает это правдой;)
Post Rock

3

ES6, 80 78 байт

p=(n,r,c=0)=>n?(o=>{while(n&&r<n)c+=p(--n,r);while(o*r)c+=p(--o,--r)})(n)||c:1

В бою!

Два байта благодаря Арно.


Вы можете сохранить 2 байта, используя while(n&&r<n)и while(o*r).
Арно

1
Этот ответ совершенно действителен. Итак, кто бы ни проголосовал против, он обязательно должен дать объяснение ... Или это может быть один из этих странных автоматических голосов от Сообщества?
Арно

2

PHP , 94 байта

рекурсивный способ 0-индексирован

function f($r,$c){for($s=$r|$c?$r<0?0:!$t=1:1;$t&&$r;)$s+=f($r-=1,$c)+f($r,$c-++$i);return$s;}

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

PHP , 125 байт

0 индексированные

for(;$r<=$argv[1];$r++)for($z++,$c=~0;++$c<$z;$v+=$l)$x[$c]+=$t[+$r][$c]=$l=($v=&$y[$r-$c])+$x[$c]?:1;echo$t[$r-1][$argv[2]];

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

PHP> = 7,1, 159 байт

0 индексируется для строк старше 50

for([,$m,$n]=$argv;$r<=$m;$r++)for($z++,$c=0;$c<$z;$v=bcadd($v,$l),$x[$c]=bcadd($x[$c],$l),$c++)$t[+$r][$c]=$l=bcadd(($v=&$y[$r-$c]),$x[$c])?:1;echo$t[$m][$n];

1

Python 3 , 61 байт

f=lambda n,r:sum(f(k,r)+f(k,r+k-n)for k in range(n))or~n<-r<1

Это возвращает True для базового случая (0, 0) , что разрешено по умолчанию .

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


~n<-r<1довольно умно, я провел хорошие 10 минут, пытаясь играть в гольф n>=r>=0.
Пост Рок Гарф Хантер

1
На самом деле не короче, но это экономит место. :)
Деннис

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.