Segitiga Pascal (Semacam)


24

Kebanyakan orang di sini mengenal Segitiga Pascal. Itu dibentuk oleh baris berturut-turut, di mana setiap elemen adalah jumlah dari dua tetangganya yang kiri atas dan kanan atas. Ini adalah 5baris pertama (dipinjam dari segitiga Generate Pascal ):

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

Perkecil baris ini ke kiri

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

Sortir dalam urutan menaik

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

Baca segitiga ini dengan baris

[1, 1, 1, 1, 1, 2, 1, 1, 3, 3, 1, 1, 4, 4, 6 ...]

Diberikan input n, output nnomor th dalam seri ini. Ini adalah OEIS 107430 .

Aturan

  • Anda dapat memilih pengindeksan berbasis 0 atau 1. Silakan sebutkan yang mana dalam kiriman Anda.
  • Input dan output dapat dianggap sesuai dengan tipe integer asli bahasa Anda.
  • Input dan output dapat diberikan dengan metode apa pun yang mudah .
  • Program lengkap atau fungsi dapat diterima. Jika suatu fungsi, Anda dapat mengembalikan output daripada mencetaknya.
  • Celah standar dilarang.
  • Ini adalah sehingga semua aturan golf biasa berlaku, dan kode terpendek (dalam byte) menang.

6
Judul yang sangat bagus!
Luis Mendo

1
Sesuai tautan OEIS, satu-satunya perubahan yang diperlukan untuk menghasilkan urutan ini alih-alih koefisien binomial adalah pembagian integer. Itu tentu jatuh di bawah "sepele".
Peter Taylor

5
@PeterTaylor Ini tidak tampak seperti penipuan yang jelas bagi saya. Ada banyak kemungkinan pendekatan lain yang dapat mengarah pada peluang golf yang menarik, terutama untuk bahasa yang tidak memiliki binomial built-in.
Arnauld

4
@ PeterTaylor Saya juga tidak yakin ini adalah duplikat. Sejauh ini, jawaban MATL, JavaScript, dan Pascal agak berbeda antara kedua tantangan. Namun, karena suara saya adalah palu-terbuka, saya belum akan memilih.
AdmBorkBork

4
Sepenuhnya setuju dengan @AdmBorkBork. Jadi anggaplah saya sebagai pilihan kembali. Itu membuat 3 sekarang. Berapa banyak suara yang diperlukan untuk membuka kembali?
Luis Mendo

Jawaban:


9

JavaScript (ES6), 79 byte

Diindeks 0.

f=(n,a=[L=1])=>a[n]||f(n-L,[...a.map((v,i)=>k=(x=v)+~~a[i-1-i%2]),L++&1?k:2*x])

Demo

Bagaimana?

f = (                       // f = recursive function taking:
  n,                        //   n = target index
  a = [L = 1]               //   a[] = current row, L = length of current row
) =>                        //
  a[n] ||                   // if a[n] exists, stop recursion and return it
  f(                        // otherwise, do a recursive call to f() with:
    n - L,                  //   n minus the length of the current row
    [                       //   an array consisting of:
      ...a.map((v, i) =>    //     replace each entry v at position i in a[] with:
        k =                 //       a new entry k defined as:
        (x = v) +           //       v +
        ~~a[i - 1 - i % 2]  //       either the last or penultimate entry
      ),                    //     end of map()
      L++ & 1 ?             //     increment L; if L was odd:
        k                   //       append the last updated entry
      :                     //     else:
        2 * x               //       append twice the last original entry
    ]                       //   end of array update
  )                         // end of recursive call

Algoritma ini secara langsung menghasilkan baris Segitiga Pascal yang diurutkan. Ini memperbarui n sesuai dengan panjang baris sebelumnya sampai [n] ada. Misalnya, 6 iterasi diperlukan untuk n = 19 :

 L | n  | a[]
---+----+------------------------
 1 | 19 | [ 1 ]
 2 | 18 | [ 1, 1 ]
 3 | 16 | [ 1, 1, 2 ]
 4 | 13 | [ 1, 1, 3, 3 ]
 5 |  9 | [ 1, 1, 4, 4, 6 ]
 6 |  4 | [ 1, 1, 5, 5, 10, 10 ]
                        ^^

Kerja bagus. Saya tidak yakin apakah saya benar-benar mengerti cara kerjanya. Usaha saya ternyata jauh lebih lama dari usaha Anda.
kamoroso94

@ kamoroso94 Saya sudah menambahkan penjelasan.
Arnauld

Aku suka ini! Benar-benar menikmati mencari tahu apa yang dilakukannya.
Shaggy

6

Oktaf , 46 byte

@(n)(M=sort(spdiags(flip(pascal(n)))))(~~M)(n)

Berbasis 1.

Cobalah online!

Penjelasan

Pertimbangkan n=4sebagai contoh.

pascal(n) memberikan matriks Pascal:

 1     1     1     1
 1     2     3     4
 1     3     6    10
 1     4    10    20

Baris segitiga Pascal adalah antidiagonal dari matriks ini. Jadi dibalik menggunakan secara vertikalflip(···)

 1     4    10    20
 1     3     6    10
 1     2     3     4
 1     1     1     1

yang mengubah antidiagonal menjadi diagonal.

spdiags(···) mengekstrak diagonal (bukan nol), mulai dari kiri bawah, dan mengaturnya sebagai kolom berlapis-nol:

 1     1     1     1     0     0     0
 0     1     2     3     4     0     0
 0     0     1     3     6    10     0
 0     0     0     1     4    10    20

M=sort(···)mengurutkan setiap kolom dari matriks ini, dan memberikan hasilnya ke variabel M:

 0     0     0     1     0     0     0
 0     0     1     1     4     0     0
 0     1     1     3     4    10     0
 1     1     2     3     6    10    20

Pengindeksan logis (···)(~~M)sekarang digunakan untuk mengekstraksi nonzeros dari matriks ini dalam urutan kolom-utama (turun, lalu lintas). Hasilnya adalah vektor kolom:

 1
 1
 1
 1
···
10
10
20

Akhirnya, nentri -th dari vektor ini diekstraksi menggunakan (···)(n), yang dalam hal ini memberi 1.


5

Python 2 , 86 78 72 byte

-8 byte terima kasih kepada Rod

g=lambda n,r=[1]:r[n:]and r[n/2]or g(n-len(r),map(sum,zip([0]+r,r+[0])))

Cobalah online!

Tidak disatukan

def g(n, row=[1]):
  if n < len(row):
    return row[n/2]
  else:
    next_row = map(sum, zip([0] + row, row + [0]))
    return g(n - len(row), next_row)

Cobalah online!

Fungsi secara rekursif menghitung deretan Pascal's Triangle. Mengingat baris saat ini sebagai row, map(sum, zip([0] + row, row + [0])).
Pada setiap panggilan ndikurangi dengan panjang baris saat ini. Jika fungsi tiba di baris kanan, nthjumlah baris terendah harus dikembalikan.
Karena separuh pertama baris berada dalam urutan menaik dan setiap baris simetris, angkanya adalah pada indeks n/2(0-diindeks, pembagian integer).


4

Bahasa Wolfram (Mathematica) , 55 byte

Pengindeksan adalah berbasis 1.

(##&@@@Sort/@Table[n~Binomial~k,{n,0,#},{k,0,n}])[[#]]&

Cobalah online!

Penjelasan

Ini sepertinya golf, saya bukan pengguna Mathematica yang sangat berpengalaman.

Table[n~Binomial~k,{n,0,#},{k,0,n}]

Untuk setiap n ∈ [0, Input] ∩ ℤ , buat tabel binomial dengan masing-masing k ∈ [0, n] ∩ ℤ .

Sort/@

Sortir masing-masing. Menggunakan singkatan untuk Map[function,object]- function/@object.

(##&@@@...)[[#]]

Ratakan daftar yang dihasilkan dan ambil elemen yang indeks dalam daftar adalah input.



3

R , 58 byte

function(n)(m=apply(outer(0:n,0:n,choose),1,sort))[m>0][n]

Cobalah online!

Menghitung n choose kuntuk setiap n,kdi [0,1,...,n]sebagai matriks, macam baris naik (*), dan menghilangkan nol, kemudian memilih nelemen th.

(*) Ini juga mengubahnya menjadi kolom tapi itu lebih baik karena R menyimpan matriks sebagai vektor berbentuk kolom, yang memungkinkan kita untuk mengindeks langsung ke dalamnya sambil menjaga ketertiban.


3

Haskell , 143 132 125 123 byte

((p>>=s.h)!!)
p=[1]:map(\r->zipWith(+)(0:r)(r++[0]))p
h r=splitAt(div(length r)2)r
s(a,b)=reverse b!a
(h:t)!b=h:(b!t)
x!_=x

Baris pertama adalah fungsi point-free yang mengambil indeks (berbasis 0) dan mengembalikan nomor yang sesuai dalam urutan. Cobalah online!

Ini adalah program Haskell pertama saya! Saya yakin itu bisa menjadi jauh lebih pendek. Kiat dihargai.

Disimpan 2 byte berkat nimi

Tidak disatukan

pascalRows = [1] : map (\row -> zipWith (+) (0:row) (row++[0])) pascalRows
halves row = splitAt (div (length row) 2) row
joinSorted (first, second) = interleave (reverse second) first
interleave [] _ = []
interleave longer shorter = (head longer) : (interleave shorter (tail longer))
f n = (concatMap (joinSorted.halves) pascalRows) !! n

Anda masih memiliki ifungsi s, yang diubah namanya menjadi !, saya kira. Jika Anda menggunakan fungsi infiks Anda bisa drop ()sekitar reverse b: s(a,b)=reverse b!a.
nimi

@nimi Ah, terima kasih - Saya mengubahnya di TIO tetapi melewatkan satu tempat pada kode di sini. Dan terima kasih atas tip kurung.
DLosc

3

JavaScript, 57 byte

f=(i,r=1)=>i<r?i>1?f(i-2,--r)+f(i<r?i:r-1,r):1:f(i-r,r+1)

Diindeks 0.

Bagaimana ini terjadi:

Langkah 0:

c=(i,r)=>i?r&&c(i-1,r-1)+c(i,r-1):1
f=(i,r=1)=>i<r?c(i>>1,r-1):f(i-r,r+1)

Kode ini mudah dimengerti:

  • fungsi cmenghitung rumus Penggunaan kombinasi: C (n, k) = C (n-1, k) + C (n-1, k-1); atau 1 jika k == 0 atau k == n
  • fungsi fcoba cari tahu nomor baris dan indeks di baris, lalu panggil fungsi c untuk mendapatkan hasilnya.

Langkah 1:

c=(i,r)=>i>1?--r&&c(i-2,r)+c(i,r):1
f=(i,r=1)=>i<r?c(i,r):f(i-r,r+1)

Pada langkah ini, kita mencoba untuk memodifikasi panggilan fungsi cuntuk c(i,r)yang membuatnya sama seperti parameter f.

Langkah 2:

c=(i,r)=>i>1?--r&&c(i-2,r)+c(i<r?i:r-1,r):1
f=(i,r=1)=>i<r?c(i,r):f(i-r,r+1)

Kami menguji i<rapakah menggunakan fungsi fatau fungsi c. Itu sebabnya kami musk terus i<rmemegang selama rekursi fungsi c.

Langkah 3:

f=(i,r=1)=>i<r?i>1?--r&&f(i-2,r)+f(i<r?i:r-1,r):1:f(i-r,r+1)

Pada langkah ini, kami menggabungkan kedua fungsi ini menjadi satu.

Setelah beberapa golf lagi, kami akhirnya mendapatkan jawaban yang dijelaskan di atas.


2

Jelly , 13 byte

0rcþ`ZṢ€Ẏḟ0⁸ị

Cobalah online!

Menggunakan algoritma Dyalog Uriel.

1-diindeks.

Penjelasan:

0rcþ`ZṢ€Ẏḟ0⁸ị
0r            Return inclusive range from 0 to n
    `         Call this dyad with this argument on both sides
   þ           Outer product with this dyad
  c             Binomial coefficient
     Z        Zip
       €      Call this link on each element
      Ṣ        Sort
        Ẏ     Concatenate elements
         ḟ0   Remove 0s
           ⁸ị Take the nth element

Bisakah Anda menambahkan penjelasan? Saya tidak tahu apa yang þsedang dilakukan di sini.
Shaggy

1
@ Shaggy Ini produk luar, saya akan menambahkan penjelasan.
Erik the Outgolfer

2

JavaScript (Node.js) , 65 byte

Bahkan sebuah array pun tidak digunakan. Diindeks 0.

f=(n,i=0,g=x=>x?x*g(x-1):1)=>n>i?f(n-++i,i):g(i)/g(c=n>>1)/g(i-c)

Cobalah online!

Penjelasan:

f=(n,i=0,                 )=>                                     // Main Function
         g=x=>x?x*g(x-1):1                                        // Helper (Factorial)
                             n>i?                                 // Is n > i?
                                 f(n-++i,i):                      // If so, call function
                                                                  // f(n-i-1, i+1) to skip
                                                                  // . i+1 terms
                                            g(i)/g(c=n>>1)/g(i-c) // If not, since sorting 
                                                                  // . the binomial coeffs
                                                                  // . equals to writing
                                                                  // . the first floor(i/2)
                                                                  // . coefficients twice
                                                                  // . each, so a shortcut

1

Pascal , 373 byte

function t(n,k,r:integer):integer;begin if(n<k)then t:=r-1 else t:=t(n,k+r,r+1)end;
function s(n,k:integer):integer;begin if(k=0)then s:=n else s:=s(n+k,k-1)end;
function f(n,k:integer):integer;begin if((k<1)or(k>n))then f:=0 else if n=1 then f:=1 else f:=f(n-1,k-1)+f(n-1,k)end;
function g(n:integer):integer;var k:integer;begin k:=t(n,0,1);g:=f(k,(n-s(0,k-1)+2)div 2)end;

g adalah fungsinya.

Cobalah online!


n=1 thenbisa n=1then.
Jonathan Frech

Sama halnya, sepertinya if(k=0)thenbisa menjadi if k=0then.
Shaggy

jika beberapa nomor selalu lebih besar dari 0, Anda harus menggunakan wordbukan integer.
tsh

1

Java 8, 187 byte

n->{int r=~-(int)Math.sqrt(8*n+1)/2+1,a[]=new int[r],k=r,x=0;for(;k-->0;a[k]=p(r,k))x+=k;java.util.Arrays.sort(a);return a[n-x];}int p(int r,int k){return--r<1|k<2|k>r?1:p(r,k-1)+p(r,k);}

Penjelasan:

Cobalah online.

n->{                   // Method with integer as both parameter and return-type
  int r=~-(int)Math.sqrt(8*n+1)/2+1,
                       //  Calculate the 1-indexed row based on the input
      a[]=new int[r],  //  Create an array with items equal to the current row
      k=r,             //  Index integer
      x=0;             //  Correction integer
  for(;k-->0;          //  Loop down to 0
    a[k]=p(r,k))       //   Fill the array with the Pascal's Triangle numbers of the row
    x+=k;              //   Create the correction integer
  java.util.Arrays.sort(a);
                       //  Sort the array
  return a[n-x];}      //  Return the `n-x`'th (0-indexed) item in this sorted array

// Separated recursive method to get the k'th value of the r'th row in the Pascal Triangle
int p(int r,int k){return--r<1|k<2|k>r?1:p(r,k-1)+p(r,k);}

1

MATL , 11 byte

:qt!XnSXzG)

Berbasis 1.

Cobalah online! Atau verifikasi semua kasus uji .

Penjelasan

Pertimbangkan input 4sebagai contoh. ;adalah pemisah baris untuk matriks atau vektor kolom.

:     % Implicit input: n. Push the row vector [1 2 ... n]          
      S STACK: [1 2 3 4]
q     % Subtract 1, emlement-wise: gives [0 1 ... n-1]
      % STACK: [0 1 2 3]
t!    % Duplicate and transpose into a column vector
      % STACK: [0 1 2 3], [0; 1; 2; 3]
Xn    % Binomial coefficient, element-wise with broadcast. Gives an
      % n×n matrix where entry (i,j) is binomial(i,j), or 0 for i<j
      % STACK: [1 1 1 1;
                0 1 2 3;
                0 0 1 3;
                0 0 0 1]
S     % Sort each column
      % STACK: [0 0 0 1;
      %         0 0 1 1;
      %         0 1 1 3;
      %         1 1 2 3]
Xz    % Keep only nonzeros. Gives a column vector
      % STACK: [1; 1; 1; 1; 1; 2; 1; 1; 3; 3]
G)    % Get the n-th element. Implicitly display
      % STACK: 1

1

Batch, 128 byte

@set/as=2,t=r=m=i=1
:l
@if %1 geq %t% set/as+=r,t+=r+=1&goto l
@for /l %%i in (%s%,2,%1)do @set/ar-=1,m=m*r/i,i+=1
@echo %m%

Diindeks 0.


Bisakah Anda menambahkan penjelasan? Saya tidak bisa mengikuti logika di sini.
AdmBorkBork

@ AdmBorkBork Tiga baris pertama menghitung baris rdan kolom ke %1-(s-2)- %1th dari seri. Baris keempat kemudian menggunakannya untuk menghitung koefisien binomial (n k) = n!/(n-k)!k!= n(n-1)...(n+1-k)/(1)(2)...k= (n/1)((n-1)/2)...((n+1-k)/k). Di mana MathJax ketika saya membutuhkannya?
Neil

1

APL (Dyalog Classic) , 17 byte

⎕⊃∊i!⍨,\⌊.5×i←⍳99

Cobalah online!

Pengindeksan berbasis 0

perhatikan bahwa (49!98) > 2*53, yaitu koefisien binomial 98 lebih dari 49 lebih besar dari 2 53 , jadi pada saat itu Dyalog sudah mulai kehilangan presisi karena IEEE floating point


@Abigail lihat di sini dan di sini
ngn

1

05AB1E , 10 byte

Diindeks 0

ÝεDÝc{}˜sè

Cobalah online!

Penjelasan

Ý             # push range [0 ... input]
 ε    }       # apply to each element
  DÝc         # N choose [0 ... N]
     {        # sort
       ˜      # flatten result to a list
        sè    # get the element at index <input>

1

Jelly , 11 byte

Ḷc€`Ṣ€Fḟ0ị@

Cobalah online!

Tautan monadik yang mengambil indeks dan mengembalikan integer - menggunakan pengindeksan berbasis 1.

Bagaimana?

Melakukan tantangan cukup banyak seperti yang tertulis, hanya dengan lebih banyak hak segitiga Pascal (nol) yang kemudian dibuang ...

Ḷc€`Ṣ€Fḟ0ị@ - Link: integer, i    e.g. 1   or    9
Ḷ           - lowered range            [0]       [0,1,2,3,4,5,6,7,8]
   `        - repeat left as right arg [0]       [0,1,2,3,4,5,6,7,8]
 c€         - binomial choice for €ach [[1]]     [[1,0,0,0,0,0,0,0,0],[1,1,0,0,0,0,0,0,0],[1,2,1,0,0,0,0,0,0],[1,3,3,1,0,0,0,0,0],[1,4,6,4,1,0,0,0,0],[1,5,10,10,5,1,0,0,0],[1,6,15,20,15,6,1,0,0],[1,7,21,35,35,21,7,1,0],[1,8,28,56,70,56,28,8,1]]
    Ṣ€      - sort €ach                [[1]]     [[0,0,0,0,0,0,0,0,1],[0,0,0,0,0,0,0,1,1],[0,0,0,0,0,0,1,1,2],[0,0,0,0,0,1,1,3,3],[0,0,0,0,1,1,4,4,6],[0,0,0,1,1,5,5,10,10],[0,0,1,1,6,6,15,15,20],[0,1,1,7,7,21,21,35,35],[1,1,8,8,28,28,56,56,70]]
      F     - flatten                  [1]       [0,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,2,0,0,0,0,0,1,1,3,3,0,0,0,0,1,1,4,4,6,0,0,0,1,1,5,5,10,10,0,0,1,1,6,6,15,15,20,0,1,1,7,7,21,21,35,35,1,1,8,8,28,28,56,56,70]
       ḟ0   - filter discard zeros     [1]       [1,1,1,1,1,2,1,1,3,3,1,1,4,4,6,1,1,5,5,111,1,6,6,15,15,21,1,7,7,21,21,35,35,1,1,8,8,28,28,56,56,70]
         ị@ - index into (sw@p args)    1         3 --------------^

1

Merah , 206 byte

f: func[n][t: copy[[1]]l: 0
while[l < n][a: copy last t insert append a 0 0 b: copy[]repeat i k:(length? a)- 1[append b a/(i) + a/(i + 1)]append t reduce[b]l: l + k]foreach p t[sort p]pick split form t{ }n]

Berbasis 1

Cobalah online!

Penjelasan:

f: func [n] [
    t: copy [[1]]                       ; start with a list with one sublist [1]
    l: 0                                ; there are 1 items overall
    while [l < n] [                     ; while the number of items is less than the argument
        a: copy last t                  ; take the last sublist 
        insert append a 0 0             ; prepend and append 0 to it  
        b: copy []                      ; prepare a list for the sums  
        repeat i k: (length? a) - 1 [   ; loop throught the elements of the list
            append b a/(i) + a/(i + 1)] ; and find the sum of the adjacent items
        append t reduce [b]             ; append the resulting list to the total list
        l: l + k                        ; update the number of the items
    ]
    foreach p t [sort p]                ; sort each sublist
    v: pick split form t { } n          ; flatten the list and take the n-th element
]

1

Perl, 48 byte

Termasuk +1untukp

perl -pe '$_-=$%until$_<++$%;$./=$_/--$%for 1..$_/2;$_=$.' <<< 19

Menggunakan pengindeksan basis 0.


1

J, 46 41 byte

f=:](([-2!]){/:~@(i.!<:)@])[:<.2&!@,:^:_1

Diindeks 0

Cobalah online!

Catatan:

  • <.2&!@,:^:_1memberikan nomor baris yang relevan dari segitiga Pascal dengan membulatkan kebalikan dari y choose 2.
  • /:~@(i.!<:)@] menghitung baris dan mengurutkannya.
  • [-2!] memberikan indeks ke dalam baris.

Halo. Selamat datang di situs ini! Ini adalah jawaban pertama yang bagus :)
DJMcMayhem

1

Julia , 70 byte

f(x)=map(n->binomial(n-1,ceil(Int,x/2-(n^2-n)/4-1)),round(Int,√(x*2)))

Berbasis 1

Penjelasan:

pertama menemukan nomor baris, lalu nomor kolom, kemudian menghitung binomial


Selamat datang di PPCG!
Martin Ender

yeah thx wajah bahagia
Jimmy Chen


0

Pyth, 15 byte

@u+GSm.cHdhHhQY

Diindeks 0

Cobalah

Penjelasan

@u+GSm.cHdhHhQY
 u          hQY   Reduce on [0, ..., input], starting with the empty list...
  +G              ... append to the accumulator...
    Sm.cHdhH      ... the sorted binomial coefficients.
@              Q  Take the 0-indexed element.


0

Ruby , 56 byte

->n{a=0;n-=a until n<a+=1;[*2..a].combination(n/2).size}

Berbasis 0

Pertama, dapatkan baris dan kolom dalam segitiga, lalu hitung koefisien binomial yang sesuai dengan posisi itu.

Cobalah online!


0

Sebenarnya , 8 byte

Sebagian besar didasarkan pada jawaban Jelly Jonathan Allan . Menggunakan pengindeksan 0.

;r♂╣♂SΣE

Cobalah online!

Tidak melakukanolf

          Implicit input n.
;         Duplicate n.
 r        Lowered range. [0..n-1].
  ♂╣      Pascal's triangle row of every number.
    ♂S    Sort every row.
      Σ   Sum each row into one array.
       E  Get the n-th element of the array (0-indexed).
          Implicit return.

Seharusnya menghasilkan satu nomor; yang nth dalam seri. Ini menghasilkan sebuah array.
rekursif

Aduh. Tetap. Terima kasih @ rekursif
Sherlock9



Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.