子串总和集


26

介绍

让我们来观察此阵:[3, 2, 4, 1, 1, 5, 1, 2]

每个元素显示必须加总的子字符串的长度。让我们看一下上述数组的第一个元素:

[3, 2, 4, 1, 1, 5, 1, 2]
 ^

第一个索引处的元素是3,因此我们现在取一个长度为3的子字符串,其索引与起始位置相同:

[3, 2, 4]

求和时,结果为9,因此子字符串总和集合的第一个元素为9

我们对数组中的所有元素执行此操作:

3 -> [3, 2, 4]
2 -> [2, 4]
4 -> [4, 1, 1, 5]
1 -> [1]
1 -> [1]
5 -> [5, 1, 2]
1 -> [1]
2 -> [2]

您会看到数字5有点奇怪。该数字超出了数组的长度:

[3, 2, 4, 1, 1, 5, 1, 2]
                ^  ^  ^  ^  ^

我们将忽略超出数组的所有内容,因此仅使用[5, 1, 2]

最后一步是总结一切:

[3, 2, 4]     -> 9
[2, 4]        -> 6
[4, 1, 1, 5]  -> 11
[1]           -> 1
[1]           -> 1
[5, 1, 2]     -> 8
[1]           -> 1
[2]           -> 2

这就是需要输出的数组:

[9, 6, 11, 1, 1, 8, 1, 2]

任务

给定一个带有正(非零)整数的非空数组,输出子字符串sum set。这是,因此字节数最少的提交将获胜!

测试用例

[1, 2, 3, 4, 5] -> [1, 5, 12, 9, 5]
[3, 3, 3, 3, 3, 3, 3, 3] -> [9, 9, 9, 9, 9, 9, 6, 3]
[5, 1, 2, 4, 1] -> [13, 1, 6, 5, 1]
[1] -> [1]

我认为您的意思是“子列表”,而不是“子字符串”。没有弦。
mbomb007 '16

4
@ mbomb007我认为子串在这里与最长的常见子串问题(即元素相邻的子序列)具有相同的含义。除了数据类型,字符串只是字母集的元素的有限序列(在这种情况下,为正整数)。
丹尼斯

Answers:


15

果冻,6 个字节

ṫJḣ"ḅ1

在线尝试!验证所有测试用例

怎么运行的

ṫJḣ"ḅ1  Main link. Argument: A (array)

 J      Index; yield the 1-based indices of A.
ṫ       Tail; map k to the postfix of A that begins with the k-th element.
  ḣ"    Vectorized head; for each k in A, truncate the corr. postfix to length k.
    ḅ1  Convert the resulting slices from base 1 to integer.


11

Excel,21个字节

=SUM(OFFSET(A1,,,A1))

打开一个新的电子表格,将测试值放在A列中。在B1中输入公式,然后双击单元格手柄以超出范围。


如果可以的话,请给我第二个赞誉,以教我有关该双击技巧的知识。
尼尔

虽然有效,但由于需要手动输入才能执行,因此有点作弊。
user3819867 '16

3
我认为@ user3819867并不比大多数程序执行多得多。如果您在B1中保存仅包含公式的电子表格,则可能更具可比性-然后打开,将数据添加到A列,然后双击B1上的句柄以执行。YMMV当然。
乔芬'16

7

Python 3,47个字节

lambda X:[sum(X[i:i+k])for i,k in enumerate(X)]

非常简单的实现。Python对于超出列表末尾的切片的默认行为在这里非常方便。



4

JavaScript ES6,50个字节

a=>a.map((e,i)=>a.slice(i,i+e).reduce((a,b)=>a+b))

很不言自明。它map遍历数组中的每个元素,通过索引加上该元素的值sliceiendex中获取,然后reduce通过加法运算。

f=
  a=>a.map((e,i)=>a.slice(i,i+e).reduce((a,b)=>a+b))

;[
  [3, 2, 4, 1, 1, 5, 1, 2],
  [1, 2, 3, 4, 5],
  [3, 3, 3, 3, 3, 3, 3, 3,],
  [5, 1, 2, 4, 1],
  [1]
].forEach(function(test){
  document.getElementById('p').textContent += test + ' => ' + f(test) + '\n';
});
<pre id="p"></pre>


4

J,11个字节

+/@{."_1]\.

用法

   f =: +/@{."_1]\.
   f 3 2 4 1 1 5 1 2
9 6 11 1 1 8 1 2
   f 1 2 3 4 5
1 5 12 9 5

说明

+/@{."_1]\.  Input: A
        ]\.  Get each suffix of A from longest to shortest
   {."_1     For each value in A, take that many values from its corresponding suffix
+/@          Sum that group of values taken from that suffix
             Return the sums

4

JavaScript(ES6),45

reduce 再次殴打!

a=>a.map((v,i)=>eval(a.slice(i,v+i).join`+`))

F=
a=>a.map((v,i)=>eval(a.slice(i,v+i).join`+`))

;[[3, 2, 4, 1, 1, 5, 1, 2],
  [1, 2, 3, 4, 5],
  [3, 3, 3, 3, 3, 3, 3, 3,],
  [5, 1, 2, 4, 1],
  [1]].forEach(t=>console.log(t+' -> '+F(t)))


1
据我所知,您可以删除f=,就像在此答案中一样
LarsW '16

@LarsW对,该f=字节数尚未计入45个字节中
edc65 '16

3

视网膜,38字节

字节数假定为ISO 8859-1编码。

\d+
$*
M!&`\b1(1)*(?<-1>,1+)*
M%`1
¶
,

输入和输出是逗号分隔的列表。

在线尝试!(第一行启用换行分隔的测试套件。)


3

Mathematica 60 55字节

Tr@Take[#,UpTo@#&@@#]&/@Drop[#,t-1]~Table~{t,Length@#}&

例如

f = %; f /@ {{1, 2, 3, 4, 5}, {3, 3, 3, 3, 3, 3, 3, 3}, {5, 1, 2, 4, 1}, {1}}

(*    {{1, 5, 12, 9, 5}, {9, 9, 9, 9, 9, 9, 6, 3}, {13, 1, 6, 5, 1}, {1}}    *)

感谢@MartinEnder削减了5个字节:)


1
这里有一个避免使用该表的想法:#+Tr@Take[x=Rest@x,UpTo[#-1]]&/@(x=#)&仍然不确定它是最佳的,但是它节省了17个字节。
Martin Ender

3

05AB1E,11 8字节

[D¬£Oˆ¦Ž

说明

[         # infinite loop
 D        # duplicate current list
  ¬       # get head of list
   £      # get that many elements from list
    O     # sum
     ˆ    # add to global array
      ¦   # remove first element of list
       Ž  # break if stack is empty
          # implicitly push and print global array

在线尝试



2

Erlang,69个字节

f(A)->put(1,1),L=lists,[L:sum(L:sublist(A,put(1,get(1)+1),X))||X<-A].

Erlang的列表高阶函数不接收当前元素的索引。这使用过程字典来设置当前元素的索引。



2

VBA,160字节

Function e(g())
Dim h()
k=LBound(g)
l=UBound(g)
ReDim h(k To l)
On Error Resume Next
For i=k To l
For j=i To i+g(i)-1
h(i)=h(i)+g(j)
Next
Next
e=h
End Function

2

Pyth,6个字节

ms<~tQ

测试套件

到目前为止,这是与其他解决方案不同的解决方案。它在输入上循环,对初始值求和,然后将所存储输入的第一个元素删除,然后重复。

说明:

ms<~tQ
ms<~tQdQ    Implicit variable introduction
            Implicit: Q = eval(input())
m      Q    Map d over the input, Q
  <  Qd     Take the first d elements of Q
 s          Sum them
   ~tQ      Afterwards, set Q to the tail of Q, removing the first element.


1

F#,84 82字节

let f(A:int[])=[for i in 0..A.Length-1->Seq.skip i A|>Seq.truncate A.[i]|>Seq.sum]

1

JavaScript(ES6)-79字节

不使用任何Array方法的递归解决方案:

f=([a,...t],n)=>a&&n?a+f(t,n-1):0;g=([a,...t],r=[])=>a?g(t,[...r,a+f(t,a-1)]):r

测试:

f=([a,...t],n)=>a&&n?a+f(t,n-1):0;
g=([a,...t],r=[])=>a?g(t,[...r,a+f(t,a-1)]):r;

[
  [3, 2, 4, 1, 1, 5, 1, 2],
  [1, 2, 3, 4, 5],
  [3, 3, 3, 3, 3, 3, 3, 3,],
  [5, 1, 2, 4, 1],
  [1]
].forEach(a=>console.log(''+g(a)));


1

C#,89个字节

int[]s(List<int>a)=>a.Select((n,i)=>a.GetRange(i,Math.Min(n,a.Count-i)).Sum()).ToArray();

很简单

改进想法表示赞赏


1

Brachylog,27个字节

.v|h~l(A:Tc?;A?)b:0&~b.h~+A

在线尝试!验证所有测试用例

说明

  .v           Input = Output = []
|            Or
  h~l          A is a list, its length is the value of the first element of the Input
  (
    A:Tc?        The concatenation of A with another list T results in the Input
  ;            Or
    A?           A = Input
  )
  b:0&         Call recursively on Input minus the first element
  ~b.          Output is the output of that call with an extra element at the beginning
  h~+A         That extra element is the sum of the elements of A

1

Dyalog APL,15个字节

{+/¨⍵↑∘⌽¨⌽,\⌽⍵}

要么

{⌽+/¨(-↑¨,\)⌽⍵}

1

PHP程序,72字节

<?foreach($a=$_GET[a]as$i=>$v)echo array_sum(array_slice($a,$i,$v)),"
";

打电话给 php-cgi -f <filename> 'a[]=3&a[]=2&a[]=4...

+11功能:

function f($a){foreach($a as$i=>$v)$r[]=array_sum(array_slice($a,$i,$v));return$r;}

+9,不带内置命令:

function p($a){foreach($c=$r=$a as$i=>$v)for($k=$i;$k--;)if(--$a[$k]>0)$r[$k]+=$v;return$r;}

($ c保留原始值,$ a为每个索引递减,$ r获取总和)

-3作为程序:

<?foreach($a=$r=$c=$_GET[a]as$i=>$v)for($k=$i;$k--;)if(--$c[$k]>0)$r[$k]+=$v;print_r($r);

1

q(37个字节)

{sum each(til[count x],'x)sublist\:x}

例:

q){sum each(til[count x],'x)sublist\:x}3 2 4 1 1 5 1 2
9 6 11 1 1 8 1 2

1

Matricks,25个字节

是的,最后一个挑战是我不需要新功能!

md{z:l-g:c;+c;q:c;};:1:l;

运行: python matricks.py substring.txt [[<input>]] 0

说明:

m                  :1:l;   #loop over entire input
                           #set each value to...
 d{               }        #the sum of...
   z:l-g:c:+c;q:c;         #the input cropped to
                           #the length of the value in the cell

1

Javascript(使用外部库)(66字节)

n=>_.From(n).Select((v,i)=>_.From(n).Slice(i,i+v).Sum()).ToArray()

链接到lib:https : //github.com/mvegh1/Enumerable

代码说明:_.From将输入数组加载到库中,该库基本上是js的LINQ。然后,根据以下谓词映射数组中的每个项目:取得输入,并从当前项目索引中对其进行切片,然后获取该索引加上当前项目的值。然后总结该子序列。将结果转换为本地JS数组并返回

在此处输入图片说明


var 从变量中删除,您不需要在高尔夫中使用。您也可以更改.forEach.map花费更少的字节。
charredgrass

哦,是的,您对var是正确的。谢谢!明天我将再次回答这个问题。看来本机JS(es6)杀死了我的解决方案,大声笑
applejacks01 '16

删除var的好方法。我还意识到了另一种解决方案,它可以大大减少字节数,并且也更加直观
applejacks01 2016年

1

Clojure,63个字节

(defn f[[b & r]](concat[(apply + b(take(dec b)r))](if r(f r))))

使用模式匹配将输入参数分解为第一个和其余参数。


1

MATL17 14 13字节

fGy+!-R0<G*!s

说明

在线尝试!验证所有测试用例(已修改代码以处理多个输入)。

f     % Take input implicitly. Indices of nonzero elements: this gives [1 2 ... n]
      % where n is input size
G     % Push input again
y     % Push a copy of [1 2 ... n]
+     % Add. Gives [a+1 b+2...] where [a b...] is the input
!     % Transpose into a column vector
-     % Subtraction with broadcast. Gives 2D array
R     % Keep upper triangular part, making the rest of entries 0
0<    % True for negative entries. Each row corresponds to a substring sum.
      % For each row, this gives true for the entries of the input that make up
      % that substring sum. Each row is thus a mask to select entries of the input
G     % Push input again
*     % Multiply with broadcast. This multiplies the input times each row
!s    % Sum of each row. Implicitly display

0

C#,94个字节

Console.Write(String.Join(",",a.Select((v,i)=>a.Skip(i).Take(v).Sum().ToString()).ToArray()));

其中a是表示要求解的输入的int []。


you arent allowed to assume a variable is predefined
downrep_nation

The variable a is the input to be solved.
supermeerkat
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.