셔플 링 블록으로 정렬

블록 셔플 정렬

블록 셔플 종류의 목록을 정렬의 (오히려 인공적인) 방법입니다. 예를 들어 다음과 같이 작동합니다.

[6, 1, 0, 3, 2, 4, -2, -1]
                            Break list into contiguous blocks
[6][1, 0][3, 2, 4][-2, -1]
                            Sort each block
[6][0, 1][2, 3, 4][-2, -1]
                            Sort blocks lexicographically
[-2, -1][0, 1][2, 3, 4][6]
                            Concatenate
[-2, -1, 0, 1, 2, 3, 4, 6]

연속적인 블록으로의 파티션은 임의로 선택할 수 있습니다. 그러나 모든 블록 선택이 마지막에 정렬 된 목록을 생성하지는 않습니다.

[6, 1, 0, 3, 2, 4, -2, -1]
[6, 1, 0][3, 2, 4][-2, -1]
[0, 1, 6][2, 3, 4][-2, -1]
[-2, -1][0, 1, 6][2, 3, 4]
[-2, -1, 0, 1, 6, 2, 3, 4]

모든 블록의 길이가 1이거나 블록이 하나만 있으면 결과가 정렬됩니다. 그러나 이것들은 다소 극단적 인 경우입니다. 이 도전에서, 당신의 임무는 블록의 수와 블록의 최대 길이 사이의 균형을 찾는 것입니다.

작업

귀하의 입력은 임의의 합리적인 형식으로 취한 정수가 아닌 정수 L의 목록입니다 . 출력에서 작은 정수이어야한다 N 되도록 L이 블록 셔플 블록의 수와 각각의 블록의 길이가 최대로되도록 정렬 할 수 N을 .

각 언어에서 가장 낮은 바이트 수가 이깁니다. 표준 규칙이 적용됩니다.

테스트 사례

[5] -> 1
[1,2] -> 2
[0,2,1,-1] -> 3
[-1,0,2,1] -> 2
[9,3,8,2,7] -> 4
[9,2,8,3,7] -> 3
[5,9,3,7,2,4,8] -> 7
[-1,-2,1,2,-1,-2,7] -> 4
[6,1,0,3,2,4,-2,-1] -> 4
[12,5,6,-6,-1,0,2,3] -> 3
[1,0,1,0,1,0,1,0,1,0] -> 6
[1,2,1,3,1,2,3,2,4,3] -> 5
[7,7,7,7,8,9,7,7,7,7] -> 4



답변

Brachylog , 23 22 20 19 바이트

바이트를 절약 한 Zgarb, H.PWiz 및 Fatalize에게 감사드립니다.

~cᶠ{oᵐoc≤₁&≡ᵃlᵐ⌉}ˢ⌋

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

여기 골프가 더있을 거라고 확신합니다 …

설명

~cᶠ      Find all lists that concatenate into the input, i.e. all partitions
         of the input.
{        Discard all partitions for which this predicate fails, and replace
         the rest with the output of this predicate.
  oᵐ       Sort each sublist of the partition.
  o        Sort the entire list.
  c≤₁      And require concatenation of the result to be sorted.
  &        Then:
  ≡ᵃ       Append the partition to itself.
  lᵐ       Map "length" over this list, i.e. we get the length of each block, as
           well as the length of the partition itself.
  ⌉        Take the maximum.
}ˢ
⌋        Take the minimum of all those maxima.


답변

젤리 , 17 바이트

Ṣ€ṢF
ŒṖÇÐṂ+Z$€L€Ṃ

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

다른 버전, 15 바이트, 게시일 이후 과제

최신 버전에서는 Ɗ세 개의 링크를 모나 딕 체인으로 결합합니다. 이것은 다음 골프를 허용합니다.

ŒṖṢ€ṢFƊÐṂ+ZLƊ€Ṃ

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

작동 원리

Ṣ€ṢF          Helper link. Argument: P (partitioned array)

Ṣ€            Sort each chunk.
  Ṣ           Sort the sorted chunks.
   F          Flatten.


ŒṖÇÐṂ+Z$€L€Ṃ  Main link. Argument: A (array)

ŒṖ            Generate all partitions of A.
  ÇÐṂ         Keep those for which the helper link returns the minimal array, i.e.,
              those that return sorted(A).
     +Z$€     Add each partition to its transpose.
              Due to how Jelly vectorizes, the length of the sum is the maximum of
              the length of the operands, and the length of the transpose is the
              length of the array's largest column.
         L€   Take the length of each sum.
           Ṃ  Take the minimum.


답변

Stax , 28 26 25 24 23 바이트 CP437

é%(>ù│ê²☻û◙T╠►╜◘íaæAtI╥

온라인으로 실행하고 디버그하십시오!

3 바이트를 저장하면 @recursive의 크레딧입니다.

Stax는 약간 장황합니다. 기본적으로 배열을 정렬하는 데 2 ​​바이트가, 배열의 최대 / 최소를 구하려면 2 바이트, 배열을 평평하게하려면 2 바이트가 필요합니다. 어쨌든 나는 여전히 솔루션을 게시하고 있으며 개선 방법에 대한 유용한 제안이있을 수 있기를 바랍니다 .

설명

압축이 풀린 버전을 사용하여 설명합니다.

%cFxs|!F{{omo:f:^!C_Mch\%|m
%cFxs|!F                        Do for all partitions, grouped by number of sub-arrays
                                    Grouping by number of sub-arrays in this problem does not help but it's the default
        {{om{o                  Sort inside block then sort blocks lexicographically
              :f:^              The result when flattened is sorted
                  !C            Skip the rest of the loop if the last line is false
                    _|<         Take the current partition, pad to the longest

                       h        Take the first element, whose length is now the maximum of all sub-arrays in the original partition
                        \       Zip with the current partition, the shorter one is repeated
                         %      Number of elements
                                Which is the maximum of all sub-array sizes and the number of sub-arrays in the current partition
                          |m    Take the minimum among all choices of partitions


답변

Brachylog , 17 바이트

~c₎{oᵐoc≤₁&lᵐ⌉≤}ᵈ

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

설명

이것은 자기 답입니다. 나는 Brachylog를 염두에두고이 도전을 설계했고 ~c₎{…}ᵈ흥미로운 구성을 발견 했다.

내장 기능은 c목록 목록을 연결합니다. 아래 첨자가 제공되면 N목록 수를 요구합니다 N. 이 기호 는 내장을 수정하여 쌍을 입력으로 사용하고 오른쪽 요소를 아래 첨자로 사용합니다. 따라서 c₎한 쌍의 소요 [L,N]에서 목록의 번호가 있어야 L이다 N,와의 연결을 반환합니다 L. 역으로 실행하면 ~c₎목록을 소요 L하고 한 쌍의 반환 [P,N], P의 파티션 LN블록을. 순서대로 증가 N합니다.

메타 술어는 일반 술어를 한 쌍의 두 요소 사이의 관계를 점검하는 술어로 변환합니다. 보다 명확하게, {…}ᵈ한 쌍을 취하고 [A,B], 확인 A{…}B하고, 출력 B합니다. P블록 정렬이 가능하고 길이 목록 만 포함하고 있는지 확인하는 데 사용합니다 N.

~c₎{oᵐoc≤₁&lᵐ⌉≤}ᵈ  Input is a list, say L = [9,2,8,3,7].
~c₎                Guess the pair [P,N]: [[[9],[2],[8,3,7]],3]
   {           }ᵈ  Verify this predicate on P and N and return N:
    oᵐ              Sort each list in P: [[9],[2],[3,7,8]]
      o             Sort lexicographically: [[2],[3,7,8],[9]]
       c            Concatenate: [2,3,7,8,9]
        ≤₁          This list is nondecreasing: true.
          &lᵐ       Length of each list in P: [1,1,3]
             ⌉      Maximum: 3
              ≤     This is at most N: true.

참고 P빈 목록을 포함 할 수있다. 이는 블록의 최대 길이가 블록 수보다 큰 경우에도 정확성을 보장합니다.


답변

파이썬 2 , 186146 바이트

lambda l:min(max(map(len,z+[z]))for z in p(l)if sum(s(z),[])==s(l))
p=lambda l:[q+[s(l[i:])]for i in range(len(l))for q in p(l[:i])]or[l]
s=sorted

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

두 번째 기능은 feersum의해이 에서 가져옵니다 .


답변

루비 , 158 바이트

f=->l,i=[],s=l.size,m=s{k=*l;i.sum==s&&i.map{|z|k.shift(z).sort}.sort.flatten==l.sort&&[m,[i.size,*i].max].min||i.sum<s&&(1..s).map{|z|f[l,i+[z],s,m]}.min||m}

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


답변

Pyth ,  24 23  20 바이트

hSmeSlMs]Bd.msSSMb./

테스트 스위트.

작동 원리

hSmeSlMs]Bd.msSSMb./ – Full program. Hereby, Q represents the input.
                  ./ – All possible partitions of Q.
           .m        – Take the partitions which yield a minimal (i.e. sorted) list over:
             sSSMb   – Sorting function. Uses the variable b.
               SMb   – Sort each list in each partition b.
              S      – Sort the partition b.
             s       – And flatten (by 1 level).
  meSlMs]Bd          – Map. Uses a function whose variable is d.
        ]Bd          – Pair d with its wrapping in a singleton list. Returns [d, [d]].
       s             – Flatten (by 1 level). Returns [*d, d], where "*" is splatting.
     lM              – Take the length of each element.
   eS                – Retrieve the maximal length.
hS                   – Return the minimum element of the list of maximal lengths.