Tam giác xen kẽ của Pascal


21

Tam giác của Pascal được tạo bằng cách bắt đầu bằng 1và có mỗi hàng được hình thành từ các bổ sung liên tiếp. Thay vào đó, ở đây, chúng ta sẽ tạo thành một hình tam giác bằng cách nhân và cộng xen kẽ.

Chúng tôi bắt đầu hàng 1chỉ với một mình 1. Sau đó, phép cộng được thực hiện trên các hàng lẻ và phép nhân được thực hiện trên các hàng chẵn (1 chỉ mục). Khi thực hiện bước bổ sung, giả sử các khoảng trắng bên ngoài tam giác được lấp đầy bằng 0s. Khi thực hiện bước nhân, giả sử rằng bên ngoài chứa đầy 1s.

Đây là tam giác đầy đủ xuống còn 7 hàng. Các *hoặc +trên các chương trình còn lại những gì bước được thực hiện để tạo ra hàng đó.

1                1
2 *            1   1
3 +          1   2   1
4 *        1   2   2   1
5 +      1   3   4   3   1
6 *    1   3  12  12   3   1
7 +  1   4  15  24  15   4   1

Thử thách

Cho đầu vào n, đầu ra nhàng thứ của tam giác này.

Quy tắc

  • Thay vào đó, bạn có thể chọn 0-index, nhưng sau đó vui lòng nhận ra rằng các hàng cộng và nhân phải lật, để tạo ra tam giác chính xác giống như trên. Vui lòng nêu trong trình của bạn nếu bạn chọn để làm điều này.
  • Đầu vào và đầu ra có thể được coi là phù hợp với kiểu số nguyên của ngôn ngữ của bạn.
  • Đầu vào và đầu ra có thể được đưa ra trong bất kỳ định dạng thuận tiện .
  • Một chương trình đầy đủ hoặc một chức năng được chấp nhận. Nếu một chức năng, bạn có thể trả lại đầu ra thay vì in nó.
  • Nếu có thể, vui lòng bao gồm một liên kết đến một môi trường thử nghiệm trực tuyến để người khác có thể thử mã của bạn!
  • Sơ hở tiêu chuẩn bị cấm.
  • Đây là để áp dụng tất cả các quy tắc chơi golf thông thường và mã ngắn nhất (tính bằng byte) sẽ thắng.

Ví dụ

Hiển thị hai ví dụ có thể có của đầu ra trong số nhiều: danh sách hoặc chuỗi được phân tách bằng dấu cách.

4
[1, 2, 2, 1]

8
"1 4 60 360 360 60 4 1"

2
@totallyhuman Không, điều duy nhất để stdout phải là nhàng thứ.
admBorkBork

Câu trả lời:


16

Pascal , 249 247 233 byte

Chà, đây là tam giác xen kẽ của Pascal .

Lưu 1 byte nhờ @ Mr.Xcoder

function f(n,k:integer):integer;begin if((k<1)or(k>n)or(n=1))then f:=n mod 2 else if n mod 2=0then f:=f(n-1,k-1)*f(n-1,k)else f:=f(n-1,k-1)+f(n-1,k)end;
procedure g(n:integer);var k:integer;begin for k:=1to n do write(f(n,k),' ')end;

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



7

Python 2 , 97 93 86 81 78 byte

-4 byte nhờ Rod. -10 byte nhờ Halvard Hummel.

f=lambda n:n and[[i+j,i*j][n%2]for i,j in zip([n%2]+f(n-1),f(n-1)+[n%2])]or[1]

Chỉ số 0.

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


1
Tốt công việc, tôi đã có một cách tiếp cận (nhiều) lâu hơn . Mặc dù tôi không có thời gian để chơi gôn.
Ông Xcoder

1
Tôi đoán rằng nó map([int.__add__ ,int.__mul__][i%2],[i%2]+a,a+[i%2])sẽ hoạt động (không được thử nghiệm)
Rod


1
Không, đây là đệ quy. Bạn phải bao gồm tên.
Ông Xcoder


5

Thạch , 17 12 byte

µ×+LḂ$?Ḋ1;µ¡

Đây là một chương trình đầy đủ (hoặc liên kết niladic) lấy đầu vào từ STDIN.

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

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

µ×+LḂ$?Ḋ1;µ¡  Main link. No arguments. Implicit argument: 0

          µ¡  Start a monadic chain and apply the ntimes quick to the previous one.
              This reads an integer n from STDIN and executes the previous chain n
              times, with initial argument 0, returning the last result.
µ             Start a monadic chain. Argument: A (array or 0)
       Ḋ          Dequeue; yield A without its first element.
   LḂ$?           If the length of A is odd:
 ×                    Multiply A and dequeued A.
                  Else:
  +                   Add A and dequeued A.
        1;        Prepend a 1 to the result.

5

Python 2 , 96 89 87 byte

s=a=[1]
for i in range(1,input()):a=s+[[k+l,k*l][i%2]for k,l in zip(a[1:],a)]+s
print a

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



@totallyhuman Cảm ơn .. Tôi đã quay lại ...
chính thức

1
Phương pháp thực hiện đột ngột đang dẫn đầu: D
Dead Possum

1
87 byte , khai báo [1].
Ông Xcoder

3

CJam , 25 byte

{1a\{2%!_2$+\{.*}{.+}?}/}

Chỉ số 0.

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

Giải trình

Đây là một khối ẩn danh lấy số từ ngăn xếp và để lại kết quả trên ngăn xếp.

1a                        Push [1].
  \                       Bring the number to the top.
   {                 }/   For reach number 0 .. arg-1, do:
    2%!                    Push 0 if even, 1 if odd.
       _                   Copy that.
        2$+                Copy the list so far and prepend the 0 or 1 to it.
           \               Bring the 0 or 1 back to the top.
            {.*}{.+}?      If 1, element-wise multiplication. If 0, element-wise addition.

Chờ đợi 2%!nên đẩy 1 nếu chẵn và 0 nếu lẻ, không?
Trái cây Esolanging

3

Toán học, 92 byte

(s={i=1};While[i<#,s=Flatten@{1,{Tr/@#,Times@@@#}[[i~Mod~2+1]]&@Partition[s,2,1],1};i++];s)&

Hãy thử trực tuyến! (để làm việc trên toán học "Tr" được thay thế bằng "Tổng")


3

Haskell , 76 72 byte

Giải pháp 0 chỉ mục:

(p!!)
p=[1]:[zipWith o(e:l)l++[1]|(l,(o,e))<-zip p$cycle[((*),1),((+),0)]]

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

Giải trình

p đệ quy định nghĩa tam giác xen kẽ, trường hợp cơ sở / phần tử đầu tiên của nó là [1]

p=[1]:[                                                            ]

Sau đó, nó xây dựng tam giác bằng cách lấy dòng trước ( l). Để biết phải làm gì với nó, chúng ta cần theo dõi toán tử chính xác ( o) và phần tử trung tính tương ứng ( e):

                           |(l,(o,e))<-zip p$cycle[((*),1),((+),0)]

Từ việc này, xây dựng dòng mới bằng cách sao chép dòng và đối với một bản sao, chúng tôi thêm phần tử trung tính, nén chúng với toán tử và nối thêm 1:

       zipWith o(e:l)l++[1]

3

R , 108 98 byte

-10 byte bằng cách thay thế dấu nhân thực tế bằng dấu cộng. Xin hãy tha thứ cho tôi.

f=function(n){if(n<3)return(rep(1,n))else{v=f(n-1)};if(n%%2)`*`=`+`;return(c(1,v[3:n-2]*v[-1],1))}

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

Khá hài lòng với phương pháp chung (lần đầu tiên tôi có biệt danh là người nguyên thủy) nhưng tôi chắc chắn rằng việc đánh gôn đã được thực hiện trên đó, đặc biệt là với việc xử lý các trường hợp lúng túng trong đó n <3 dẫn đến rất nhiều trò chơi.


85 byte . Tôi thực sự thích giải pháp của bạn với `*`=`+`! khá thông minh. Phần còn lại của những cải tiến của tôi chỉ là các kỹ thuật chơi gôn tiêu chuẩn, tôi sẽ vui lòng giải thích theo yêu cầu của bạn :)
Giuseppe

80 byte . Tôi lấy cảm hứng từ ghi chú của bạn về việc xử lý các trường hợp trong đón<3
Giuseppe

2

Husk , 17 16 byte

!G₅;1¢e*+
:1Sż⁰t

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

Một giải pháp 1 chỉ mục.

Giải trình

Dòng đầu tiên là hàm chính, gọi hàm helper trên dòng thứ hai. Hàm trợ giúp thường được gọi với , nhưng trong trường hợp này tôi đang sử dụng tính năng nhãn tràn của Husk: nếu bạn tham khảo một dòng N trong chương trình có M <N dòng, bạn nhận được dòng N mod M với chức năng sửa đổi M / N áp dụng cho nó. Hàm sửa đổi thứ hai là flip, vì vậy tôi đang sử dụng để lật các đối số của hàm trợ giúp mà không có chi phí byte bổ sung.

Đây là chức năng của người trợ giúp.

:1Sż⁰t  Takes a function f and a list x.
   ż    Zip preserving elements of longer list
    ⁰   using function f
  S  t  x and its tail,
:1      then prepend 1.

Đây là chức năng chính.

!G₅;1¢e*+  Takes a number n.
      e*+  2-element list of the functions * and +
     ¢     repeated infinitely.
 G         Left scan this list
  ₅        using the flipped helper function
   ;1      with initial value [1].
!          Get n'th element.

2

C # (.NET Core) , 143 134 128 byte

-4 byte nhờ Phaeze
-5 byte nhờ Zac Faragher
-6 byte nhờ Kevin Cruijssen

n=>{int[]b={1},c;for(int i=0,j;++i<n;b=c)for(c=new int[i+1],c[0]=c[i]=1,j=0;++j<i;)c[j]=i%2<1?b[j-1]+b[j]:b[j-1]*b[j];return b;}

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

Giải trình:

n =>
{
    int[] b = { 1 }, c;               // Create first layer
    for(int i = 0, j; ++i < n; b = c) // Iterate for every layer, replace last layer with a new one
        for(c = new int[i+1],         // Create new layer
            c[0] = c[i] = 1,          // First and last elements are always 1
            j = 0;
            ++j < i; )                // Replace every element (besides 1st and last)...
                c[j] = i % 2 == 0 ?
                    b[j - 1] + b[j] : // ... with addition...
                    b[j - 1] * b[j];  // ... or multiplication of two from previous layers
    return b;                         // Return latest layer
};

Bạn sẽ có thể thay đổi khởi tạo mảng b của mình var b=new[]{1};và trình biên dịch sẽ xác định loại mảng cho bạn.
JustinM - Phục hồi Monica

1
Một cách khác để xây dựng lớp đầu tiên là int[]b={1};- 11 byte so với 20 hoặc 16 như trong đề xuất của @Phaeze
Zac Faragher

1
@ZacFaragher và Phaeze cảm ơn bạn!
Grzegorz Puławski

1
Tôi biết đã khá lâu rồi, nhưng bạn có thể chơi thêm 6 byte nữa : n=>{int[]b={1},c;for(int i=0,j;++i<n;b=c)for(c=new int[i+1],c[0]=c[i]=1,j=0;++j<i;)c[j]=i%2<1?b[j-1]+b[j]:b[j-1]*b[j];return b;}. Tôi đã kết hợp cnhư thế này int[]b={1},c;; rút ngắn i%2==0lại i%2<1; Và loại bỏ dấu ngoặc của vòng lặp bằng cách đặt mọi thứ vào bên trong.
Kevin Cruijssen

Tuyệt quá! Cảm ơn @KevinCruijssen
Grzegorz Puławski


1

Bình , 22 byte

Đã tiết kiệm được hàng tấn byte nhờ @FryAmTheEggman ! Các giải pháp ban đầu là dưới đây.

u++1@,+VGtG*VGtGlG1Q[1

Full Test Suite (0 chỉ mục).

Bình dương , 40 38 36 35 byte

Điều này cảm thấy waaaaaaaay quá hợp lý lâu. Đề nghị được chào đón.

K]1VStQ=K++]1m@,sd*hded%N2C,KtK]1;K

Kiểm tra bộ hoặc thử trực tuyến!


Sử dụng giảm dường như ngắn hơn nhiều . Tôi cũng không tin điều này là tối ưu, tôi nghĩ phụ 20 có thể quản lý được không?
FryAmTheEggman

@FryAmTheEggman Xem lịch sử sửa đổi của tôi. Tôi nói rằng tôi đang cố gắng tìm một cách giải quyết với giảm u(nhưng không thể tìm ra). Cảm ơn!
Ông Xcoder

Nếu Pyth sẽ tích hợp sẵn phần bổ sung ...
Ông Xcoder



1

Toán học, 70 byte

Fold[#2@@@Partition[#,2,1,{-1,1},{}]&,{1},PadRight[{},#,{1##&,Plus}]]&

Hãy thử nó tại hộp cát Wolfram ! Thật không may, nó không hoạt động trong Toán học. Đó là 0 chỉ mục.

Giải thích: Partition[#,2,1,{-1,1},{}]lấy một danh sách và trả về tất cả các danh sách con hai yếu tố, cộng với danh sách 1 yếu tố cho đầu và cuối - ví dụ, {1,2,3,4}trở thành {{1}, {1,2}, {2,3}, {3,4}, {4}}. PadRight[{},#,{1##&,Plus}]tạo một danh sách xen kẽ 1##&(hiệu quả Times) và Plus, có độ dài là số đầu vào. Sau đó Foldliên tục áp dụng hàm phân vùng với Pluses và Timeses được áp dụng cho nó, để tạo các hàng của tam giác.




0

TI-Basic (TI-84 Plus CE), 100 byte

Prompt X
{1→M
For(A,2,X
LM→L
A→dim(M
For(B,2,A–1
If A/2=int(A/2
Then
LL(B–1)LL(B→LM(B
Else
LL(B–1)+LL(B→LM(B
End
End
1→LM(dim(LM
End
LM

1 chỉ mục, nhắc người dùng nhập liệu và in danh sách chứa nhàng thứ ba của Tam giác xen kẽ của Pascal.

Trong khi lặp: L M là hàng hiện tại và L L là hàng trước.

TI-Basic là một ngôn ngữ được mã hóa . Tất cả các mã thông báo được sử dụng ở đây là mã thông báo một byte.

Tôi nghĩ rằng tôi có thể chơi gôn này hơn nữa bằng cách sửa đổi M tại chỗ từ cuối.

Giải trình:

Prompt X            # 3 bytes; get user input, store in X
{1→M                # 5 bytes, store the first row into LM
For(A,2,X           # 7 bytes, Loop X-1 times, with A as the counter, starting at 2
LM→L                # 5 bytes, copy list M into list L
A→dim(M             # 5 bytes, extend M by one
For(B,2,A–1         # 9 bytes, for each index B that isn't the first or last...
If A/2=int(A/2      # 10 bytes,    if A is even...
Then                # 2 bytes,     then...
LL(B–1)LL(B→LM(B     # 17 bytes,        the Bth item in this row is the Bth times the (B-1)th of the previous row
Else                # 2 bytes,     else...
LL(B–1)+LL(B→LM(B    # 18 bytes,        the Bth item in this row is the Bth plus the (B-1)th of the previous row
End                 # 2 bytes,     endif
End                 # 2 bytes,  endfor
1→LM(dim(LM         # 9 bytes, the last item is always 1
End                 # 2 bytes, endfor
LM                  # 2 bytes, Implicitly print the final row


0

JavaScript (ES6), 71 69 66 byte

f=n=>n?(p=f(n-1),[...p.map((v,i)=>i--?n%2?v*p[i]:v+p[i]:1),1]):[1]

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

Chỉ số 0.
-3 byte bởi @Arnauld

f=n=>n?(p=f(n-1),[...p.map((v,i)=>i--?n%2?v*p[i]:v+p[i]:1),1]):[1]

for (var i = 0; i < 10; ++i) {
  console.log(JSON.stringify(f(i)));
}


1
Sử dụng một ternary nên tiết kiệm 3 byte: i--?n%2?v*p[i]:v+p[i]
Arnauld
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.