重叠切片的按列求和


19

任务

给定的整数的列表大号和另一个整数小号中,目标是计算所有的列方向总和小号 -length(可能重叠的)的切片大号,而关于相对于它们的位置大号(见下文)。

定义

小号 -length (重叠)切片列表的大号都的连续子序列(不包裹)大号是长度的小号

为了使切片s相对于L 的位置相关,您可以想象构建一个“阶梯”,其中每个切片s ii的位置都从开始偏移。


眼镜

  • s是一个大于1的整数,并且严格小于L的长度。
  • L将始终包含至少3个元素。
  • 您可以使用任何编程语言进行竞争,并且可以通过任何标准方法接受输入并提供输出,同时请注意,默认情况下会禁止这些漏洞。这是,因此每种语言的最短提交(以字节为单位)将获胜。

示例和测试用例

这是一个工作示例:

[1, 2, 3, 4, 5, 6, 7, 8, 9], 3

[1, 2, 3]
   [2, 3, 4]
      [3, 4, 5]
         [4, 5, 6]
            [5, 6, 7]
               [6, 7, 8]
                  [7, 8, 9]
-------------------------------- (+)  | column-wise summation
[1, 4, 9, 12, 15, 18, 21, 16, 9]

还有更多测试用例:

[1, 3, 12, 100, 23], 4         -> [1, 6, 24, 200, 23]
[3, -6, -9, 19, 2, 0], 2       -> [3, -12, -18, 38, 4, 0]
[5, 6, 7, 8, 2, -4, 7], 3      -> [5, 12, 21, 24, 6, -8, 7]
[1, 2, 3, 4, 5, 6, 7, 8, 9], 3 -> [1, 4, 9, 12, 15, 18, 21, 16, 9]
[1, 1, 1, 1, 1, 1, 1], 6       -> [1, 2, 2, 2, 2, 2, 1]
[1, 2, 3, 4, 5, 6, 7, 8, 9], 6 -> [1, 4, 9, 16, 20, 24, 21, 16, 9]

2
第一个测试用例很烦人。;)仅因为s大于L/2。也许会添加更多的测试用例,例如[1, 1, 1, 1, 1, 1, 1], 6 -> [1、2、2、2、2、2、2、1]还是[1, 2, 3, 4, 5, 6, 7, 8, 9], 6 -> [1, 4, 9, 16, 20, 24, 21, 16, 9]
凯文·克鲁伊森

2
@KevinCruijssen您能帮我编辑一下吗?这些是一些很好的测试用例,但是我现在正在使用手机;)谢谢!
Xcoder先生18年

Answers:


11

J11,9 8字节

-1字节感谢英里!

[:+//.]\

怎么运行的?

左边的参数是s,右边的参数是-L

]\ -将L分为长度为s的子列表

/. -提取斜对角线(反对角线)

+/ -加起来

[: -用上述动词制作叉子

这是第一个测试用例的示例J会话:

   a =. 1 2 3 4 5 6 7 8 9

   ] 3 ]\ a 
1 2 3
2 3 4
3 4 5
4 5 6
5 6 7
6 7 8
7 8 9

   ] </. 3 ]\ a 
┌─┬───┬─────┬─────┬─────┬─────┬─────┬───┬─┐
│1│2 2│3 3 3│4 4 4│5 5 5│6 6 6│7 7 7│8 8│9│
└─┴───┴─────┴─────┴─────┴─────┴─────┴───┴─┘

   ] +//. 3 ]\ a 
1 4 9 12 15 18 21 16 9

在线尝试!


“斜对角线”和“对角线”之间有什么区别吗
Luis Mendo

@Luis Mendo-我认为“倾斜”是指在J副词的情况下是从左下到右上/.,而不是主对角线是从左上到右下。
Galen Ivanov '18

1
嗯谢谢 所以这就是我们的通常被称为反对角线
路易斯Mendo

2
您可以替换,/\]\
miles

@miles是的,当然!谢谢!
加伦·伊凡诺夫

9

Haskell59 56字节

s#n=[x*minimum[n,i,length s+1-max i n]|(i,x)<-zip[1..]s]

在线尝试!

定义一个函数(#),该函数将一个列表s和一个数字n作为参数。

这是基于这样的观察,对s = [1, 2, 3, 4, 5, 6, 7, 8, 9]n = 3

[1, 2, 3]
   [2, 3, 4]
      [3, 4, 5]
         [4, 5, 6]
            [5, 6, 7]
               [6, 7, 8]
                  [7, 8, 9]
---------------------------- (+)
[1, 4, 9,12,15,18,21,16, 9]

是相同的

[1, 2, 3, 4, 5, 6, 7, 8, 9]
[1, 2, 3, 3, 3, 3, 3, 2, 1]
---------------------------- (*)
[1, 4, 9,12,15,18,21,16, 9]

为了生成这个最初增加,然后恒定,最后减少的列表,我们可以从

[minimum[i, length s + 1 - i] | i<-[1..length s]]

产生[1, 2, 3, 4, 5, 4, 3, 2, 1]n作为附加约束添加到minimum表达式中会产生的正确列表[1, 2, 3, 3, 3, 3, 3, 2, 1]答案n = 3,尽管对于n = 6(或通常是any n > lengths s/2length s + 1 - n需要附加约束:

[minimum[i, n, length s + 1 - i, length s + 1 - n] | i<-[1..length s]]

或更短:

[minimum[i, n, length s + 1 - max i n] | i<-[1..length s]]

对于使用[1..length s]压缩的成对乘法s,并且由于zip将较长的列表截断为较短的列表的长度,[1..]因此可以使用无限列表:

[x * minimum[i, n, length s + 1 - max i n] | (i,x)<-zip[1..]s]

6

JavaScript(ES6),65 62 58字节

@Shaggy节省了4个字节

以currying语法接受输入(a)(n)

a=>n=>a.map((v,i)=>v*Math.min(++i,n,a.length+1-(n>i?n:i)))

测试用例


可以a=>n=>a.map((v,i)=>v*Math.min(++i,n,a.length+1-(n>i?n:i)))工作58个字节吗?
毛茸茸的

@Shaggy不知何故,我知道我的代码中确实有一些愚蠢的东西,但无法弄清楚……非常感谢!
Arnauld

6

Java 8,83字节

L->s->{for(int i=0,l=L.length+1,t,u;++i<l;u=l-(s>i?s:i),L[i-1]*=t<u?t:u)t=i<s?i:s;}

第一个测试用例(以及我添加的最后两个)用了好几次,但现在终于可以用了..:D

修改输入数组,而不返回一个新数组。

说明:

在线尝试。

L->s->{                  // Method with int-array and int parameters, and no return-type
  for(int i=0,           //  Index-integer, starting at 0
      l=L.length+1,      //  The length of the input-array + 1
      t,u;               //  Two temp integers
      ++i<l              //  Loop `i` from 1 to the length (inclusive)
      ;                  //    After every iteration:
       u=l               //     Set temp integer `u` to the length plus 1,
          -(s>i?s:i),    //     minus the highest of `s` and `i`
       L[i-1]*=t<u?t:u)  //     And replace the item with the lowest of `t` and `u`
    t=i<s?i:s;}          //   Set temp integer `t` to the lowest of `i` or `s`


5

MATL,8字节

YCPT&Xds

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

说明

考虑输入[1, 3, 12, 100, 23]4

YC     % Implicit inputs: row vector L and number s. Create matrix of 
       % overlapping blocks of L with length s, where each block is a column
       % STACK: [  1   3;
                   3  12;
                  12 100;
                 100  23]
P      % Flip vertically
       % STACK: [100  23;
                  12 100;
                   3  12;
                   1   3]
&TXd   % Extract all diagonals, starting from bottom-left, and arrange them as
       % columns of a matrix, with zero padding
       % STACK: [1   3  12 100   0;
                 0   3  12 100  23]
s      % Sum of each column. Since s is less than the length of L, there are
       % at least two rows. Thus function `s` can be used instead of `Xs`.
       % Implicit display
       % STACK: [1   6  24 200  23]

5

APL(Dyalog Unicode)19个 14 字节SBCS

-5感谢ngn。

匿名默认隐式函数,以s为左参数,L为右参数。假设⎕IOI ndex O rigin)0在许多系统上都是默认设置。

+⌿∘↑((0,⊢)\,/)

在线尝试!

案例说明 [1,3,12,100,23]

() 应用以下匿名默认功能:

,/ 相同大小的重叠窗口; [[1,3,12],[3,12,100],[12,100,23]]

()\ 累积将此默认值应用于以下匿名默认值功能:

   最右边的参数

  0, 左侧为零

累积约简意味着我们将函数插入到连续项之间的每个“空格”中,从右到左工作。对于每个“空格”,该函数将丢弃左参数,但附加一个附加的零。实际上,这会在每一项的后面加上与它左边的“空格”一样多的零,因此第一项获得零个空格,第二项获得一个空格,第三个项获得两个空格:[[1,3,12],[0,3,12,100],[0,0,12,100,23]]

 通过将列表合并到一个矩阵中,并用零填充来提高排名;
┌ ┐
│1 3 12 0 0│
│0 3 12 100 0│
│0 0 12 100 23│
└ ┘
 然后
+⌿ 垂直求和;[1,6,36,200,23]


1
⊢,⍨¨0⍴⍨¨⍳∘≢->{0,⍵}\
ngn

@ngn您总是想到这些巧妙的减少方法,但您确实应该单独发布此方法。顺便说一句,我觉得+⌿∘↑((0,⊢)\,/)更优雅。
亚当

哦,来吧,这显然是简化解决方案的一部分,而不是新的想法
ngn

@ngn同时,解决 CMC!
亚当

我不确定这是否在此处的评论中成为话题,但是为什么不使用“ each”呢?2{(⊃⌽⍺),⊃⍵}/⊢->2{⊃¨(⌽⍺)⍵}/⊢
ngn

4

果冻,6个字节

JṡṬS×ḷ

在线尝试!

怎么运行的

JṡṬS×ḷ  Main link. Left argument: A (array). Right argument: n (integer)

J       Indices; yield [1, ..., len(A)].
 ṡ      Split the indices into overlapping slices of length n.
  Ṭ     Untruth; map each array of indices to a Boolean vector, with 1's at the
        specified indices and 0's elsewhere.
        For example, [3, 4, 5] maps to [0, 0, 1, 1, 1].
   S    Sum the rows, essentially counting how many times each index appears in
        the arrays returned by the ṡ atom.
     ḷ  Left; yield A.
    ×   Multiply the counts to the left with the integers to the right.

3

Japt,13个字节

s>> 时,花很长时间才使它起作用L/2

Ë*°EmVUÊÄ-EwV

尝试一下


说明

                 :Implicit input of array U and integer V
Ë                :Map over each element at 0-based index E in U
 *               :  Multiply by
    m            :  The minumum of
  °E             :    E incremented,
     V           :    V,
          EwV    :    and the maximum of E & V
         -       :    subtracted from
      UÊÄ        :    the length of U plus 1

“当它开始工作时,花了太长时间s > L/2 ”我完全一样。其他测试用例很简单,但是第一个(和我最后添加的两个)很烦人!..我+1!
凯文·克鲁伊森




1

R52 51字节

function(l,s)l*pmin(s,x<-seq(l),y<-rev(x),y[1]+1-s)

在线尝试!

这相当于莱科尼的答案

seq(l)产生索引,1...length(l)因为length(l)>1(否则它将产生1...l[1])。我将其另存为x,将其反向另存为y,并采用ylength(l))的第一个元素来巧妙地移植Laikoni的答案并保存一个字节!

原始答案,52个字节

function(l,s,L=sum(l|1)+1)l*pmin(s,x<-2:L-1,L-x,L-s)

在线尝试!

输出l的elementwise由最小的相乘s,该元件的基于1的索引xlength(l)-x+1length(L)-s+1

这也等同于Laikoni的答案,使用L-x而不是rev(x)较短的答案。


1

APL + WIN,25个字节

提示屏幕输入L,后跟s

+/(1-⍳⍴z)⌽¨(⍴L)↑¨s←⎕,/L←⎕

说明:

L←⎕ prompt for screen input of L

s←⎕,/ prompt for screen input of s and create nested vector of successive s elements of L

(⍴L)↑¨ pad each element of the nested vector with zeros to the length of L

(1-⍳⍴z)⌽¨ incrementally rotate each element of the nested vector

+/ sum the elements of the nested vector

1

K(oK),30个字节

解:

{+/t,'(y':x),'|t:(!1-y-#x)#'0}

在线尝试!

例:

{+/t,'(y':x),'|t:(!1-y-#x)#'0}[3 -6 -9 19 2 0;2]
3 -12 -18 38 4 0

说明:

不要以为我可以和J竞争。生成要添加到滑动窗口列表中的零列表,然后加起来:

{ t,'(y':x),'|t:(!(#x)+1-y)#'0 }[1 2 3 4 5 6 7 8 9;3]
(1 2 3 0 0 0 0 0 0
 0 2 3 4 0 0 0 0 0
 0 0 3 4 5 0 0 0 0
 0 0 0 4 5 6 0 0 0
 0 0 0 0 5 6 7 0 0
 0 0 0 0 0 6 7 8 0
 0 0 0 0 0 0 7 8 9)

细分如下...尽管仍然感到笨拙。

{+/t,'(y':x),'|t:(!1-y-#x)#'0} / the solution
{                            } / lambda taking x and y implicitly
                          #'0  / take (#) each (') zero
                 (       )     / do this together
                       #x      / count (#) length of x
                     y-        / take count away from length y
                   1-          / take that result from 1
                  !            / til, generate range to that number
               t:              / save in variable t
              |                / reverse it
            ,'                 / join with each
      (y':x)                   / sliding window size y over x
    ,'                         / join with each
   t                           / prepend t
 +/                            / sum up

1

外壳,4个字节

mΣ∂X

在线尝试!

使用Galen Ivanov的J答案中的想法。

说明

     -- implicit input number n and list s, e.g. s = [1,2,3,4,5,6] and n = 4 
   X -- get sublists of length n of list s           [[1,2,3,4],[2,3,4,5],[3,4,5,6]]
  ∂  -- anti-diagonals                               [[1],[2,2],[3,3,3],[4,4,4],[5,5],[6]]
mΣ   -- get the sum of each of the lists             [1,4,9,12,10,6]




0

C(gcc)83 81 79字节

列表的处理基本上分为三个“阶段”:加速,维持和冷却。随着清单的增加,我们将增加系数,直到达到最大值。如果整个切片都可以放入列表中,则此最大值将与切片的长度相同。否则,它将与适合的切片数相同。在另一端,我们将再次减小因子,以在最后一个元素上降为1。

保持这一平稳期的加速和冷却阶段的长度比最大因子短一。

合并之前的未循环的循环有望使其更加清晰(R =上升阶段的长度):

for (r = 1; r <= R; r++) L[r - 1] *= r;
for (; r < n - R; r++)   L[r - 1] *= R + 1;
for (; r < n; r++)       L[r - 1] *= n - r + 1;

三个循环实在太多了,因此基于r确定因数可得到一个循环(使用s来保存R的字节):

r;f(L,n,s)int*L;{for(r=0,s=2*s-1>n?n-s:s-1;r++<n;)*L++*=r>s?r<n-s?s+1:n-r+1:r;}

在线尝试!


0

Perl,45 44字节

包括+4,-ai 也请注意,此代码在启动时给出2个perl警告。您可以通过添加X选件来消除这些风险

-i选项和STDIN的一行上给出数组之后的掩码长度:

perl -ai4 -E 'say$_*grep$_~~[$^I..@F],$a..$^I+$a++for@F' <<< "1 3 12 100 23"

只是代码:

say$_*grep$_~~[$^I..@F],$a..$^I+$a++for@F


0

Clojure,72个字节

#(let[R(range 1(inc(count %)))](map *(map min(repeat %2)R(reverse R))%))

0

Pyt,106 字节

ĐŁĐ←⇹řĐ↔Đ04ȘĐ04Ș>Đ04Ș03Ș¬*07ȘážÁ*+04Ș⇹Đ3ȘĐ3Ș-⁺Đ4Ș⇹ŕĐ3Ș<Ь3Ș*3Ș*+⇹ĐŁ⑴04Ș3Ș⇹04Ș*Đ04ȘĐ04Ș<Đ04Ș*06ȘážÁ03Ș¬*++*

将第一行上的L作为数组,将第二行上的s

说明:

                     Implicit input (L)
Đ                    Duplicate L
ŁĐ                   Get length of L (len) and push it twice
←                    Get s
⇹ř                   Push [1,2,...,len]
Đ↔Đ                  Push [len,...,2,1] twice
04ȘĐ                 Push 0, flip top 4 on stack, and duplicate top [1,2,...,len]
04Ș>                 Is [len,...,2,1]>[1,2,...,len] (element-wise) [boolean array]
Đ                    Duplicate top of stack                   
04Ș03Ș¬*             Pushes [1,2,...,ceil(len/2),0,...,0]
07ȘážÁ               Push 0, flip top seven on stack, and remove all 0s from stack
*                    Pushes [0,0,...,0,floor(len/2),floor(len/2)-1,...,1]
+                    Adds top two on stack element-wise

The top of the stack is now:
     [1,2,...,ceil(len/2),floor(len/2),...,2,1] (let's call it z)

04Ș                  Push zero and swap top four on stack
⇹                    Swap top two on stack
Đ3ȘĐ3Ș-⁺Đ4Ș⇹ŕĐ3Ș<Ь3Ș*3Ș*+     Pushes min of (len-s+1,s) [let's call it m]
⇹ĐŁ⑴04Ș3Ș⇹04Ș*                Pushes an array [m,m,...,m] with length len
Đ04ȘĐ04Ș<Đ04Ș*06ȘážÁ03Ș¬*++    Pushes element-wise min of [m,m,...,m] and z
*                              Element-wise multiplication of above with L

在线尝试!


0

Python + numpy,64个字节

from pylab import *
lambda l,N:convolve(*ones((2,len(l)-N-1)))*l

以l作为列表,以N作为长度进行调用。

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.