태그 보관물: algorithm

algorithm

배열에 에코가 있습니다 … 배열에 에코가 있습니다 … 배열 <– input [ 623, 533, 494, 382 ]

도움! 내 배열 중 일부에 성가신 에코가있는 것처럼 보이며 그것을 없애고 싶습니다. 이 경우 원래 배열이 가운데 어딘가에 반복되어 값이 서로 추가됩니다.

예를 들어, 배열 [ 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

도전:

반향을 포함 할 수있는 배열이 있으면이를 제거하고 반향없이 배열을 리턴하십시오.

입력:

  • 배열에서 구분 된 문자열, 펀치 카드 또는 플랫폼에 적합한 범위에서 세 개 이상의 정수를 포함하는 동등한,
    0n<10000

    적어도 하나 개의 원소와

    >0

    .

  • 에코는 첫 번째 요소 나 마지막 요소 다음에 시작할 수 없습니다.
  • 에코는 입력 내에서 한 번만 발생하거나 전혀 발생하지 않습니다.

산출:

  • 에코가 제거 된 정수
    0n<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 ]



답변

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


답변

하스켈 , 167 바이트

먼저 반향이 있으면 입력 배열이 형식의 일부 배열과 다른 배열의 컨볼 루션이라는 점에 유의해야합니다 [1,1],[1,0,1],[1,0,0,1],....

즉,이 모든 배열에 대해 이것을 확인하면됩니다. 그러나 이산 컨볼 루션 / 디컨 볼 루션은 다항식 곱셈 / 긴 나눗셈과 동일하므로 가능한 경우 항상 몫을 반환하는 다항식을 사용한 구현입니다.

[1]다른 배열이 작동하지 않으면 deconvolution [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] 

온라인으로 사용해보십시오!


답변

자바 스크립트 , 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}

온라인으로 사용해보십시오

Kevin Cruijssen 에서 40 바이트

Arnauld 에서 또 다른 26 바이트

첫 번째 코드 골프 응답은 잠재적 오프셋을 무효화하고 찾은 내용에 따라 원래 배열 또는 새 배열을 반환합니다. 누군가가 그것을 짧게 만드는 방법을 알고 있다면 알려주세요. 재미있는 게임처럼 보입니다.


답변

하스켈, 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


답변

볼프람 언어 (티카) , 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)&

온라인으로 사용해보십시오!

attinat 덕분에 −1 바이트 : 인수가 숫자 목록 일 때 L=Tr[1^#]대신 쓸 수 있습니다 L=Length@#.

코드 설명 : 수축을 반복합니다 d(입력 길이와 출력 길이의 차이). 각 출력 목록 길이에 대해 알 수없는 목록을 구성하고 v={x[1],x[2],...,x[L-d]}왼쪽에 채워진 길이와 오른쪽에 채워진 길이를 길이 L( PadLeft[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 *)


답변

젤리 , 25 24 바이트

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

온라인으로 사용해보십시오!

정수 목록을 가져오고 리턴하는 모나드 링크입니다. 기술적으로 성공적인 결과는 두 개의 추가 목록에 중첩되지만 전체 프로그램으로 실행하면 stdout에 대한 암시 적 출력이 중복 목록을 무시합니다.


답변

파이썬 (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 바이트 thx .

를 호출 할 때마다 f길이의 잠재적 에코를 구성합니다 len(a)-i. 첫 번째 부분은 ia 의 첫 번째 바이트입니다. 나머지는 ‘에코 합계’가 에코 합계의 ‘겹친’섹션에 대해 정확하도록 계산됩니다 (즉, 에코 합계가 최대 값까지 정확함 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