Hình thoi của Pascal


20

Hình thoi của Pascal (thực ra là một hình tam giác) có được bằng cách thêm vào mẫu:

  *
 ***
  x

thay vì

* *
 x

Điều này có nghĩa là mỗi ô là tổng của ba ô trên hàng ngay phía trên nó và một ô trên hàng 2 phía trên nó. Giống như tam giác của Pascal, hàng zeroth có một hình duy nhất 1trên đó tạo ra tam giác.

Dưới đây là vài hàng đầu tiên của Hình thoi của Pascal

      1
    1 1 1
  1 2 4 2 1
1 3 8 9 8 3 1

Bài tập

Cho một số hàng (bắt đầu từ đầu) và một số cột (bắt đầu từ mục khác không đầu tiên trên hàng đó) xuất giá trị tại ô cụ thể đó. Cả hai đầu vào có thể là 1 hoặc 0 được lập chỉ mục (bạn có thể trộn và khớp nếu bạn muốn).

Đây là vì vậy bạn nên đặt mục tiêu làm cho kích thước tệp của mã nguồn càng nhỏ càng tốt.

OEIS A059317



bạn nên đặt mục tiêu làm cho kích thước tệp của mã nguồn của bạn càng nhỏ càng tốt nếu tôi đặt mã của mình làm đối số dòng lệnh thì sao? : P
Erik the Outgolfer

Đã đi tìm kiếm các phím tắt và rõ ràng arxiv.org/abs/1504.04404 nói rằng việc tính toán kết quả trực tiếp là không thể sử dụng cho mã golf.
JollyJoker

Câu trả lời:


12

Haskell , 59 55 byte

Hình thoi của Pascal? Giống như hình thoi của Haskell! vô vọng?

4 byte được lưu nhờ vào Ørjan Johansen

Tôi nghĩ tôi sẽ tự giải quyết vấn đề của mình và thực hành Haskell. Hy vọng điều này sẽ truyền cảm hứng cho nhiều người hơn để trả lời điều này.

1!1=1
n!k=sum[(n-2)!(k-2)+sum(map((n-1)!)[k-2..k])|n>1]

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

Giải trình

Đây là một chút lỗi thời với golf mới nhất

Thay vì tính toán

  *
 ***
  x

Chúng tôi tính toán

*
***
  x

Điều này làm cho toàn bộ tam giác của chúng ta trở thành

1
1 1 1
1 2 4 2 1
1 3 8 9 8 3 1

Điều này sắp xếp tất cả các hàng của chúng tôi để dễ dàng lập chỉ mục mục thứ n của bất kỳ cột nào. Sau đó chúng tôi xác định các trường hợp cơ sở của chúng tôi.

Hàng zeroth là tất cả các số không

0!_=0

Có một 1vị trí duy nhất 1,1để chúng tôi xác định rằng

1!1=1

Và chúng tôi xác định phần còn lại của hàng đầu tiên là số không

1!_=0

Sau đó, chúng tôi xác định trường hợp chung đệ quy bằng cách sử dụng mẫu được mô tả ở trên:

n!k=(n-2)!(k-2)+(sum$map((n-1)!)[k-2..k])

Đánh tôi đi! Cái này cũng sạch hơn tôi nhiều.
Julian Wolf

@JulianWolf Xin lỗi về điều đó, khi tôi đăng bài này, có vẻ như không ai khác ngoài Jorg đang làm vấn đề. Tôi vẫn muốn xem giải pháp của bạn.
Phù thủy lúa mì

1
Bạn có thể lưu bốn byte với n!k=sum[(n-2)!(k-2)+sum(map((n-1)!)[k-2..k])|n>1].
Ørjan Johansen

10

Pascal , 122 byte

Chà, đó hình thoi của Pascal .

37 byte được lưu nhờ @manatwork

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;

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


Dấu ngoặc quanh toàn bộ ifđiều kiện là vô nghĩa. (Vào ngày 1, ifbạn lưu 2 ký tự, trên ifký tự 1 2 bằng cách không để khoảng trống giữa thentừ khóa và chữ số trước.) Ồ, và biến r là hoàn toàn không cần thiết.
manatwork

Con vật kỳ lạ mà Pascal trên Ideone. Chưa bao giờ thấy dấu ngoặc kép được phân tách chuỗi trong bất kỳ biến thể Pascal nào trước đây. Một điều nữa bạn có thể loại bỏ: sự ;trước khi function's end.
manatwork

@manatwork yea, bây giờ khi bạn đề cập đến nó, tất cả các biên tập viên trực tuyến khác đã phàn nàn về nó
Uriel

@manatwork Tôi không chắc là tôi hiểu. sẽ không kéo dài mã với >= <=? Tôi vẫn cần bảo tồnif n=0
Uriel

Xin lỗi @Uriel, tôi không có phiên bản đó nữa. Hiện tại tôi đang ở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;
manatwork

7

PHP , 86 byte

cách đệ quy chỉ hàng chức năng và cột 0 - Được lập chỉ mục

function f($r,$c){return$r|$c?$r<0?0:f($r-=1,$c)+f($r,$c-1)+f($r,$c-=2)+f($r-1,$c):1;}

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

PHP , 114 byte

cách đệ quy đầy đủ hàng chương trình và cột 0 - Được lập chỉ mục

<?=f(...$_GET);function f($r,$c){return$r|$c?$r<0|$c<0|$c>2*$r?0:f($r-=1,$c)+f($r,$c-1)+f($r,$c-=2)+f($r-1,$c):1;}

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

PHP , 129 byte

hàng và cột 0 - Được lập chỉ mục

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

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


và +1 để thực sự cải thiện nó :)
Uriel


3

MATL , 22 20 19 byte

Ti:"2Y6Y+FT_Y)]!i_)

Cả hai đầu vào đều dựa trên 0.

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

Giải trình

Đặt rcbiểu thị hai đầu vào, chỉ định hàng và cột dựa trên 0 tương ứng.

Mỗi hàng mới trong hình thoi của Pascal có thể được xây dựng từ ma trận chứa hai hàng trước bằng cách kết hợp với kernel [1 1 1; 0 1 0]và giữ hai hàng cuối cùng của kết quả được hoán đổi. Điều này được thực hiện rlần, bắt đầu từ ma trận 1.

Hóa ra là ngắn hơn để sử dụng kernel [0 1 0; 1 1 1; 0 1 0], đó là một nghĩa đen được xác định trước. Điều này tạo ra một hàng thêm, sẽ được loại bỏ.

Xem xét ví dụ r = 3, vì vậy có 3lặp đi lặp lại.

  1. Bắt đầu từ

    1
    

    tích chập với [0 1 0; 1 1 1; 0 1 0]cho

    0 1 0
    1 1 1
    0 1 0
    

    Giữ hai hàng cuối cùng (trong toàn bộ ma trận, trong trường hợp này) và hoán đổi chúng cho

    0 1 0
    1 1 1
    
  2. Kết luận ở trên với [0 1 0; 1 1 1; 0 1 0]cho

    0 0 1 0 0
    0 1 1 1 0
    1 2 4 2 1
    0 1 1 1 0
    

    Ma trận được hình thành bởi hai hàng cuối cùng được hoán đổi là

    0 1 1 1 0
    1 2 4 2 1
    

    Cái này chứa hàng mới ở phía dưới và hàng trước được mở rộng bằng số không.

  3. Năng suất lại

    0 0 1 1 1 0 0
    0 1 2 3 2 1 0
    1 3 8 9 8 3 1
    0 1 2 4 2 1 0
    

    Lấy hai hàng cuối cùng hoán đổi cho

    0 1 2 4 2 1 0
    1 3 8 9 8 3 1
    

Sau khi rlặp lại xong, đầu ra được chứa trong hàng cuối cùng của ma trận cuối cùng. Ví dụ: đối với c = 2(dựa trên 0) kết quả sẽ là 8. Thay vì lập chỉ mục cho hàng cuối cùng và cột mong muốn, có thể sử dụng một mẹo để khai thác tính đối xứng của mỗi hàng: ma trận cuối cùng được hoán vị

0 1
1 3
2 8
4 9
2 8
1 3
0 1

-cphần tử thứ của nó được thực hiện. Điều này sử dụng lập chỉ mục tuyến tính, nghĩa là ma trận được lập chỉ mục bởi một chỉ mục theo thứ tự chính của cột . Vì lập chỉ mục là mô-đun , 0-entry là góc dưới bên phải (giá trị 1) và -2mục -th là hai bước trên (giá trị 8).

T       % Push true
i       % Input row number
:"      % Do the following that many times
  2Y6   %   Push predefined literal [0 1 0; 1 1 1; 0 1 0]
  Y+    %   2D convolution, increasing size
  FT_   %   Push [0 -1]
  Y)    %   Matrix with rows 0 (last) and -1 (second-last), in that order
]       % End
!       % Transpose
i       % Input: colun number
_       % Negate
)       % Entry with that index. Implicitly display



2

Toán học, 56 byte

If[#<1,Boole[##==0],Sum[#0[#-i,#2-j],{i,2},{j,2i-2,2}]]&

Hàm thuần túy lấy hai đối số nguyên (hàng đầu tiên, cột thứ hai) và trả về một số nguyên. Làm việc cho các đối số nguyên âm là tốt, trả về 0. Một cấu trúc đệ quy khá đơn giản: If[#<1,Boole[##==0],...]xác định hành vi trường hợp cơ sở cho hàng thứ 0 (và ở trên), trong khi Sum[#0[#-i,#2-j],{i,2},{j,2i-2,2}]thực hiện định nghĩa đệ quy.



1

JavaScript (ES6), 68 byte

f=(y,x)=>x<0|x>y+y?0:x>0&x<y+y?f(--y,x)+f(y,--x)+f(y,--x)+f(--y,x):1

1

Toán học, 53 byte

D[1/(1-x(1+y+y^2(1+x))),{x,#},{y,#2}]/#!/#2!/.x|y->0&

Sử dụng hàm tạo.


0

Python 3 , 82 84 byte

Đây là một triển khai đệ quy với các hàng và cột được lập chỉ mục 1. (Về mặt kỹ thuật cần một cái f=ở phía trước, ai đó cho tôi biết nếu tôi nên thay đổi nó thành 84 byte. Vẫn còn mới và không chắc chắn 100% về các quy tắc.)

Công cụ này sử dụng công thức đệ quy được tìm thấy trên trang OEIS , nhưng với công thức được kdịch chuyển sang bên trái để xếp hàng đúng cách. Thật trùng hợp, sum(f(n-1,k-i)for i in(0,1,2))có cùng kích thước với f(n-1,k)+f(n-1,k-1)+f(n-1,k-2). Toàn bộ chức năng là Python and orlừa, nơi kiểm tra điều kiện đầu tiên nếu k là bên trong tam giác không nằm trong ranh giới, trong trường hợp này công thức đệ quy được sử dụng. Nếu không, phần sau orđược trả về, phần này sẽ kiểm tra nếu knằm trong (1, 2*n-1), tức là trên đường biên, trả về TrueFalse. k+1in(2,2*n)ngắn hơn một byte so với k in(1,2*n-1). Gói nó trong ngoặc đơn và đặt +phía trước chuyển thành số nguyên, đó là những gì cần thiết.

f=lambda n,k:2*n-1>k>1and sum(f(n-1,k-i)for i in(0,1,2))+f(n-2,k-2)or+(k+1in(2,2*n))

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


Hàm đệ quy cần f=.
Thuật sĩ lúa mì

Trong khi cá nhân tôi không đồng ý với nó theo này đồng thuận meta hơi bị chôn vùi, bạn có thể đầu ra Truethay vì 1bởi vì nó hoạt động như 1để python. Điều này cho phép bạn loại bỏ +(...)ở cuối. Tôi hiểu nếu bạn không muốn làm điều này, bởi vì nó sẽ làm cho đầu ra trông hơi lạ, đó là một lựa chọn.
Phù thủy lúa mì

@WheatWizard Wow thật thú vị. Cảm ơn vì tiền hỗ trợ.
C McAvoy


0

Python 3 , 75 byte

Đây là một lambda đệ quy lấy cột và hàng dưới dạng số nguyên 0.

p=lambda r,c:(r<0 or((c==0)|p(r-1,c-2)+p(r-1,c)+p(r-1,c-1)+p(r-2,c-2))+1)-1

Đây là phiên bản (hơi) dễ đọc hơn với chức năng in:

p = lambda r,c:(r<0 or ((c==0) | p(r-1,c-2)+p(r-1,c)+p(r-1,c-1)+p(r-2,c-2))+1)-1

def pp(r):
    ml = len(str(p(r,r)))+1
    for i in range(0, r):
            a=" "*ml*(r-i)
            for j in range(0,i*2 + 1):
                    a+=str(p(i,j))+(" "*(ml-len(str(p(i,j)))))
            print(a)
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.