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


15

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

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

Трикутник Паскаля - це автомат, де значення комірки - це сума комірок вліво і вгорі праворуч. Тепер ми будемо визначати подібний трикутник. Замість того, щоб просто взяти клітинки вліво і вгорі праворуч, ми проведемо всі клітини по двох нескінченних лініях, що тягнуться до верхнього лівого і верхнього правого. Так само, як трикутник Паскаля, ми починаємо з 1нескінченного прокладеного нескінченними нулями і будуємо звідти вниз.

Наприклад, для обчислення комірки, позначеної символом an 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 Звичайно. Мені це буде сумно.
Опублікувати Rock Garf Hunter

Відповіді:


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, але коротше.
Leaky Nun

Я бачу, приємне зловживання порушеною поведінкою тоді, +1.
Опублікувати Rock Garf Hunter


@Arnauld Це не робить правдою;)
Опублікувати Rock Garf Hunter

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.
Опублікувати Rock Garf Hunter

1
Насправді коротше, але це економить простір. :)
Денніс

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.