Hãy làm một hình tam giác


15

Hầu hết mọi người đều quen thuộc với tam giác của Pascal.

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

Tam giác của Pascal là một máy tự động trong đó giá trị của một ô là tổng của các ô ở phía trên bên trái và phía trên bên phải. Bây giờ chúng ta sẽ định nghĩa một tam giác tương tự. Thay vì chỉ lấy các ô ở phía trên bên trái và phía trên bên phải, chúng ta sẽ đưa tất cả các ô dọc theo hai dòng vô hạn kéo dài sang phía trên bên trái và phía trên bên phải. Giống như tam giác của Pascal, chúng ta bắt đầu với một số 1đệm vô hạn bởi các số 0 và xây dựng xuống từ đó.

Ví dụ để tính ô được ký hiệu là x

   1
  1 1
 2 2 2
4 5 5 4
   x

Chúng tôi sẽ tổng hợp các ô sau

   .
  . .
 2 . 2
. 5 5 .
   x

Làm cho tế bào mới của chúng tôi 14.

Bài tập

Cho một số hàng ( n ) và khoảng cách từ bên trái ( r ) tính toán và xuất ra mục nhập khác không thứ r từ bên trái trên hàng thứ n . (tương đương trên tam giác của Pascal là nCr ). Bạn có thể giả sử rằng r nhỏ hơn n .

Đây là , mục tiêu là giảm thiểu số lượng byte trong giải pháp của bạn.

Các trường hợp thử nghiệm

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

Đây là vài hàng đầu tiên ở dạng tam giác:

                  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


Thay vào đó, các bài nộp của chúng tôi có thể sử dụng lập chỉ mục dựa trên 1 không?
Kritixi Lithos

9
@KritixiLithos Chắc chắn. Nó sẽ làm tôi buồn mặc dù.
Đăng Rock Garf Hunter

Câu trả lời:


8

Thạch , 18 17 byte

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

Sử dụng lập chỉ mục dựa trên 0.

Hãy thử trực tuyến!

Làm thế nào nó hoạt động

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 byte

1 byte nhờ 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)))

Hãy thử trực tuyến!


1
Bạn có thể sắp xếp lại để có được điều này: n>=r>=0andvà lưu một byte
Kritixi Lithos

@EinkornEnchanter nếu nlà 0, thì nó cho 1; mặt khác, nó cho 0. Nó giống như n and ... or 1, nhưng ngắn hơn.
Leaky Nun

Tôi thấy, lạm dụng tốt hành vi bị hỏng sau đó, +1.
Đăng Rock Garf Hunter


@Arnauld Điều đó không thành sự thật;)
Post Rock Garf Hunter

3

ES6, 80 78 byte

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

Trong hành động!

Hai byte nhờ Arnauld.


Bạn có thể lưu 2 byte bằng cách sử dụng while(n&&r<n)while(o*r).
Arnauld

1
Câu trả lời này là hoàn toàn hợp lệ. Vì vậy, bất cứ ai hạ cấp nó chắc chắn sẽ cung cấp một lời giải thích ... Hoặc nó có thể là một trong những downvote tự động kỳ lạ này từ Cộng đồng?
Arnauld

2

PHP , 94 byte

cách đệ quy 0-index

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;}

Hãy thử trực tuyến!

PHP , 125 byte

Chỉ số 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]];

Hãy thử trực tuyến!

PHP> = 7.1, 159 byte

0 - được lập chỉ mục cho các hàng trên 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];


0

Pascal , 145 byte

function f(n,k:integer):integer;var i,r:integer;begin r:=1-Ord((k<0)or(k>n));if n>0 then r:=0;for i:=1 to n do r:=r+f(n-i,k-i)+f(n-i,k);f:=r;end;

Hãy thử trực tuyến!

Sử dụng T(n, r) = T(n-1, r-1) + T(n-1, r)đệ quy.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.