Segitiga Clark

10

Ok saya baru saja melakukan tendangan segitiga baru-baru ini, jadi ini satu lagi.

Clark's Triangle adalah segitiga di mana entri paling kiri dari setiap baris adalah 1 dan entri paling kanan terdiri dari kelipatan 6 yang meningkat dengan meningkatnya jumlah baris. Ini visualisasi

     1 6
    1 . 12
   1 . . 18
  1 . . . 24
 1 . . . . 30
1 . . . . . 36

Sama seperti Pascal's Triangle, semua entri lainnya adalah jumlah dari angka-angka di kanan atas dan kiri atas mereka.

Inilah beberapa baris pertama yang diisi

          1   6
        1   7  12
      1   8  19  18
    1   9  27  37  24
  1  10  36  64  61  30
1  11  46  100 125 91  36

Tugas

Diberikan nomor baris (mulai dari atas) dan nomor kolom (mulai dari item bukan nol pertama pada baris itu) menghasilkan nilai pada sel tertentu. Kedua input dapat diindeks 1 atau 0 (Anda dapat mencampur dan mencocokkan jika Anda inginkan). Di luar batas segitiga tidak ditentukan dan Anda dapat melakukan apa pun yang Anda inginkan ketika ditanya untuk nilai-nilai ini.

Ini adalah , tujuannya adalah untuk meminimalkan jumlah byte dalam solusi Anda.

OEIS A046902

Ad Hoc Garf Hunter
sumber
1
Bisakah kita membuat solusi dengan nol di baris pertama? seperti dalam urutan OEIS
Jörg Hülsermann
1
@ JörgHülsermann Karena itu di luar batas untuk segitiga yang ditentukan di sini Anda dapat melakukan apa pun yang Anda inginkan.
Ad Hoc Garf Hunter

Jawaban:

7

MATL , 15 byte

[lBB]i:"TTY+]i)

Input pertama adalah baris berbasis 0; kedua adalah kolom berbasis 1.

Cobalah online!

Penjelasan

[lBB]   % Push [1 6 6]
i       % Input: row number (0-based)
:"      % Repeat that many times
  TT    %   Push [1 1]
  Y+    %   Convolution, increasing size. This computes the sum of overlapping
        %   pairs, including the endpoints. So for example [1 6 6] becomes
        %   [1 7 12 6], which will later become [1 8 19 18 6], ...
]       % End
i       % Input: column number (1-based)
)       % Use as index. Implicit display
Luis Mendo
sumber
6

Pascal , 132 byte

function f(n,k:integer):integer;begin if k=1 then f:=1 else if k>n then f:=6*n else if k<0 then f:=0 else f:=f(n-1,k-1)+f(n-1,k)end;

Cobalah online!

1-diindeks.

Uriel
sumber
Segitiga Pascal!
Henry
5

CJam , 22 18 byte

-4 byte terima kasih kepada Martin Ender

X6_]ri{0X$+.+}*ri=

Masukan adalah (0-based row) (0-based column)

Cobalah online!

Penjelasan

X6_]  e# Push the list [1 6 6]. This is the first row, but each row will have an extra 6 at
      e# the end, which is out of bounds.
ri    e# Push the first input as an integer.
{     e# The following block calculates the next row given a row on top of the stack:
 0X$+ e#  Copy the top list on the stack and prepend 0.
 .+   e#  Element-wise addition with the list before prepending 0. This adds each element of
      e#  with the one to its left, except the initial 1 gets added to 0 and the final number
      e#  gets added to the out-of-bounds 6. The out-of-bounds 6 is unchanged since one list
      e#  is longer.
}*    e# Run this block (row index) times.
ri=   e# Get the (column index)th item of the final list.
Kucing Bisnis
sumber
Teknik lain untuk mendapatkan jumlah berpasangan adalah dengan menggeser satu salinan ke kiri dan menggunakannya .+. Biasanya itu memiliki masalah bahwa ia mempertahankan elemen trailing tanpa menjumlahkannya (yang biaya byte untuk menghapus), tetapi dalam kasus ini yang benar-benar menghemat byte karena Anda tidak perlu menambahkan 6pada setiap iterasi. Anda dapat menyimpan lebih banyak byte karena menggeser ke kiri adalah gratis jika Anda hanya menambahkan 0satu salinan ke:X6_]ri{0X$+.+}*ri=
Martin Ender
_0\+bukannya 0X$+jumlah byte yang sama jika Anda inginkan.
Martin Ender
@ MartinEnder Oh saya mengerti, Anda mendapatkan 6 tambahan di akhir setiap baris yang di luar batas sehingga tidak masalah. Pintar, terima kasih.
Kucing Bisnis
4

C #, 157 byte

using System.Linq;(b,c)=>{var f=new[]{1,6};for(;c>0;c--){int s=f.Length;f=new int[s+1].Select((e,i)=>i<1?1:i==s?f[s-1]+6:f[i-1]+f[i]).ToArray();}return f[b];

Cobalah online

LiefdeWen
sumber
3

Python 2 , 67 byte

a,b=input()
x=[1,6]
exec"x=map(sum,zip([0]+x,x+[6]));"*a
print x[b]

Cobalah online!

Pendekatan brute-force, menghitung abaris ke - th, dan kemudian mencetak bnomor ke-2, kedua input berbasiskan 0

tongkat
sumber
3

Python 3 , 64 60 52 byte

f=lambda r,c:c<2or c>r and r*6or f(r-1,c-1)+f(r-1,c)

Cobalah online!

Solusi rekursif menggunakan 1-indexing. Output "Benar" bukannya 1 demi golf.


Terimakasih untuk:

  • @ sebenarnya manusia untuk menghemat 4 byte!
  • @Rod untuk menyimpan 8 byte!
Chase Vogeli
sumber
2
60 bytes
totallyhuman
2
52 byte menggantikan if / else dengan operator boolean dan dengan output yang lebih fleksibel
Rod
@Rod, ini solusi brilian. Saya masih mencoba untuk membungkus kepala saya mengapa ini bekerja. Saya masih cukup baru di sini (ini hanya jawaban kedua saya di situs), jadi saya tidak yakin pada protokol: haruskah saya memasukkan revisi Anda dalam jawaban saya meskipun Anda beralih dari Python 3 ke 2?
Chase Vogeli
3
@icosahedron versi python tidak dapat dipercaya dalam hal ini, jadi Anda tidak perlu keberatan. umumnya, beralih di antara versi python untuk mengeksploitasi fitur dianggap OK.
Uriel
@Uriel terima kasih atas klarifikasi.
Chase Vogeli
2

Haskell , 41 byte

n#1=1
n#m|m>n=6*n
n#m=(n-1)#(m-1)+(n-1)#m

Cobalah online!

Panggilan menggunakan di n # mmana nnomor baris dan mnomor kolom, keduanya 1-diindeks.

Julian Wolf
sumber
1

Mathematica, 32 byte

b=Binomial;b[#,#2-1]6+b[#-1,#2]&

memasukkan

[baris, kolom]
[1-diindeks, 0-diindeks]

J42161217
sumber
1

JavaScript (ES6), 38 byte

f=(r,c)=>c?r>c?f(--r,c)+f(r,--c):r*6:1

Gangguan untuk kolom negatif, dan mengembalikan kelipatan enam untuk baris negatif atau kolom yang terlalu besar.

Neil
sumber
1

C # (.NET Core) , 44 byte

f=(c,r)=>c<=1?1:c>r?6*r:f(c-1,r-1)+f(c,r-1);

Dibawa kolom kemudian baris, keduanya 1-diindeks. Dapat mengambil baris maka kolom dengan menukar input: (r,c). Akan kembali row * 6untuk koordinat di luar batas di sebelah kanan (yaitu column > row + 1), dan 1untuk koordinat di luar batas di sebelah kiri (yaitu column < 1).

Kamil Drakari
sumber
1

PHP , 64 byte

fungsi rekursif

baris 1-indeks kolom pengindeksan 0

Output untuk baris = 0 dan kolom = 0 adalah 0 seperti pada urutan OEIS

function f($r,$c){return$c-$r?$c?f($r-=1,$c-1)+f($r,$c):1:$r*6;}

Cobalah online!

PHP , 126 byte

baris 1-indeks kolom pengindeksan 0

Output untuk baris = 0 dan kolom = 0 adalah 0 seperti pada urutan OEIS

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

Cobalah online!

Jörg Hülsermann
sumber
0

R , 77 byte

Reduce(function(x,y)zoo::rollsum(c(0,x,6),2),double(scan()-1),c(1,6))[scan()]

Membutuhkan zooperpustakaan; membaca dari stdin (input dipisahkan oleh dua baris baru) dan mengembalikan nilai, dengan NAuntuk pilihan di luar batas.

Cobalah online!

Giuseppe
sumber
0

Jelly , 13 byte

,"’U0¦c/x6,1S

Tautan monadik yang mengambil daftar [row, entry](0-indeks untuk entri, 1-indeks untuk baris), mengembalikan nilai.

Cobalah online!

Bagaimana?

,"’U0¦c/x6,1S - Link: list of numbers, [row, entry]
  ’           - decrement     -> [row-1, entry-1]
 "            - zip with:
,             -   pair        -> [[row, row-1], [entry, entry-1]]
     ¦        - sparse application of:
   U          -   upend
    0         - for indexes: 0 -> [[row, row-1], [entry-1, entry]]
       /      - reduce by:
      c       -   choose       -> [(row choose entry-1), (row-1 choose entry)]
         6,1  - 6 paired with 1 = [6,1]
        x     - times        i.e. [a, a, a, a, a, a, a, b]
            S - sum            -> 6*(row choose entry-1) + (row-1 choose entry)
Jonathan Allan
sumber