克拉克三角


10

好吧,最近我踢了一点三角,所以这是另一个。

Clark的三角形是一个三角形,其中每行的最左边的条目为1,最右边的条目由6的倍数组成,随着行数的增加而增加。这是可视化

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

就像Pascal的Triangle一样,所有其他条目都是右上角和左上角数字的总和。

这是前几行

          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

任务

给定一个行号(从顶部开始)和一个列号(从该行的第一个非零项目开始)输出该特定单元格的值。两个输入都可以被索引为1或0(如果需要,可以混合和匹配)。三角形的边界是不确定的,查询这些值时您可以做任何想做的事情。

这是,目标是最大程度地减少解决方案中的字节数。

OEIS A046902


1
我们可以建立一个第一行为零的解决方案吗?喜欢在OEIS序列
约克Hülsermann

1
@JörgHülsermann既然这里定义的三角形超出了范围,您可以做任何您想做的事情。
Ad Hoc Garf Hunter

Answers:


7

MATL,15字节

[lBB]i:"TTY+]i)

第一个输入是从0开始的行;第二个是基于1的列。

在线尝试!

说明

[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

6

帕斯卡,132字节

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;

在线尝试!

1个索引。


帕斯卡的三角形!
亨利

5

CJam22 18字节

-4个字节感谢Martin Ender

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

输入为 (0-based row) (0-based column)

在线尝试!

说明

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.

获取成对和的另一种方法是将一个副本左移并使用.+。通常存在这样的问题,即保留尾随元素而不将其求和(这将删除字节),但是在这种情况下,实际上节省了字节,因为这样您就不必6在每次迭代中都添加a 了。您可以节省更多的字节,因为如果仅将前缀放在0一个副本上,则向左移动是免费的:X6_]ri{0X$+.+}*ri=
Martin Ender

_0\+0X$+如果愿意的话,而不是相同的字节数。
Martin Ender'7

@MartinEnder哦,我知道,每行末尾都有额外的6个字符,所以这没关系。聪明,谢谢。
Business Cat

4

C#,157个字节

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];

在线尝试


3

Python 2,67字节

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

在线尝试!

蛮力方法,计算第ath行,然后打印第bth个数字,两个输入均基于0


3

Python 3中64个 60 52字节

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

在线尝试!

使用1索引的递归解决方案。为了打高尔夫球,输出“ True”而不是1。


谢谢:

  • @totallyhuman节省4个字节!
  • @Rod保存8个字节!


2
52个字节用布尔运算符和更灵活的输出替换了if / else
Rod

@Rod,这是一个绝妙的解决方案。我仍在努力思考它为何起作用。我在这里还是个新手(这只是我在网站上的第二个答案),所以我不确定协议:即使您从Python 3切换到了2,我也应该在您的答案中包括您的修订吗?
Chase Vogeli '17

3
在这种情况下,@ icosahedron的python版本是irrelevent,因此您不必介意。通常,在python版本之间切换以利用功能被认为是可以的。
Uriel'7

@Uriel谢谢您的澄清。
Chase Vogeli'7


1

Mathematica,32个字节

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

输入

[行,列]
[1索引,0索引]


1

JavaScript(ES6),38个字节

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

负数列崩溃,对于负数行或超大列,返回六的倍数。


1

C#(.NET Core),44字节

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

取列然后按行,都为1索引。可以通过交换输入来获取行接列(r,c)。将返回row * 6右侧边界(即column > row + 11之外的坐标,以及左侧边界(即column < 1)之外的坐标。


1

PHP,64字节

递归函数

行1-索引列0-索引

像OEIS序列一样,row = 0和column = 0的输出为0

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

在线尝试!

PHP,126字节

行1-索引列0-索引

像OEIS序列一样,row = 0和column = 0的输出为0

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]];

在线尝试!


0

R,77字节

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

需要zoo图书馆;从stdin读取(输入用两个换行符分隔),并返回值,其中包含NA用于超出范围的选择。

在线尝试!


0

果冻 13岁个字节

,"’U0¦c/x6,1S

一个单子链接,该列表获取一个列表[row, entry](条目的索引为0,行的索引为1),并返回值。

在线尝试!

怎么样?

,"’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)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.