สามเหลี่ยมสลับของ Pascal


21

รูปสามเหลี่ยมของปาสคาลนั้นสร้างขึ้นโดยเริ่มจาก1และทำให้แต่ละแถวเกิดขึ้นจากการต่อเนื่องกัน ตรงนี้แทนเราจะสร้างสามเหลี่ยมโดยสลับการคูณและการบวก

เราเริ่มต้นแถวมีเพียงโดดเดี่ยว1 1หลังจากนั้นจะทำการเพิ่มในแถวคี่และการคูณจะทำบนแถวคู่ (ทำดัชนี 1 ครั้ง) เมื่อดำเนินการตามขั้นตอนเพิ่มเติมให้ถือว่าช่องว่างด้านนอกของรูปสามเหลี่ยมเต็มไปด้วย0s เมื่อดำเนินการขั้นตอนการคูณให้ถือว่าด้านนอกเต็มไปด้วย1s

นี่คือสามเหลี่ยมเต็มรูปแบบลงไป 7 แถว *หรือ+ในรายการที่ยังเหลือขั้นตอนสิ่งที่ได้ดำเนินการในการสร้างแถวนั้น

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

ท้าทาย

ป.ร. ให้ไว้ให้nเอาท์พุทnแถวที่สามของสามเหลี่ยมนี้

กฎระเบียบ

  • คุณอาจเลือกดัชนี 0 แทนได้ แต่โปรดทราบว่าแถวการบวกและการคูณจะต้อง flip-flop เพื่อให้สามเหลี่ยมเดียวกันถูกสร้างขึ้นด้านบน โปรดระบุในการส่งของคุณหากคุณเลือกที่จะทำ
  • อินพุตและเอาต์พุตสามารถสันนิษฐานว่าเหมาะสมกับชนิดจำนวนเต็มดั้งเดิมของภาษาของคุณ
  • อินพุตและเอาต์พุตจะได้รับในรูปแบบที่สะดวกใด
  • ยอมรับได้ทั้งโปรแกรมหรือฟังก์ชั่น หากฟังก์ชั่นคุณสามารถส่งคืนผลลัพธ์มากกว่าการพิมพ์
  • หากเป็นไปได้โปรดรวมลิงค์ไปยังสภาพแวดล้อมการทดสอบออนไลน์เพื่อให้ผู้อื่นสามารถลองใช้รหัสของคุณได้!
  • ช่องโหว่มาตรฐานเป็นสิ่งต้องห้าม
  • นี่คือเพื่อให้ใช้กฎการเล่นกอล์ฟตามปกติทั้งหมดและรหัสที่สั้นที่สุด (เป็นไบต์) ชนะ

ตัวอย่าง

แสดงสองตัวอย่างที่เป็นไปได้ของเอาต์พุตจากหลายรายการ: รายการหรือสตริงที่คั่นด้วยช่องว่าง

4
[1, 2, 2, 1]

8
"1 4 60 360 360 60 4 1"

2
@ โททอลแมนไม่มีสิ่งเดียวที่จะ stdout ควรเป็นnแถวที่
AdmBorkBork

คำตอบ:


16

ปาสคาล , 249 247 233 ไบต์

นี่คือสามเหลี่ยมสลับของ Pascal

บันทึก 1 ไบต์ต้องขอบคุณ @ 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;

ลองออนไลน์!



7

Python 2 , 97 93 86 81 78 ไบต์

-4 ไบต์ต้องขอบคุณ Rod -10 ไบต์ขอบคุณ 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]

0 การจัดทำดัชนี

ลองออนไลน์!


1
ทำได้ดีมากฉันใช้เวลานานกว่านี้มาก แม้ว่าฉันจะไม่มีเวลาเล่นกอล์ฟ
Mr. Xcoder

1
ฉันเดาว่าmap([int.__add__ ,int.__mul__][i%2],[i%2]+a,a+[i%2])ควรใช้งานได้ (ไม่ได้ทดสอบ)
Rod


1
ไม่นี่เป็นแบบเรียกซ้ำ คุณต้องใส่ชื่อ
Mr. Xcoder


5

เยลลี่ , 17 12 ไบต์

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

นี่เป็นโปรแกรมเต็มรูปแบบ (หรือลิงก์ niladic) ที่รับอินพุตจาก STDIN

ลองออนไลน์!

มันทำงานอย่างไร

µ×+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 ไบต์

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

ลองออนไลน์!



@totallyhuman ขอบคุณ .. ฉันรีดมันกลับมา ...
officialaimm

1
วิธีบริหารจัดการแบบฉับพลันกำลังนำ: D
Dead Possum

1
87 ไบต์[1]ประกาศ
Mr. Xcoder

3

CJam , 25 ไบต์

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

0 การจัดทำดัชนี

ลองออนไลน์!

คำอธิบาย

นี่คือบล็อกแบบไม่ระบุชื่อที่รับหมายเลขจากสแต็กและปล่อยผลลัพธ์ไว้บนสแต็ก

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.

รอ2%!ควรกด 1 ถ้าเลขคู่และเป็นเลขคี่ถ้าไม่ใช่,
แยกผลไม้


3

Haskell , 76 72 ไบต์

โซลูชันที่จัดทำดัชนี 0:

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

ลองออนไลน์!

คำอธิบาย

p recursively กำหนดรูปสามเหลี่ยมสลับกรณีฐาน / องค์ประกอบแรกของมันคือ [1]

p=[1]:[                                                            ]

จากนั้นสร้างสามเหลี่ยมโดยการใช้บรรทัดก่อนหน้า ( l) หากต้องการทราบว่าต้องดำเนินการอย่างไรเราจำเป็นต้องติดตามผู้ดำเนินการที่ถูกต้อง ( o) และองค์ประกอบที่เป็นกลาง ( e) ที่เกี่ยวข้อง:

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

จากนี้สร้างบรรทัดใหม่โดยการทำซ้ำบรรทัดและหนึ่งสำเนาเราจะเติมองค์ประกอบที่เป็นกลางให้ซิปพวกเขาด้วยโอเปอเรเตอร์แล้วผนวก 1:

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

3

R , 108 98 ไบต์

-10 ไบต์โดยแทนที่เครื่องหมายทวีคูณจริงด้วยเครื่องหมายบวก กรุณายกโทษให้ฉัน.

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

ลองออนไลน์!

ค่อนข้างพอใจกับวิธีการทั่วไป (ครั้งแรกที่ฉันใช้นามแฝงดั้งเดิม) แต่ฉันแน่ใจว่ามีการตีกอล์ฟที่ต้องทำโดยเฉพาะอย่างยิ่งกับการจัดการกรณีที่ n <3 ซึ่งนำไปสู่การต้มมาก


85 ไบต์ ฉันรักทางออกของคุณจริงๆ`*`=`+`! ค่อนข้างฉลาด ส่วนที่เหลือของการปรับปรุงของฉันเป็นเพียงเทคนิคการเล่นกอล์ฟมาตรฐานซึ่งผมจะมีความสุขที่จะอธิบายตามคำขอของคุณ :)
จูเซปเป้

80 ไบต์ ฉันรับแรงบันดาลใจจากบันทึกย่อของคุณเกี่ยวกับการจัดการกรณีที่n<3
Giuseppe

2

Husk , 17 16 ไบต์

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

ลองออนไลน์!

วิธีแก้ปัญหา 1 ดัชนี

คำอธิบาย

บรรทัดแรกคือฟังก์ชั่นหลักซึ่งเรียกใช้ฟังก์ชันตัวช่วยในบรรทัดที่สอง ฟังก์ชั่นตัวช่วยมักจะถูกเรียกด้วยแต่ในกรณีนี้ฉันใช้คุณสมบัติป้ายกำกับล้นของ Husk: ถ้าคุณอ้างถึงบรรทัดNในโปรแกรมที่มีบรรทัดM <Nคุณจะได้รับบรรทัดN mod Mพร้อมกับฟังก์ชันตัวแก้ไขM / ไม่มีการนำไปใช้กับมัน ฟังก์ชันตัวปรับเปลี่ยนที่สองคือflipดังนั้นฉันใช้เพื่อพลิกอาร์กิวเมนต์ของฟังก์ชันตัวช่วยโดยไม่มีค่าใช้จ่ายไบต์เพิ่มเติม

นี่คือฟังก์ชั่นตัวช่วย

: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.

นี่คือฟังก์ชั่นหลัก

!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 ไบต์

-4 ไบต์ขอบคุณPhaeze
-5 ไบต์ขอบคุณZac Faragher
-6 ไบต์ขอบคุณ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;}

ลองออนไลน์!

คำอธิบาย:

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 ของคุณvar b=new[]{1};และคอมไพเลอร์จะกำหนดประเภทของอาร์เรย์ให้คุณ
JustinM - Reinstate Monica

1
อีกวิธีในการสร้างเลเยอร์แรกคือint[]b={1};- 11 ไบต์เทียบกับ 20 ตามที่เป็นหรือ 16 ตามคำแนะนำของ @Phaeze
Zac Faragher

1
@ZacFaragher และ Phaeze ขอบคุณ!
Grzegorz Puławski

1
ฉันรู้ว่ามันถูกมากในขณะที่ แต่คุณสามารถกอล์ฟ 6 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;}ไบต์เพิ่มเติมได้ที่: ฉันรวมcแบบนี้int[]b={1},c;; สั้นลงi%2==0ไปi%2<1; และลบวงเล็บของห่วงโดยใส่ทุกอย่างไว้ข้างใน
Kevin Cruijssen

ที่ดี! ขอบคุณ @KevinCruijssen
Grzegorz Puławski


1

Pyth , 22 ไบต์

จำนวนไบต์ที่บันทึกไว้ต้องขอบคุณ@FryAmTheEggman ! วิธีแก้ปัญหาเบื้องต้นคือด้านล่าง

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

ชุดทดสอบเต็มรูปแบบ (ดัชนี 0)

Pyth , 40 38 36 35 ไบต์

สิ่งนี้รู้สึกว่าwaaaaaaaayยาวเกินไปอย่างสมเหตุสมผล ข้อเสนอแนะยินดีต้อนรับ

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

ทดสอบห้องชุดหรือลองออนไลน์!


การใช้การลดดูเหมือนจะสั้นกว่ามาก ฉันไม่มั่นใจว่าสิ่งนี้เหมาะสมที่สุดฉันคิดว่า sub 20 สามารถจัดการได้หรือไม่
FryAmTheEggman

@FryAmTheEggman ดูประวัติการแก้ไขของฉัน ฉันบอกว่าฉันพยายามหาวิธีแก้ปัญหาด้วยการลดu(แต่ไม่สามารถหาได้) ขอบคุณ!
Mr. Xcoder

ถ้า Pyth จะมี built-in ผนวกต่อท้าย ...
นาย Xcoder



1

Mathematica, 70 ไบต์

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

ลองที่กล่องWolfram ! มันไม่ทำงานในวิชาคณิตศาสตร์ แต่น่าเสียดายที่ มันคือดัชนี 0

คำอธิบาย: Partition[#,2,1,{-1,1},{}]รับรายการและผลตอบแทนทุกรายการย่อยสององค์ประกอบรวมทั้งรายการที่ 1 องค์ประกอบสำหรับการเริ่มต้นและสิ้นสุด - เช่นกลายเป็น{1,2,3,4} ทำรายการสลับของ(อย่างมีประสิทธิภาพ) และความยาวคือจำนวนอินพุต จากนั้นใช้ฟังก์ชันพาร์ติชันซ้ำ ๆ กับes และes ที่ใช้กับมันเพื่อสร้างแถวของสามเหลี่ยม{{1}, {1,2}, {2,3}, {3,4}, {4}}PadRight[{},#,{1##&,Plus}]1##&TimesPlusFoldPlusTimes




0

TI-Basic (TI-84 Plus CE), 100 ไบต์

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 พร้อมท์ให้ผู้ใช้ป้อนข้อมูลและพิมพ์รายการที่มีnแถวที่สามของ Alternating Triangle ของ Pascal

ในขณะที่วนลูป: L M เป็นแถวปัจจุบันและL L เป็นแถวก่อนหน้า

TI-Basic เป็นภาษาโทเค็น โทเค็นทั้งหมดที่ใช้ที่นี่เป็นโทเค็นหนึ่งไบต์

ฉันคิดว่าฉันสามารถเล่นกอล์ฟนี้ต่อไปได้โดยปรับเปลี่ยน M แบบแทนที่ตั้งแต่ท้าย

คำอธิบาย:

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 ไบต์

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

ลองออนไลน์!

0 การจัดทำดัชนี
-3 ไบต์โดย @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
การใช้แบบไตรภาคควรบันทึก 3 ไบต์:i--?n%2?v*p[i]:v+p[i]
Arnauld
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.