목록 다듬기


12

음수가 아닌 정수 k와 정렬 된 정수 목록 L을 입력으로 사용하고 스무딩 된 목록을 출력하거나 반환하는 프로그램이나 함수를 작성해야 합니다 M.

M목록은 정렬 된 상태 L로 최대 k정수 요소를 삽입 하여 오름차순 목록에서 작성됩니다 . 삽입 된 정수는 최대 순방향 차이가 M가능한 작게 선택되어야 합니다. 이 가장 작은 값을 "부드러움"이라고합니다.

목록의 앞으로 차이 -1 3 8 11 154 5 3 4이며 최대 앞으로 차이는 5입니다.

2삽입을 사용하면 2 10 15is 의 부드러움 4과 출력이 2 6 10 11 15앞으로 다를 수 4 4 1 4있습니다.

입력

  • 음이 아닌 정수 k.
  • L최소 2 개의 요소가 있는 오름차순 정수 목록 .

산출

  • 오름차순 정수 목록 M.
  • 여러 정답이 존재하면 정확히 하나를 출력합니다 (하나라도 충분 함).
  • 귀하의 솔루션은 내 컴퓨터 에서 1 분 이내에 예제 테스트 사례를 해결해야 합니다 (닫기 사례 만 테스트합니다. 평균 이하의 PC가 있습니다).

입력 ( k, L) => 괄호 안의 가능한 출력 및 최대 순방향 차이 (출력의 일부가 아님)

0, 10 20 => 10 20 (10)

2, 1 10 => 1 4 7 10 (3)

2, 2 10 15 => 2 6 10 11 15 (4)

3, 2 10 15 => 2 5 8 10 12 15 (3)

5, 1 21 46 => 1 8 15 21 27 33 39 46 (7)

5, 10 20 25 33 => 10 14 18 20 24 25 29 33 (4)

3, 4 4 6 9 11 11 15 16 25 28 36 37 51 61 => 4 4 6 9 11 11 15 16 22 25 28 36 37 45 51 59 61 (8)

15, 156 888 2015 => 156 269 382 495 608 721 834 888 1001 1114 1227 1340 1453 1566 1679 1792 1905 2015 (113)

8, -399 -35 -13 56 157 => -399 -347 -295 -243 -191 -139 -87 -35 -13 39 56 108 157 (52)

5, 3 3 3 => 3 3 3 3 (0)

이것은 코드 골프이므로 가장 짧은 항목이 이깁니다.

답변:


5

Pyth, 28 27 바이트

S+Qu?smt%hHrFdC,QtQ>GvzGhvz

다음과 같이 입력하십시오 :

3
[2, 10, 15]

데모. 테스트 하네스.

참고 : 질문 질문을 받았다 당시 사용에 관한 Pyth의 작은 버그가 있었다 rFd안으로 u난 그냥 고정. 이 버그로 인해 Finside을 사용할 수 없었습니다 u.

S+Qu?smt%hHrFdC,QtQ>GvzGhvz

                               Implicit:
                               z is the number of insertions, in string form.
                               Q is the input list.
              C,QtQ            Pairs of elements, e.g. [(2, 10), (10, 15)]
           rFd                 d = (a, b) -> range(a, b)
        %hH                    Take every H+1th element of that range
       t                       And throw out the first one.
      m                        Perform this process for each element pair
     s                         And combine the results into one list.

                               The above is a minimal set of additional elements
                               To reduce the maximal difference to H+1.

  u                     hvz    Repeat until the result stops changing, where
                               the prior result is G, H starts at 0 and
                               increases by 1 each repetition, and
                               G is initialized to eval(z)+1.
   ?               >GvzG       If not G[eval(z):], return G. In other words,
                               if the prior result was short enough, stop.
                               Also, this is always false on the initial call.
    smt%hHrFdC,QtQ             Otherwise, recalculate with H incremented.
S+Q                            Take the result, add the original list, and sort.

다음은 질문이있을 때 통역사와 협력 한 버전입니다. 28 바이트이며 정확히 같은 방식으로 작동합니다.

S+Qu?smt%hHr.udC,QtQ>GvzGhvz

데모.

적절한 버전의 Git 커밋, f6b40e62


나는 rF<seq>두 요소 튜플을 풀기 위해 사용하는 것을 생각하지 않았습니다 .
orlp

@orlp 대단한 속임수로, u다르게 작동 e했지만 존재하지 않았던 그 urGHd당시에는 그 방법보다 짧았습니다 rhd@d1. Pyth 트릭 페이지에 넣겠습니다.
isaacg

캐릭터를 면도 할 수 있습니다 U.이 필요하지 않습니다 .
orlp

@orlp 감사합니다. 실제로는 yvzwhen 에 실패 vz = 0하지만 hvz트릭을 수행합니다.
isaacg

코드가 질문을 받았을 때 사용 가능한 Pyth 버전에서는 작동하지 않으므로이 솔루션을 수락하지 않기로 선택했습니다. 버그 수정에 의존하지 않는 답변을한다면 저를 핑 (Ping)하면 받아들입니다.
randomra

8

파이썬 2, 104

def f(L,k,d=1):
 M=[];p=L[0]
 for x in L:M+=range(p+d,x,d);p=x
 return M[k:]and f(L,k,d+1)or sorted(L+M)

d1부터 시작하여 다른 최대 증분을 시도 합니다. 간격의 (p,x)모든 d'번째 수를 취하여 각 연속 요소 쌍 의 간격을 채 웁니다 . 경우 M할당량이 허용하는 것보다 더 이상, 더 높은 시도 재귀 d. 그렇지 않으면 추가 된 원래 요소의 목록을 정렬하여 반환합니다.

이것은 내 컴퓨터에서 모든 테스트 사례를 지체없이 수행합니다.


1, 1000000000과 같은 것을 시도 했습니까?
edc65

@ edc65이 알고리즘은 정말 오래 걸리 겠지만 그 전에는 스택 깊이가 부족합니다.
xnor
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.