我的数组中有回声…我的数组中有回声…我的数组


34

救命!我的某些数组中似乎有一个令人讨厌的回声,我想摆脱它。发生这种情况时,原始数组会在中间的某个位置重复自身,从而使这些值彼此相加。

例如,数组[ 422, 375, 527, 375, 859, 451, 754, 451 ]包含自身的回声,如下所示:

[ 422, 375, 527, 375, 859, 451, 754, 451 ] <-- array with echo (input)

[ 422, 375, 105,   0, 754, 451           ] <-- original array (output)
[           422, 375, 105,   0, 754, 451 ] <-- echo of original array

范例2:

[ 321, 526, 1072, 899, 6563, 798, 7038, 3302, 3032, 3478, 1806, 601 ] <-- input

[ 321, 526,  751, 373, 5812, 425, 1226, 2877, 1806,  601            ] <-- output
[            321, 526,  751, 373, 5812,  425, 1226, 2877, 1806, 601 ]

数组中也可能没有回声,在这种情况下,将返回原始数组:

范例3:

[ 623, 533, 494, 382 ] <-- input
[ 623, 533, 494, 382 ] <-- output

挑战:

给定一个可能包含回声的数组,请将其删除并返回没有回声的数组。

输入:

  • 阵列,列表,分隔的字符串,打孔卡或平台-合适当量,含有三个或更多个整数,在范围0ñ<10000与至少一种元素>0
  • 回声不能在第一个元素或最后一个元素之后开始。
  • 回声将在输入中仅出现一次或完全不出现。

输出:

  • 阵列,列表,整数等0ñ<10000,与回波除去。
  • 如果没有回声,则返回原始数组。

规则和评分:

测试用例:

有回声:

[ 422, 375, 527, 375, 859, 451, 754, 451 ]
[ 422, 375, 105, 0, 754, 451 ]

[ 321, 526, 1072, 899, 6563, 798, 7038, 3302, 3032, 3478, 1806, 601 ]
[ 321, 526, 751, 373, 5812, 425, 1226, 2877, 1806, 601 ]

[ 4330, 3748, 363, 135, 2758, 3299, 1674, 1336, 4834, 2486, 4087, 1099, 4098, 4942, 2159, 460, 4400, 4106, 1216, 3257, 1638, 2848, 3616, 3554, 1605, 490, 1308, 2773, 3322, 3284, 4037, 7109, 4171, 5349, 2675, 3056, 4702, 4229, 1726, 5423, 6039, 8076, 6047, 7088, 9437, 4894, 1946, 7501, 5331, 3625, 5810, 6289, 2858, 6610, 4063, 5565, 2200, 3493, 4573, 4906, 3585, 4147, 3748, 3488, 5625, 6173, 3842, 5671, 2555, 390, 589, 3553, 3989, 4948, 2990, 4495, 2735, 1486, 3101, 1225, 2409, 2553, 4651, 10, 2994, 509, 3960, 1710, 2185, 1800, 1584, 301, 110, 969, 3065, 639, 3633, 3544, 4268 ]
[ 4330, 3748, 363, 135, 2758, 3299, 1674, 1336, 4834, 2486, 4087, 1099, 4098, 4942, 2159, 460, 4400, 4106, 1216, 3257, 1638, 2848, 3616, 3554, 1605, 490, 1308, 2773, 3322, 3284, 4037, 2779, 423, 4986, 2540, 298, 1403, 2555, 390, 589, 3553, 3989, 4948, 2990, 4495, 2735, 1486, 3101, 1225, 2409, 2553, 4651, 10, 2994, 509, 3960, 1710, 2185, 1800, 1584, 301, 110, 969, 3065, 639, 3633, 3544, 4268 ]

[ 24, 12, 52, 125, 154, 3, 567, 198, 49, 382, 53, 911, 166, 18, 635, 213, 113, 718, 56, 811, 67, 94, 80, 241, 343, 548, 68, 481, 96, 79, 12, 226, 255, 200, 13, 456, 41 ]
[ 24, 12, 52, 125, 154, 3, 567, 198, 25, 370, 1, 786, 12, 15, 68, 15, 88, 348, 55, 25, 55, 79, 12, 226, 255, 200, 13, 456, 41 ]

[ 1, 3, 2 ]
[ 1, 2 ]

[ 0, 1, 3, 2, 0 ]
[ 0, 1, 2, 0 ]

没有回声:

[ 623, 533, 494, 382 ]
[ 623, 533, 494, 382 ]

[ 1141, 1198, 3106, 538, 3442, 4597, 4380, 3653, 1370, 3987, 1964, 4615, 1844, 5035, 2463, 6345, 4964, 4111, 5192, 8555, 5331, 3331, 4875, 6586, 5728, 4532, 5972, 2305, 3491, 6317, 2256, 2415, 5788, 4873, 6480, 2080, 5319, 4551, 6527, 5267, 4315, 2178, 2615, 5735, 5950, 6220, 7114, 6259, 5000, 4183, 6822, 6927, 7150, 8003, 5603, 3154, 8231, 5005, 5743, 6779, 4530, 4029, 5336, 6105, 4777, 6183, 6838, 5725, 6819, 8584, 3142, 3840, 3291, 4284, 2933, 4859, 2906, 5176, 2853, 2110, 2048, 4389, 4501, 2267, 2704, 431, 1495, 2712, 3008, 187, 3487, 630 ]
[ 1141, 1198, 3106, 538, 3442, 4597, 4380, 3653, 1370, 3987, 1964, 4615, 1844, 5035, 2463, 6345, 4964, 4111, 5192, 8555, 5331, 3331, 4875, 6586, 5728, 4532, 5972, 2305, 3491, 6317, 2256, 2415, 5788, 4873, 6480, 2080, 5319, 4551, 6527, 5267, 4315, 2178, 2615, 5735, 5950, 6220, 7114, 6259, 5000, 4183, 6822, 6927, 7150, 8003, 5603, 3154, 8231, 5005, 5743, 6779, 4530, 4029, 5336, 6105, 4777, 6183, 6838, 5725, 6819, 8584, 3142, 3840, 3291, 4284, 2933, 4859, 2906, 5176, 2853, 2110, 2048, 4389, 4501, 2267, 2704, 431, 1495, 2712, 3008, 187, 3487, 630 ]

[ 4791, 1647, 480, 3994, 1507, 99, 61, 3245, 2932, 8358, 6618, 1083, 5391, 3498, 4865, 1441, 3729, 5322, 5371, 6271, 2392, 1649, 5553, 9126, 3945, 2179, 3672, 2201, 4433, 5473, 4924, 6585, 6407, 3862, 6505, 1530, 5293, 4792, 6419, 6739, 3258, 3839, 3891, 7599, 2576, 5969, 5659, 6077, 5189, 1325, 4490, 5694, 6567, 6367, 5724, 5756, 6450, 5863, 4360, 2697, 3100, 3779, 4040, 4653, 1755, 3109, 2741, 3269 ]
[ 4791, 1647, 480, 3994, 1507, 99, 61, 3245, 2932, 8358, 6618, 1083, 5391, 3498, 4865, 1441, 3729, 5322, 5371, 6271, 2392, 1649, 5553, 9126, 3945, 2179, 3672, 2201, 4433, 5473, 4924, 6585, 6407, 3862, 6505, 1530, 5293, 4792, 6419, 6739, 3258, 3839, 3891, 7599, 2576, 5969, 5659, 6077, 5189, 1325, 4490, 5694, 6567, 6367, 5724, 5756, 6450, 5863, 4360, 2697, 3100, 3779, 4040, 4653, 1755, 3109, 2741, 3269 ]

[ 235, 121, 52, 1249, 154, 26, 5672, 1975, 482, 3817, 532, 9104, 1661, 171, 6347, 2124, 1122, 7175, 558, 8101, 667, 934, 798, 2404, 3424, 5479, 672, 4808, 956, 789, 123, 2255, 2549, 200, 126, 4562, 41 ]
[ 235, 121, 52, 1249, 154, 26, 5672, 1975, 482, 3817, 532, 9104, 1661, 171, 6347, 2124, 1122, 7175, 558, 8101, 667, 934, 798, 2404, 3424, 5479, 672, 4808, 956, 789, 123, 2255, 2549, 200, 126, 4562, 41 ]

[ 1, 1, 1, 1, 1 ]
[ 1, 1, 1, 1, 1 ]

3
如果有多个可能的输出怎么办?输入:[1, 2, 2, 2, 1]; 输出:[1, 1, 1, 1]vs[1, 2, 1]
tsh

3
什么是预期的输出[1, 2, 3, 1, 2, 3][1, 2, 3, 0, 1, 2, 3][0, 1, 3, 2, 0]?当前的答案在所有这些输入上并不一致。
tsh

@tsh这些([1, 1, 1, 1][1, 2, 1])中的任何一个都是可以接受的。我最初有一个选择规则,但由于它似乎仅适用于少数边缘情况,因此在沙盒中取消了选择。
640KB

@tsh,[0, 1, 3, 2, 0]应该是[0, 1, 2, 0]-我已添加到测试用例中。[1, 2, 3]尽管根据规则我不会考虑那些有效的测试用例,但对另外两个的预期答案可能是the original array repeats itself somewhere in the middle
640KB

1
@nimi好人。我想说[0,0,0](或任何大小的all- 0的数组)代表任何东西的回声还是[0,0,0](对于任何特殊情况)(无回声)是否也都是有效答案都是模棱两可的,因为没有足够的信息来确定哪个它是。我将更新规则以限制其为有效输入,因为这不会使任何现有答案无效或改变。
640KB

Answers:


8

MATL,16字节

t"GX@WQB&Y-~?w]x

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

说明

多项式除法取胜!

t      % Implicit input. Duplicate
"      % For each (do the following as many times as input length)
  G    %   Push input again. This will be the output if no solution exists
  X@   %   Push current iteration index, k
  WQB  %   2 raised to that, add 1, convert to binary. Gives [1 0 ... 0 1] (k-1 zeros)
  &Y-  %   Two-output polynomial division (deconvolution). Gives quotient and remainder
  ~    %   Logical negate: transforms zeros into 1, nonzeros into 0
  ?    %   If all values are nonzero (i.e. if remainder was all zeros): solution found
    w  %      Swap. This moves the copy of the input to top (to be deleted)
  ]    %   End
  x    %   Delete. This deletes the quotient if it was not a solution, or else deletes
       %   the copy of the input
       % End (implicit). Since it is guaranteed that at most one solution exists, at this
       % point the stack contains either the solution or the input
       % Implicit display

没有任何人接受“ eso”或“历史性”语言的赏金...因此赏金会受到欢迎!
640KB

1
@ 640KB我不知道这次挑战有没有悬赏!谢谢!
路易斯·门多

7

哈斯克尔,167个字节

首先,重要的是要注意,如果存在回声,则输入数组是另一个数组与某种形式的数组的卷积 [1,1],[1,0,1],[1,0,0,1],...

这意味着我们只需要检查所有这些数组。但是离散卷积/解卷积与多项式乘法/长除法相同,因此这只是使用多项式的实现,如果可能的话,每次都返回商。

缩短整个过程的一个技巧是,除了上述数​​组以外,还检查是否[1]作为基本情况,因为如果没有其他数组起作用,则反卷积[1]将起作用并将返回原始多项式。

import Math.Polynomial
import Data.Ratio
p=poly LE
c z=last[polyCoeffs LE q|k<-zipWith const[p(take k(1:repeat 0)++[1])|k<-[0..]]z,(q,r)<-[quotRemPoly(p z)k],r==zero] 

在线尝试!


基本案例的好技巧!我试图将其合并到我的答案中,但是我可以缩短代码
Luis Mendo

4

JavaScript的211 171 145字节

s=>{for(n=x=0,y=s.length;++x<y/2&!n;)for(n=s.slice(i=0,x);i+x<y-x&&n;)n=(n[i+x]=s[i+x]-n[i++])<0?0:n;return n&&n.slice(1-x)+''==s.slice(1-x)?n:s}

在线尝试

来自40个字节 Kevin Cruijssen的

来自的另外26个字节 Arnauld的

我的第一个代码高尔夫球答案,使潜在的偏移量无效,并根据找到的内容返回原始数组或新数组。如果有人知道如何缩短时间,请告诉我,这似乎是一个有趣的游戏。


1
我不是太熟练使用JavaScript,但也有一些基本的打高尔夫球(即去除不必要的括号,改变的展示位置++,改变&&&在第一张支票,改变着.toString()+''等)我得到了你的代码下降到181个字节。如果您还没有看过它们,那么阅读JavaScript 技巧所有语言的高尔夫技巧可能会很有趣。:)
Kevin Cruijssen

1
哦,忘记了一个(function q(s)可以s=>):171个字节。入住愉快!:)
凯文·克鲁伊森

谢谢,我会读一读。我对javascript不太方便,但最近不得不做一点工作,并认为这可能是在停机期间多
花点功夫

1
打了一些球(没有进行所有测试,因此它可以用作此评论的直接URL)
Arnauld

1
欢迎来到Code Golf SE!希望您喜欢在这里打高尔夫球!
朱塞佩

3

Haskell中,112个 111 110字节

l=length
(!)=splitAt
f a=last$a:[x|i<-[1..l a],let (h,t)=i!a;o=h++zipWith(-)t o;(x,y)=l t!o,all(>=0)o,sum y<1]

在线尝试!

f a=                
      i<-[1..l a]                -- for all indices 'i' of the input array 'a'
      (h,t)=i!a                  -- split 'a' at 'i' into 'h' and 't'
                                 -- e.g. a: [1,2,3,4], i: 1 -> h: [1], t:[2,3,4] 
      o=                         -- calculate the original array by
        h++                      --   prepended 'h' to
        zipWith(-)t o            --   the (element-wise) difference of
                                 --   't' and itself
      (x,y)=l t!o                -- split 'o' at position <length of t>
                                 --
                                 -- example:
                                 --      a: [0,1,3,2,0]
                                 --      h: [0]
                                 --      t: [1,3,2,0]
                                 --   now
                                 --      o: [0,1,2,0,0]
                                 --      x: [0,1,2,0]
                                 --      y: [0]
                                 --
    ,                            -- 'o' is valid, if
     all(>=0)o                   --   all elements of 'o' are not negative
    ,sum y<1                     --   and 'y' is all zeros
  [x|         ]                  -- keep 'x' (a valid echo array) if 'o' is valid

 last $ a :[  ]                  -- if there's no echo, the list of 'x's is empty
                                 -- and 'a' is picked, else the last of the 'x's 

3

Wolfram语言(数学)131 129 120 119 102个 98 97 96 95字节

(w=#;Do[(w=v/.#)&/@Thread[#==PadLeft[v=Array[x,L-d],L]+v~PadRight~L]~Solve~v,{d,L=Tr[1^#]}];w)&

在线尝试!

− 1个字节,感谢attinat:我们可以写,L=Tr[1^#]而不是L=Length@#当参数是数字列表时。

代码说明:遍历收缩d(输入和输出长度之间的差异)。对于每个输出列表长度,构造一个未知列表,v={x[1],x[2],...,x[L-d]}然后将其添加到自身的左侧填充中,并在右侧添加到length LPadLeft[v,L]+PadRight[v,L])中,然后将该总和设置为等于输入列表,并求解未知数x[1]...x[L-d]。选择最短的解决方案,这是最后一个生成w的解决方案:每次找到解决方案时,只需覆盖变量即可。

非高尔夫版本:

F = Function[A,                                  (* A is the input list *)
  Module[{L = Length[A],                         (* length of A *)
          v,                                     (* list of unknowns *)
          x,                                     (* unknowns in v *)
          w = A},                                (* variable for solution, defaults to A *)
    Do[                                          (* loop over shrinkage: d = Length[A]-Length[output] *)
      v = Array[x, L - d];                       (* list of unknowns to be determined *)
      (w = v /. #) & /@                          (* overwrite w with every... *) 
        Solve[                                   (* ...solution of... *)
          Thread[PadLeft[v,L]+PadRight[v,L]==A], (* ...v added to itself, left-padded and right-padded, equals A *)
          v],                                    (* solve for elements of v *)
    {d, L}];                                     (* loop for shrinkage from 1 to L (the last case d=L is trivial) *)
    w]];                                         (* return the last solution found *)

-1 Tr[1^#]代替Length@#
attinat

2

果冻25 24字节

ðsạ\FḣL_¥,+¥Ż⁹¡$µⱮLṪ⁼¥Ƈȯ

在线尝试!

单链链接,它获取并返回整数列表。从技术上讲,成功的结果嵌套在另外两个列表中,但是当作为完整程序运行时,stdout的隐式输出将忽略冗余列表。


2

Python 2中113个 123 128 127 123 122字节

def f(a,i=1):
 e=a[:i]
 for v in a[i:-i]:e+=v-e[-i],
 return i<=len(a)/2and(min(e)>=0<e[-i:]==a[-i:]and e or f(a,i+1))or a

在线尝试!

1字节thx到TFeld ; 并向Sebastian Kreft发送 1个字节。

在每次致电时f,我们都会构造一个潜在的长度回波len(a)-i。第一部分只是a的前i几个字节;计算余数,以使“回波总和”对于回波总和的“重叠”部分是正确的(即,回波总和直到为止都是正确的a[:-i])。

然后,非常简单的比较(不加赘述)给出:

if i>=len(a)/2+1:
    return a # because it can't be that short, so there is no echo
else:
    if min(e)>=0                       # all elements are non-negative
                 and e[-i:]==a[-i:]:   # and the tails are the same
        return e                       # it's a match!
    else:
        return f(a,i+1)                # recurse

e+=[v-e[-i]]可以是e+=v-e[-i],
TF场

您可以这样做来剃掉另一个角色i<=len(a)/2
Sebastian Kreft

2

Wolfram语言(Mathematica),93个字节

(b=#;Do[a=#;Do[a[[i+j]]-=a[[j]],{j,2k}];a/.{__?(#>=0&),0}:>(b=a~Drop~-i),{i,k=Tr[1^#]/2}];b)&

在线尝试!

返回列表中存在的最短回波。


它看起来像这样失败的{1,1,1}{1,0,1}
罗马

@Roman在这两种情况下都没有回声吗?
attinat

因为{1,1,1}没有回声,所以您需要返回原始数组。因为{1,0,1}我想说的是回声,{1}但承认尚不清楚规则是什么。
罗马

嗯对 感谢您的接见!
attinat

2

PHP,124字节

function($a){while(!$z&&++$y<$c=count($b=$a))for($x=0;$x<$c&$z=0<=$b[$x+$y]-=$b[$x++];);return array_slice($b,0,$c-$y)?:$a;}

在线尝试!

说明:

创建输入数组的副本,并循环回显每个可能的偏移量。对于每一列,从原始位置的对应值中减去偏移位置的值,以确定加到输入中所需的值。如果有效(>0),用该值替换该列的内容。继续进行到最后,如果没有值无效,则为正确答案。

function( $a ) {
  // iterate through all possible offsets of echo
  while( ! $b && ++$y < $c = count( $b = $a ) ) {
    // create a copy of input array, iterate through all elements
    for( $x = 0; $b && $x < $c; ) {
      // if difference between the elements in the offset copy of 
      // the array is positive, subtract the value in the input array
      // from the offset array in the same column
      if ( ( $b[ $x+$y ] -= $b[ $x++ ] ) < 0 ) {
        // result is not valid, erase array and break out of loop
        $b = 0;
      }
    }
  }
  // truncate output array to correct size. if still contains values, 
  // it is a valid result. otherwise return the original array
  return array_slice( $b, 0, $c-$y ) ?: $a;
}

2

Python 3,111字节

def f(r,l=1):o=r[:l];o+=(v-o[-l]for v in r[l:]);return l<len(r)and(min(o)<any(o[-l:])and f(r,l+1)or o[:-l])or r

在线尝试!

该解决方案采用了@Chas Brown解决方案的一些思想,例如递归结构和输出数组的构造。同时,它还会对判断标准进行一些更改,并将for循环放入生成器表达式中以允许单行解决方案。非高尔夫版本如下所示。在这里,该数组一直out被计算到输入数组的末尾,然后我们检查l它的最后一个元素是否都为零。如果是这样,则len(arr)-l如果所有第一个元素均为非负数,则将其作为答案返回。

非高尔夫版本,非递归版本

def remove_echo(arr):
    l = 1
    while l < len(arr):
        out = arr[:l]
        out += (v - out[-l] for v in arr[l:])
        if min(out) >= 0 and out[-l:] == [0] * l:
            return out[:-l]
        l += 1
    return arr

在线尝试!


1
@ 640KB我检查了返回的答案是否与我的代码中的预期结果匹配,并且仅在不匹配时才打印消息。因此,没有输出表示一切正确。我承认这乍一看可能会造成混淆,稍后我将对其进行更新以在比赛中打印“正确”。
乔尔

1
@ 640KB更新。
乔尔

1

木炭,62字节

≔⁰ζF⊘Lθ«≔E⊕ι⁰ηFLθ§≔ηκ⁻§θκ§ηκ¿⬤η¬κ≔⊕ιζ»F⁻Lθζ⊞υ⁻§θι∧ζ∧¬‹ιζ§υ±ζIυ

在线尝试!链接是详细版本的代码。说明:

≔⁰ζ

假设没有回声。

F⊘Lθ«

尝试所有可能的回声起点。注意:我可能误解了问题,并且可能没有尝试足够大的回声,在这种情况下,就没有必要了。

≔E⊕ι⁰η

从零数组开始,该数组的大小与回波的起点相同。

FLθ§≔ηκ⁻§θκ§ηκ

对于原始数组中的每个元素,从中循环减去回声数组中的元素。因此,回声阵列中的每个元素都建立了相距一定距离的元素的交替总和。

¿⬤η¬κ≔⊕ιζ»

如果所有交替总和均为零,则将其保存为可能的起点。(因此,如果可能性不止一种,则使用最大可能的起点。)

F⁻Lθζ⊞υ⁻§θι∧ζ∧¬‹ιζ§υ±ζ

通过从适当的先前计算的元素中减去起点之后的元素来构建回显数组。

Iυ

强制转换为字符串,以便在单独的行上隐式输出。

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.