Segitiga Bergantian Pascal

21

Segitiga Pascal dihasilkan dengan memulai dengan 1dan membuat setiap baris terbentuk dari penambahan yang berurutan. Di sini, sebagai gantinya, kita akan membentuk segitiga dengan berganti-ganti perkalian dan penambahan.

Kami mulai baris 1hanya dengan soliter 1. Setelah itu, penambahan dilakukan pada baris ganjil, dan perkalian dilakukan pada baris genap (1-diindeks). Saat melakukan langkah penjumlahan, anggap spasi di luar segitiga diisi dengan 0s. Saat melakukan langkah multiplikasi, asumsikan bahwa bagian luar diisi dengan 1s.

Berikut adalah segitiga penuh hingga 7 baris. Tanda *atau +di sebelah kiri menunjukkan langkah apa yang dilakukan untuk menghasilkan baris itu.

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

Tantangan

Diberikan input n, output nbaris ke-3 dari segitiga ini.

Aturan

  • Anda dapat memilih untuk mengindeks 0 sebagai gantinya, tetapi kemudian harap menyadari bahwa baris penambahan dan multiplikasi harus flip-flop, sehingga segitiga yang sama persis dihasilkan seperti di atas. Silakan sebutkan dalam kiriman Anda jika Anda memilih untuk melakukan ini.
  • Input dan output dapat dianggap sesuai dengan tipe integer asli bahasa Anda.
  • Input dan output dapat diberikan dalam format apa pun yang nyaman .
  • Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
  • Jika memungkinkan, harap sertakan tautan ke lingkungan pengujian online agar orang lain dapat mencoba kode Anda!
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.

Contohnya

Menampilkan dua contoh output yang mungkin dari banyak: daftar, atau string yang dipisahkan spasi.

4
[1, 2, 2, 1]

8
"1 4 60 360 360 60 4 1"
AdmBorkBork
sumber
2
@totallyhuman Tidak, satu-satunya hal yang harus stdout adalah nbaris ke - th.
AdmBorkBork

Jawaban:

16

Pascal , 249 247 233 byte

Nah, ini adalah segitiga bolak - balik Pascal .

1 byte disimpan berkat @ 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;

Cobalah online!

Uriel
sumber
248 byte
Mr. Xcoder
7

Python 2 , 97 93 86 81 78 byte

-4 byte terima kasih kepada Rod. -10 byte terima kasih kepada 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]

Diindeks 0.

Cobalah online!

benar-benar manusiawi
sumber
1
Kerja bagus, saya punya pendekatan (jauh) lebih lama . Meskipun saya belum punya waktu untuk bermain golf.
Tn. Xcoder
1
Saya kira itu map([int.__add__ ,int.__mul__][i%2],[i%2]+a,a+[i%2])akan berhasil (tidak diuji)
Rod
1
Ini seharusnya benar
Halvard Hummel
1
Tidak, ini bersifat rekursif. Anda harus memasukkan namanya.
Tn. Xcoder
5

Jelly , 17 12 byte

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

Ini adalah program lengkap (atau tautan niladik) yang mengambil input dari STDIN.

Cobalah online!

Bagaimana itu bekerja

µ×+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.
Dennis
sumber
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

Cobalah online!

officialaimm
sumber
@tallyallyhuman Terima kasih .. Aku mengembalikannya ...
officialaimm
1
Tiba-tiba metode exec memimpin: D
Dead Possum
1
87 byte , mendeklarasikan [1].
Tn. Xcoder
3

CJam , 25 byte

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

Diindeks 0.

Cobalah online!

Penjelasan

Ini adalah blok anonim yang mengambil nomor dari tumpukan dan meninggalkan hasilnya di tumpukan.

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.
Kucing Bisnis
sumber
Tunggu 2%!harus mendorong 1 jika genap dan 0 jika ganjil, bukan?
Buah Esolanging
3

Mathematica, 92 byte

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

Cobalah online! (untuk mengerjakan matematika "Tr" diganti dengan "Total")

J42161217
sumber
3

Haskell , 76 72 byte

Solusi 0-diindeks:

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

Cobalah online!

Penjelasan

p secara rekursif mendefinisikan segitiga bolak-balik, casing dasar / elemen pertama adalah [1]

p=[1]:[                                                            ]

Itu kemudian membangun segitiga dengan mengambil baris sebelumnya ( l). Untuk mengetahui apa yang harus dilakukan dengannya, kita perlu melacak operator yang benar ( o) dan elemen netral yang sesuai ( e):

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

Dari sini buat baris baru dengan menduplikasi baris dan untuk satu salinan kita tambahkan elemen netral, beri zip dengan operator dan tambahkan 1:

       zipWith o(e:l)l++[1]
ბიმო
sumber
3

R , 108 98 byte

-10 byte dengan mengganti tanda multiply yang sebenarnya dengan tanda plus. Tolong maafkan saya.

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

Cobalah online!

Cukup senang dengan metode umum (pertama kali saya alias primitif), tapi saya yakin masih ada golf yang harus dilakukan, terutama dengan penanganan canggung di mana n <3 yang mengarah ke banyak pelat baja.

Kriminal kriminal
sumber
85 byte . Saya sangat menyukai solusi Anda `*`=`+`! cukup pintar. Sisa dari peningkatan saya hanyalah teknik standar bermain golf, yang dengan senang hati akan saya jelaskan atas permintaan Anda :)
Giuseppe
80 byte . Saya mengambil inspirasi dari catatan Anda tentang penanganan kasus di manan<3
Giuseppe
2

Sekam , 17 16 byte

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

Cobalah online!

Solusi 1-diindeks.

Penjelasan

Baris pertama adalah fungsi utama, yang memanggil fungsi helper di baris kedua. Fungsi helper biasanya dipanggil dengan , tetapi dalam hal ini saya menggunakan fitur label meluap dari Husk: jika Anda merujuk ke garis N dalam program dengan M <N baris, Anda mendapatkan garis N mod M dengan fungsi pengubah M / N diterapkan padanya. Fungsi pengubah kedua adalah flip, jadi saya menggunakan untuk membalik argumen fungsi pembantu tanpa biaya byte tambahan.

Ini adalah fungsi pembantu.

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

Inilah fungsi utamanya.

!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.
Zgarb
sumber
2

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

-4 bytes terima kasih kepada Phaeze
-5 bytes berkat Zac Faragher
-6 bytes berkat 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;}

Cobalah online!

Penjelasan:

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
};
Grzegorz Puławski
sumber
Anda harus dapat mengubah inisialisasi array b Anda var b=new[]{1};dan kompiler akan menentukan tipe array untuk Anda.
JustinM
1
Cara lain untuk membangun lapisan pertama adalah int[]b={1};- 11 byte vs 20 apa adanya atau 16 seperti pada saran @Phaeze
Zac Faragher
1
@ZacFaragher dan Phaeze terima kasih!
Grzegorz Puławski
1
Aku tahu itu sudah cukup lama, tapi Anda dapat golf 6 byte lagi: 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;}. Saya telah menggabungkan cseperti ini int[]b={1},c;; disingkat i%2==0menjadi i%2<1; Dan menghapus kurung loop dengan meletakkan segala sesuatu di dalamnya.
Kevin Cruijssen
Besar! Terima kasih @KevinCruijssen
Grzegorz Puławski
1

Python 2 , 83 byte

Berikan sedikit cinta untuk exec
0-diindeks

l=[1];exec"l[1:]=[[a+b,a*b][len(l)%2]for a,b in zip(l,l[1:])]+[1];"*input()
print l

Cobalah online!

Possum Mati
sumber
1

Pyth , 22 byte

Tersimpan berton-ton byte berkat @FryAmTheEggman ! Solusi awal di bawah ini.

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

Full Test Suite (0-diindeks).

Pyth , 40 38 36 35 byte

Ini terasa waaaaaaaay terlalu lama. Saran diterima.

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

Test Suite atau Coba online!

Tuan Xcoder
sumber
Mengurangi menggunakan tampaknya jauh lebih pendek . Saya tidak yakin ini optimal juga, saya pikir sub 20 dapat dikelola?
FryAmTheEggman
@FryAmTheEggman Lihat riwayat revisi saya. Saya bilang saya mencoba mencari solusi dengan mengurangi u(tetapi tidak bisa mengetahuinya). Terima kasih!
Tn. Xcoder
Jika Pyth akan memiliki built-in prepend-append ...
Mr. Xcoder
1

Perl 5 , 111 + 2 (-na) = 113 byte

sub t{($r,$c)=@_;!--$r||!$c||$c>=$r?1:eval"t($r,$c)".($r%2?"*":"+")."t($r,$c-1)"}say map{t($F[0],$_).$"}0..$_-1

Cobalah online!

Xcali
sumber
1

Mathematica, 70 byte

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

Cobalah di kotak pasir Wolfram ! Sayangnya, itu tidak berhasil di Matematika. Diindeks 0.

Penjelasan: Partition[#,2,1,{-1,1},{}]mengambil daftar dan mengembalikan semua sub-elemen dua elemen, ditambah daftar 1-elemen untuk awal dan akhir - misalnya, {1,2,3,4}menjadi {{1}, {1,2}, {2,3}, {3,4}, {4}}. PadRight[{},#,{1##&,Plus}]membuat daftar bolak-balik 1##&(secara efektif Times) dan Plus, yang panjangnya adalah nomor input. Kemudian Foldberulang kali terapkan fungsi partisi dengan Pluses dan Timeses yang diterapkan padanya, untuk membuat baris segitiga.

Bukan pohon
sumber
0

Ruby , 83 82 byte

->n{a=[1];p=0;n.times{a=[p=1-p,*a,p].each_cons(2).map{|x|x.reduce([:+,:*][p])}};a}

Cobalah online!

Ini diindeks 0.

Nnnes
sumber
0

Racket , 116 byte

(define(t n[i 1][r'(1)])(if(= n 1)r(t(- n 1)(- 1 i)(cons 1(append(map(if(> i 0)* +)(cdr r)(reverse(cdr r)))'(1))))))

Cobalah online!

Kucing Bisnis
sumber
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-diindeks, meminta pengguna untuk memasukkan dan mencetak daftar yang berisi n baris ke-empat Segitiga Bergantian Pascal.

Sedangkan perulangan: L M adalah baris saat ini, dan L L adalah baris sebelumnya.

TI-Basic adalah a bahasa tokenized . Semua token yang digunakan di sini adalah token satu-byte.

Saya pikir saya bisa bermain golf ini lebih jauh dengan memodifikasi M di tempat dari akhir.

Penjelasan:

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

pizzapants184
sumber
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]

Cobalah online!

Diindeks 0.
-3 byte oleh @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)));
}

Birjolaxew
sumber
1
Menggunakan terner harus menghemat 3 byte:i--?n%2?v*p[i]:v+p[i]
Arnauld