对串联三角形的行求和


16

考虑下面的三角形。

1个
23
456
7891
01112
131415
1617181
92021222
324252627
2829303132
33343536373
839404142434
4454647484950
51525354555657
585960616263646
5666768697071727
37475767778798081

您可能已经注意到,第一行的长度为1,此后的每一行都比前一行长1位,并且它包含连接的正整数的数字。

您将得到一个整数ñ。您的任务是找到位于上述三角形的第N行上的数字的总和。

规则

  • 您可以选择0或1索引。请在您的答案中指定。

  • 默认漏洞适用。

  • 您可以采用任何标准均值和任何合理格式来接受输入并提供输出。

  • 这是OEIS A066548此序列是三角形本身(除了我们不删除前导零)。

  • 这是,所以以字节为单位(每种语言)的最短代码获胜。打高尔夫球吧!

测试用例

Input  |  Output

0  |  1
1  |  5
2  |  15
3  |  25
4  |  5
5  |  15
6  |  25
7  |  20
8  |  33
9  |  33
10 |  43
11 |  46
12 |  64

请注意,上面是0索引。如果要查找1索引的测试用例,请将输入增加1。

一点无关紧要的是,我最近更改了我的个人资料照片,这启发了我写这个挑战。

Answers:


8

外壳,7个字节

1索引

Σ!CNṁdN

在线尝试!

说明

    ṁ     Map then concatenate
     d    Integer digits
      N   Over the natural numbers
  CN      Cut into lists of lengths corresponding to the natural numbers
 !        Index it
Σ         Sum





2

Mathematica,96个字节

(d=Flatten[IntegerDigits/@Range[#^2]];Last@Table[Tr@Take[d,{i(i+1)/2+1,(i+1)(i+2)/2}],{i,0,#}])&  


在线尝试! (为了进行数学研究,必须将“ Tr”替换为“ Total”)


2

果冻,11字节

²RDFṁRS$ṫCS

在线尝试!

使用基于1的索引。

说明

²RDFṁRS$ṫCS  Input: n
²            Square
 R           Range, [1, n^2]
  D          Decimal digits
   F         Flatten
    ṁ        Reshape to
       $     Monadic chain
     R         Range, [1, n]
      S        Sum
        ṫ    Tail
         C   Complement, 1-n
          S  Sum

2

Haskell,69 64字节

n%x=sum[read[d]|d<-take n x]:(n+1)%drop n x
f=(1%(show=<<[1..])!!)

在线尝试。

感谢Laikoni节省了5个字节!

这是不那么高尔夫的版本:

-- continuous stream of digits representing
-- the concatenation of positive integers in
-- order: 1234567891011...
digitstream = show=<<[1..]

-- sequence that yields the rows of the triangle
triangle n xs |(a,b)<-splitAt n xs=a:triangle(n+1)b

digitSum xs = sum[read[d]|d<-xs]

-- sequence that sums up the digits in each row
rowSumSequence = map digitSum (triangle 1 digitstream)

-- the final function that just shows the value 
-- at a given index
g=(rowSumSequence!!)

n%x=sum[read[d]|d<-take n x]:(n+1)%drop n x短一些字节。
Laikoni'9

@Laikoni谢谢!编辑。我不知道为什么我splitOn会节省字节。
Cristian Lupascu

2

R,119 109 108 93 88字节

开始打高尔夫球。...1分索引

function(n){for(i in 1:n+n*(n-1)/2){F=F+strtoi(substr(paste(1:n^2,collapse=""),i,i))};F}

谢谢@Zachary。您的推定是正确的:)将1个字节的tnx剃光了@Andrius,将另外15个tnx剃光了@ user2390246

@Giuseppe-tstr的tnx。对我来说是新的。5字节以下:)


2
我认为您不需要y=,也不需要括号n*(n-1)/2+1,并且该语言的名称大概也不需要[R]
扎卡里

1
您可以通过更改保存1个字节as.integeras.double
AndriusZ

1
而非x,使用F,因为这已经被初始化为0。
user2390246

1
此外,1:n+a-1与相同a:(a+n-1)。在这种情况下,您无需a预先定义,只需将其直接放在for表达式中即可。那也将允许您取消+ 1 / -1。
user2390246

2
79个字节。使用substring而不是substr因为真的,这只是在子的指数的总和。另外,为您的解决方案包括一个TIO链接总是一件好事:) +1,很棒的工作。
朱塞佩

2

表情符号,182字节

🐖©a🚂➡🚂🍇🍦l➗✖a➕a 1 2🍮t🔤🔤🍮i 0🔁▶l🐔t🍇🍮➕i 1🍮t🍪t🔡i 10🍪🍉🍮s 0🔂g🔪t➖l a a🍇🍮➕s 🍺🚂🔡g 10🍉🍎s🍉

定义一个称为©的方法,该方法采用🚂并返回🚂。1个索引。

在线尝试!

说明:

注意:在Emojicode 0.5中,很多表情符号选择没有太大意义。毕竟是0.x。0.6将解决此问题,因此,如果您想学习(由于不想这样做),我建议您稍等片刻。

Emojicode是一种面向对象的编程语言,具有泛型,协议,可选和闭包,但是该程序不使用闭包,并且所有泛型和协议都可以视为隐式的。

该程序仅适用于几种类型:🚂是整数类型,and是字符串类型。此外,in会出现在条件中,其取值可能为👍(真)或👎(假)。

Emojicode当前没有运算符,因此通常用作运算符的加法,比较和其他运算均作为函数实现,从而有效地使表达式使用前缀表示法。运营商也计划在0.6。

🐖©a🚂➡🚂🍇

©取一个🚂 a并返回🚂。

 🍦l➗✖a➕a 1 2

声明一个l等于第a个三角数的冻结(“常数”)(前缀表示形式的公式)。这表示我们需要生成的数字字符串的长度。

 🍮t🔤🔤

为该变量分配一个空字符串t

 🍮i 0

分配i = 0

 🔁▶l🐔t🍇

l大于长度t

  🍮➕i 1

i += 1

  🍮t🍪t🔡i 10🍪

i将以10为底的文本表示形式附加到t

 🍉

结束循环

 🍮s 0

分配 s = 0

 🔂g🔪t➖l a a🍇

取一个tl - aa - 1th个三角数)开头的子串,长度为a,遍历所有字符

  🍮➕s 🍺🚂🔡g 10

将字符转换为字符串,以10为底数解析整数,解开可选字符(如果字符串不是数字,则不返回任何内容)并添加到s变量中。

 🍉

结束循环

 🍎s

返回s

🍉

结束方法。


1

PHP,66 + 1字节

for($p=($n=$argn)*-~$n/2;$n--;)$r+=join(range(1,$p))[--$p];echo$r;

与管道一起运行-nR在线尝试

需要PHP 5.4或更高版本来为表达式建立索引。



1

APL,28 26 25字节

{+/⍎¨⍵↑⌽(+/⍳⍵)↑∊,/⍕¨⍳⍵×⍵}

使用基于1的索引

在线尝试!

怎么样?

  • ⍳⍵×⍵,1通过输入平方
  • ⍕¨,将每个元素转换为字符串
  • ∊,/,将它们连接在一起
  • (+/⍳⍵)↑,抓住行直到输入
  • ⍵↑⌽,抓住所需的行
  • ⍎¨,将每个元素变成一个数字
  • +/,总和

1

Clojure v1.8,154个字节

1索引

(fn[n](loop[i 1 s(clojure.string/join""(take(* n n)(iterate inc 1)))](if(= i n)(apply +(map #(Character/digit % 10)(take n s)))(recur(inc i)(subs s i)))))

在线尝试!

说明

(take(* n n)(iterate inc 1))  Take the first N*N numbers
(clojure.string/join""...)    Combine them into a string
(loop[i 1 ...](if(= i n)...)  Loop N times
(apply +(map #(Character/digit % 10)(take n s)))  Take N characters from the string, convert to integers and add them
(recur(inc i)(subs s i))      Increment iterator, remove i characters from string

1

Java 8,116 98字节

n->{String t="";int r=0,i=0;for(;i++<n*n;t+=i);for(i=0;i<n;r+=t.charAt(i+++~-n*n/2)-48);return r;}

1索引

-18个字节,感谢@Nevay

说明:

在这里尝试。

n->{                             // Method with integer as both parameter and return-type
  String t="";                   //  Triangle-String
  int r=0,                       //  Result-integer
      i=0;                       //  Index-integer
  for(;i++<n*n;                  //  Loop (1) from 0 to `n^2` (exclusive)
    t+=i                         //   And append String `t` with all the numbers
  );                             //  End of loop (1)
  for(i=0;i<n;                   //  Loop (2) from 0 to `n` (exclusive)
    r+=t.charAt(i+++~-n*n/2)-48  //   And raise the sum `r` by the digits
  );                             //  End of loop (2)
  return r;                      //  Return the resulting sum of digits
}                                // End of method

1
98个字节:n->{String r="";int i=0,x=0;for(;x++<n*n;r+=x);for(x=0;x<n;)i+=r.charAt(x+++~-n*n/2)-48;return i;}
Nevay

1

R,99105,97个字节

a=diag(N<-scan());a[upper.tri(a,T)]=strtoi(strsplit(paste(1:N^2,collapse=""),"")[[1]]);sum(a[,N])

1索引

非高尔夫版本

a <- diag(N<-scan())
a[upper.tri(a, diag=TRUE)] <- strtoi(strsplit(paste(1:N^2, 
                                                  collapse=""),
                                            "")[[1]])
sum(a[,N])

在这里尝试!

感谢@Giuseppe节省了8个字节


描述中提到了@Giuseppe:“您将得到一个整数N。” 这个N用于我的解决方案中 也许我误会了一些东西。
AndriusZ

请参阅说明中链接的“任何标准均值” :)
Giuseppe

@Giuseppe更改并使用了您的建议strtoi
AndriusZ

1
97个字节,带有警告消息。最好在您的描述中包含指向TIO的链接,以便其他人可以对其进行测试!
朱塞佩

@Giuseppe我不知道没有R,但是也许一个函数会使用更少的字节?
NieDzejkob

1

Perl 6,44个字节

{[+] (1..*).flatmap(*.comb).rotor(1..*)[$_]}

测试一下

展开:

{
  [+]        # reduce the result of the following using &infix«+»

  ( 1 .. * ) # infinite range starting at 1

  .flatmap(  # map, then flatten
    *.comb   # split into digits (100 ⇒ 1,0,0)
  )

  .rotor(    # break the sequence into pieces
    1 .. *   # start with 1 value, then 2 values, then 3, etc.
  )\

  [$_]       # index into that infinite sequence
}


0

SOGL V0.1215 13 个字节

²Δr∑.δ∑⌡kmčr∑

在这里尝试!
1个索引。

在解决此问题时,我修复了一个错误,该错误在数字数组上不起作用,并且m错误地采用了隐式输入。

说明:

²              square the input
 Δ             get a range from 1 to that
  r∑           join as a string
    .δ         create a range 0 - input-1
      ∑        sum that
       ⌡       that many times do
        k        remove the 1st character of the joined string
         m     mold to the length of the input
          č    chop into characters
           r∑  convert to numbers and sum

0

C ++,180个字节

-17字节归功于Zacharý

索引从1开始

#include<string>
int s(int n){std::string t;int i=0,p=0;for(;i<=n;)p+=i++;for(i=0;t.size()<p;t+=std::to_string(++i));t=t.substr(0,p).substr(p-n);i=0;for(auto&a:t)i+=a-48;return i;}

最后一行更改为这应该保存两个字节:int s(int n){++n;std::string t;int i=0,p=0;for(;i<=n;)p+=i++;for(i=0;t.size()<p;t+=std::to_string(++i));t=t.substr(0,p);t=t.substr(t.size()-n);i=0;for(auto&a:t)i+=a-48;return i;}
扎卡里

另外,如果你目前正在输入为0指数的,你可以将其转换为1指数和降++n;
扎卡里

@Zacharý谢谢。顺便说一句,由于某些原因,您的代码包含不可见的unicode字符
HatsuPointerKun

是我的C ++建议还是我的APL?APL使用自己的代码页,如果您没有正确的字体,则可能不会正确显示。
扎卡里

@Zacharý您在注释中编写的C ++建议。在零之前有2个unicode字符,这会导致类似"0" identifier is unknownVisual Studio中的错误。对于同样的事情to_stringsize。如果将代码复制并粘贴到notepad ++中并将编码转换为ANSI,则可以看到它,您将??在编辑器中看到一些内容
HatsuPointerKun

0

Pyth 15 14  13字节

s<>sMjkS^Q2sU

在这里尝试!签出测试套件。

13个字节的替代方法:

ssM<>jkS^Q2sU
ssM<>jkS*QQsU
s<>sMjkS^Q2sU

怎么样?

s<>sMjkS^Q2sU    Full program. Q means input.

       S^Q2      The range [1, Q^2].
     jk          Join as a String.
   sM            Convert each character to integer.
  >              All the elements of the above, but the first Q*(Q-1)/2.
 <               All the element of the above but the last Q.
s                Sum.
                 Output implicitly.

0

> <>,​​141 + 2字节

::1+* 2,01\
@}})?/:0$\>$:@{{:
:%a:/?(1:< ,a-]{+1[4
  /~/     \+1~\
1:<]{+1[+4@:-1\?(
{1-}>{:}1(?\@1-@+
    \0}~{{\\n;
@:{{:<-1~$\!?)}}
     ~

1索引

-v标志+ 2b

Tio.run最近似乎真的不喜欢我的> <>程序... 尽管仍然可以在https://fishlanguage.com上进行验证。输入进入“初始堆栈”。

编辑:事实证明tio.run不喜欢它,因为它与fishlanguage.com的处理方式不同。fishlanguage.com在创建或删除新堆栈时会反转堆栈,但tio.run不会。


0

Perl 5,62 + 1(-p)= 63字节

$_=eval(substr((join'',1..$_*$_),($_**2-$_)/2,$_)=~s/./+$&/gr)

在线尝试!

结果是1索引。

怎么样?

将足够多的数字连接在一起,然后在开头跳过不相关的数字(跳过的长度是1到的整数之和n-1)。取下一位n数字,+在每位数字前面放置一个,然后对该方程求值。


0

JavaScript(ES6),78 65字节

f=
n=>eval([...(g=n=>n?g(n-1)+n:``)(n*n).substr(n*~-n/2,n)].join`+`)
<input type=number min=1 oninput=o.textContent=f(this.value)><pre id=o>

1个索引。编辑:由于@tsh,节省了13个字节。


n=>eval([...(g=n=>n?g(n-1)+n:'')(n*n)].join<+>.substr(~-n*n-1,2*n))
tsh

@tsh仍然是高尔夫球手,将比赛放在join`+` 最后...
Neil
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.