Advent Challenge 6 : 운송 도크 레이블 재 지정!


9

<< 이전 다음 >>

PPCG 커뮤니티 덕분에 산타는 선물을 운송장으로 옮기기 위해 올바른 순서로 선물을 분류했습니다. 불행히도 교통 도크 표지판이 깨져서 모든 선물을 어디에 둘지 모릅니다! 선물은 모두 범위별로 분류되지 않고 그룹화되어있어 산타가 더 나은 아이디어라고 인정했습니다.

이제, 정렬 된 순서로 선물이 주어지면 현재가 올바른 순서로 될 수있는 모든 가능한 최소 범위 구성을 결정하십시오. 즉, Challenge # 5의 알고리즘에 따라 선물을 정렬하면 순서가 변경되지 않도록 최소 범위 구성을 모두 찾으십시오.

도전

최소 범위 구성은 범위가 가능한 한 작은 범위의 목록입니다. 즉, 범위가 특정 선물 서브 세트를 포함하도록 지정된 경우, 범위의 최소 및 최대는 서브 세트의 범위와 동일해야합니다. 다시 말해, 커버의 범위를 줄이면 더 이상 커버가되지 않습니다.

현재 크기에 적용 할 수있는 모든 최소 범위 구성을 찾는 것이 과제입니다. 예를 들어 보자.[3, 1, 2, 5, 4, 7, 6]

현재 전체 구성의 범위를 차지하는 사소한 경우가 있습니다. 이 경우 [[1, 7]]해결책이 될 것입니다.

고유 한 요소가있는 예제의 경우 [[3], [1], [2], [5], [4], [7], [6]]범위를 주문할 필요가 없으므로 또 다른 사소한 경우가 있습니다 .

이 예를 들어, 우리는 또한 볼 [[1, 3], [4, 7]][[1, 3], [4, 5], [6, 7]]뿐만 아니라, 작동합니다 [[1, 3], [5], [4], [6, 7]][[1, 3], [4, 5], [7], [6]].

에 대한 최종 답변은 [3, 1, 2, 5, 4, 7, 6]입니다 [[[3], [1], [2], [5], [4], [7], [6]], [[3], [1], [2], [5], [4], [6, 7]], [[3], [1], [2], [4, 5], [7], [6]], [[3], [1], [2], [4, 5], [6, 7]], [[3], [1], [2], [4, 7]], [[3], [1, 2], [5], [4], [7], [6]], [[3], [1, 2], [5], [4], [6, 7]], [[3], [1, 2], [4, 5], [7], [6]], [[3], [1, 2], [4, 5], [6, 7]], [[3], [1, 2], [4, 7]], [[1, 3], [5], [4], [7], [6]], [[1, 3], [5], [4], [6, 7]], [[1, 3], [4, 5], [7], [6]], [[1, 3], [4, 5], [6, 7]], [[1, 3], [4, 7]], [[1, 5], [7], [6]], [[1, 5], [6, 7]], [[1, 7]]].

포맷 사양

입력은 귀하의 언어가 지원하는 합리적인 숫자 범위 내에서 임의의 적절한 형식으로 양의 정수 목록으로 제공됩니다. 입력에 중복 요소가 포함될 수 있습니다. 출력은 합리적인 형식의 양의 정수로 구성된 3D 목록으로 제공되어야합니다.

(두 번째 계층 임)하여 출력의 각 영역은 하나 나타낼 수있다 [min, max], [num]이는 하나의 값 범위, 또는 전체 범위 자체 있지만 출력 형식으로 일관되어야합니다. 약간 다른 합리적인 출력 형식을 사용하려면 지정하십시오.

중복 값은 출력에서 ​​단일 범위로 포함되어야합니다. 즉, 출력에서 ​​두 범위가 겹치지 않을 수 있습니다.

솔루션은 어떤 순서로든 범위를 반환 할 수 있으며 결정적 일 필요는 없습니다.

규칙

  • 표준 허점 적용
  • 이것은 바이트 단위의 최단 답변이 이깁니다.
  • 응답이 없습니다

중복 요소가있는 목록의 테스트 사례 :

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

참조 구현

헤더는 링크입니다.

참고 : Advent Of Code 에서이 챌린지 시리즈에 대한 영감을 얻었습니다 . 이 사이트와 관련이 없습니다

여기서 첫 번째 도전 과제의 '링크 된'섹션을 보면 시리즈의 모든 도전 과제 목록을 볼 수 있습니다 .

행복한 골프!

답변:



3

Brachylog , 17 16 바이트

{~c⟨⌋⟦₂⌉⟩ᵐ.c≠∧}ᶠ

중복 된 목록에서도 작동합니다. 범위는 포함 된 요소 목록으로 표시됩니다. 온라인으로 사용해보십시오!

설명

아이디어는 목록을 블록으로 나누고 블록을 범위로 변환 한 다음 중복되지 않는지 확인하는 것입니다.

{~c⟨⌋⟦₂⌉⟩ᵐ.c≠∧}ᶠ  Input is a list.
{             }ᶠ  Compute all possible outputs for this predicate:
 ~c                Break the list into contiguous blocks.
   ⟨    ⟩ᵐ         For each block,
    ⌋  ⌉           take its minimum and maximum,
     ⟦₂            and create the range between them.
          .        This is the output.
           c       Also, if you concatenate the output,
            ≠      its elements are distinct.
             ∧     Prevent the interpreter from thinking this is also the output.

1

자바 스크립트 (ES6), 166 164 바이트

편집 : 이제 복제본을 지원하는 업데이트 된 버전

콘솔의 결과를 직접 출력한다 [최소, 최대] 포맷.

f=(a,r=[],l=0)=>a[l++]?f([...a],r,l,f(a,[...r,[Math.min(...x=a.splice(0,l)),Math.max(...x)]])):a[0]|r.some(([x,y],i)=>r.some(([z])=>i--&&z>=x&z<=y))||console.log(r)

테스트 사례


0

파이썬 2 , 179 바이트

lambda l:[l for l in[[range(min(x),max(x)+1)for x in P]for P in p(l)]if len(sum(l,[]))==len(set(sum(l,[])))]
p=lambda l:[[l[:i]]+a for i in range(1,len(l))for a in p(l[i:])]+[[l]]

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

전체 범위 목록을 출력합니다.

참조 구현에서 많은 영감을 얻었습니다.

모든 파티션을 구성한 다음 각 파티션의 최소 / 최대 범위를 만듭니다. 목록에 값이 두 번 이상 나타나지 않으면 범위 목록이 유효합니다.


sum(l,[]) 목록 목록을 평평하게하고 중복을 확인할 수 있습니다.

l=[[1, 2], [2, 3]]
sum(l,[]) = [1,2,2,3]
len([1,2,2,3] == len(set([1,2,2,3]))  -> False (duplicates)

0

Pyth , 17 바이트

f{IsTmm}hSkeSkd./

여기 사용해보십시오!

이제 훨씬 나아졌습니다. 전체 범위를 출력합니다. 참조 개정 이력 (무려 31 바이트에서) 이전 버전을.

작동 원리

f {IsTmm} hSkeSkd./ ~> 전체 프로그램.

               ./ ~> 목록 파티션.
     m ~> 변수를 사용한 맵 d.
      md ~> 변수 k를 사용하여 d에 매핑합니다.
        hSk ~> k의 최소값.
           eSk ~> 최대 k.
       } ~> 포함 정수 범위.
f ~> 필터링 ...
   sT ~> 평평 할 때
 {I ~> 중복 제거 기술이 변하지 않습니다.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.