지하 감옥을 파고 자리


10

편집 : 질문 끝에 보너스 퍼즐 의 첫 번째 해결사 에게 100 명성의 보상 을 수여합니다 !

이 현상금에 마감일이없는 답변이 표시되는 경우에만 현상금을 질문에 추가합니다.

감소하지 않는 한 자리 양의 정수 목록이 주어지면, 숫자가 얼마나 깊은 지하 감옥을 파낼 것인지 결정해야합니다.

███  ███  A dungeon with 5 blocks removed and a depth of 3.
███  ███
███ ████
████████

파기를 시작하기 전에지면이 수평입니다.

모든 자릿수는 그 아래에서 정확히 한 블록의 흙을 제거 할 수 있지만 던전 바깥에서 그 위치에 도달해야하며, 제거 된 후에는 던전을 떠나야합니다. 그렇게하는 동안 숫자 수평 단계에서 숫자보다 작거나 올라갈 수 없습니다 .

숫자는 파기에 다음 전략을 사용합니다.

  • 가장 작은 값을 가진 숫자는 먼저 파고 그 다음 파는 항상 나머지 숫자 중 다음으로 가장 작은 값입니다.
  • 첫 번째 숫자는 어느 위치에서나 파낼 수 있습니다. (모든 근거는 동일합니다.)
  • 다음 자릿수는 항상 가장 왼쪽에있는 시작 열에서 파고 나올 수 있습니다. 이러한 열이 없으면 가장 오른쪽 열의 오른쪽에 새 열을 파기 시작합니다.

예를 들어 숫자 1 1 1 2 3 3는 다음 던전을 파헤칩니다 ( 해당 숫자 가 해당 위치를 나타내는 숫자를 표시하는 단계별 시각화).

███1████    ███11███    ███11███    ███11███    ███11███    ███11███
████████    ████████    ███1████    ███1████    ███1████    ███13███
████████    ████████    ████████    ███2████    ███2████    ███2████
████████    ████████    ████████    ████████    ███3████    ███3████
████████    ████████    ████████    ████████    ████████    ████████

예에 대한 설명 :

  • 두 번째 1는- 2깊은 곳으로 깊숙이 들어가면 사용할 수있는 유일한 열에서 벗어날 수 없었 습니다.
  • 세 번째 1는 가장 왼쪽 열을 파고 2깊이 열로 이동 1한 다음지면 수준 으로 이동할 수 있으므로 깊은 열을 생성 할 수 있습니다 .
  • 다음 23둘 다 가장 왼쪽 열을 파낼 수 있습니다.
  • 마지막 3은 가장 왼쪽 열을 파낼 수 없지만 다음 열을 파낼 수는 없습니다.

입력

  • 최소 하나 이상의 요소가 포함 된 양수 한 자릿수의 비 감소 목록입니다.

산출

  • 단일 양의 정수로 구성된 던전의 깊이입니다.

입력 => 출력 (출력의 일부가 아닌 설명으로 던전의 열 깊이를 왼쪽에서 오른쪽으로)

[3]  =>  1
(column depths are [1])

[1, 1, 1, 2, 3, 3]  =>  4
(column depths are [4, 2])

[1, 1, 1, 1, 1, 1, 1, 1]  =>  3
(column depths are [3, 2, 2, 1])

[1, 1, 1, 1, 1, 3, 3, 3, 3, 3, 3, 5, 5, 5, 5, 5, 5, 5, 5]  =>  11
(column depths are [11, 6, 2])

[1, 1, 1, 1, 1, 2, 2, 9, 9, 9]  =>  7
(column depths are [7, 2, 1])

[2, 2, 2, 2, 2, 5, 5, 5, 7, 7, 9]  =>  9
(column depths are [9, 2])

[1, 2, 2, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 5]  =>  10
(column depths are [10, 5])

[1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 5, 5, 5, 7, 7, 9]  =>  13
(column depths are [13, 5])

[1, 1, 2, 2, 3, 3, 4, 4, 5, 5, 6, 6, 7, 7, 8, 8, 9, 9]  =>  13
(column depths are [13, 5])

[1, 1, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 4, 4, 4, 4, 5, 5, 5, 5, 6, 6, 6, 6, 7, 7, 7, 7, 8, 8, 8, 8, 9, 9, 9, 9]  =>  21
(column depths are [21, 12, 3])

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

보너스 퍼즐

"숫자가 다음과 같은 파기 전략을 사용합니다" 섹션에 설명 된 전략이 항상 주어진 숫자에 대해 가장 깊은 던전을 제공 한다는 것을 증명 (또는 반증) 할 수 있습니까 ?

답변:


5

Pyth, 21 바이트

huXf>+H@GhT@GT0G1Qm0Q

온라인 시연 : 단일 데모 또는 테스트 스위트

설명:

                  m0Q   generate a list of zeros of length len(input)
                        This will simulate the current depths
 u               Qm0Q   reduce G, starting with G=[0,...,0], for H in input():
   f          0             find the first number T >= 0, which satisfies:
    >+H@GhT@GT                  H + G[T+1] > G[T]
  X            G1           increase the depth at this position by one
                            update G with this result
h                       print the first element in this list

2

자바, 199

import java.util.*;a->{List<Integer>l=new ArrayList();l.add(0);int x,y,z=0;s:for(int i:a){for(x=0;x<z;x++)if((y=l.get(x))-l.get(x+1)<i){l.set(x,l.get(x)+1);continue s;}l.add(z++,1);}return l.get(0);}

확장 가능하고 실행 가능한 버전

import java.util.*;
class DIGits {
    public static void main(String[] args) {
        java.util.function.Function<int[], Integer> f =
                a->{
                    List<Integer> l = new ArrayList();
                    l.add(0);
                    int x, y, z = 0;
                    s:
                    for (int i : a) {
                        for (x = 0; x < z; x++) {
                            if ((y = l.get(x)) - l.get(x + 1) < i) {
                                l.set(x, l.get(x) + 1);
                                continue s;
                            }
                        }
                        l.add(z++, 1);
                    }
                    return l.get(0);
                };
        System.out.println(f.apply(new int[]{1, 2, 2, 2, 3, 3, 3, 3, 3, 4, 4, 5, 5, 5, 5, 7, 7, 9}));
    }
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.