컵 적재 로봇 프로그래밍


36

컵을 피라미드 (및 다른 모양)에 쌓을 수 있기 전에 모든 사람들이 본 적이 있다고 확신합니다.

           A    
        A A A   
 A     A A A A  
A A A A A A A A

예, A확실히 컵을 표현하기에 적합한 캐릭터입니다.

새 컵은지면, 구조물의 오른쪽 또는 인접한 두 컵 위에 추가 할 수 있습니다. 위의 구조가 다시 있지만 새 컵에 사용 가능한 모든 지점에는 _다음 이 표시됩니다 .

         _ A         
        A A A        
 A _ _ A A A A       
A A A A A A A A _ _ _

이 컵 스택을 조립할 수있는 로봇을 만들고 싶다고 가정 해 봅시다. 로봇은 이러한 구조를 조작하기위한 두 가지 간단한 지침을 이해합니다.

  • a: 왼쪽에서 오른쪽으로 읽는 순서 로 사용 가능한 첫 번째 지점에 새 컵을 추가합니다 (즉, 사용 가능한 지점을 찾을 때까지 왼쪽에서 오른쪽으로 행을 스캔 한 다음 컵을 배치합니다). 위의 예는 다음과 같습니다.

             A A   
            A A A  
     A     A A A A 
    A A A A A A A A
    
  • r: 첫 번째 컵을 왼쪽에서 오른쪽으로 읽는 순서대로 제거합니다. 위의 예는 다음과 같습니다.

            A A A  
     A     A A A A 
    A A A A A A A A
    

이 두 가지 작업 만 사용하여 처음부터 모든 구조를 만들 수 있음 이 밝혀졌습니다 . 예 :

      A
 A   A A
A A A A A

일련의 지침으로 구축 가능

aaaaaaaaaaaarrrrraa

위의 더 큰 예제는

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaarrrrrrrrrrrrrrrrrraaaaaaarr

여기 더 큰 것이 있습니다.

    A
   A A                   A
  A A A     A   A       A A
 A A A A   A A A A     A A A A
A A A A A A A A A A   A A A A A

이것으로 만들 수 있습니다

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrraaaaaaaaaaaaaaaaaaarrrrrrrrrrrrrrraaaaaaaaaaaaaarrrrrrrrrrraaaaaaaa

참고 : 지면의 얼룩이 제거 지침으로 해제되면 기존 컵의 오른쪽에 컵을 놓기 전에 재사용됩니다 . 예 :

aaaarrra

생산할 것이다

A   A

아니

    A A

지면을 반 무한 컵의 맨 위에 있다고 생각할 수 있습니다.

도전

스택 컵의 구조가 주어지면,이 구조를 만들기위한 지시 사항을 나타내는 순서를 리턴하십시오. 기본 점수는 하단에 제공된 테스트 사례에 대한 지침 수의 합계입니다. 효율적인 경우 최적의 솔루션이 가능하다고 확신하기 때문에 동점 일 경우 가장 짧은 솔루션이 우선합니다.

규칙에 대한 자세한 내용은 다음과 같습니다.

  • 입력의 맨 아래 줄에 선행 공간이 없다고 가정 할 수 있으므로 컵이있는 가장 왼쪽의지면 지점이 항상 사용됩니다.
  • 적당한 양의 후행 공백 (공백 없음, 하나의 공백, 사각형으로 채워짐, 단일 후행 공백으로 사각형으로 채워짐)을 가정 할 수 있습니다.
  • 선택적으로 입력이 단일 후행 줄 바꿈으로 끝나기를 기대할 수 있습니다.
  • A공백 대신 공백으로 인쇄 가능한 ASCII 문자 (0x20 ~ 0x7E 포함)를 선택할 수 있습니다 ( 공백에 대한 규칙은 선택한 문자로 전송 됨).
  • 출력에는 연산을 나타내는 두 개의 고유 한 문자 만 포함되어야합니다 ( a및 이외의 다른 문자를 선택할 수 있음 r). 선택적으로 단일 후행 줄 바꿈을 인쇄 할 수 있습니다.
  • 귀하의 코드는 합리적인 데스크탑 PC에서 1 분 이내에 아래의 테스트 사례 를 해결할 수 있어야합니다 (2 분이 걸리면 의심의 이익을 주지만 10 시간이 걸리면 승리합니다) 't-1 초 이내에 알고리즘을 해결할 수있는 최적의 알고리즘이 가능하다고 생각합니다.
  • 개별 테스트 사례에 맞게 코드를 최적화해서는 안됩니다 (예 : 하드 코딩). 본인이 의심하는 경우 테스트 사례를 변경할 권리가 있습니다.

이 CJam 스크립트 를 리버스 작업에 사용할 수 있습니다 . 일련의 조립 지침이 필요하며 결과 컵이 인쇄됩니다. (스 니펫을 다시 작성하고 속도를 크게 높인 Dennis에게 감사합니다.)

Sp3000은 또한 동일한 목적 으로이 대체 Python 스크립트 를 친절하게 제공 했습니다 .

테스트 사례

각 테스트 사례 후에 Ell의 답변에 따른 최적의 명령어 수를 나타내는 숫자가 있습니다.

                                       A
                                      A A
                                     A A A
                                    A A A A
                                   A A A A A
                                  A A A A A A
                                 A A A A A A A
                                A A A A A A A A
                               A A A A A A A A A
                              A A A A A A A A A A
                             A A A A A A A A A A A
                            A A A A A A A A A A A A
                           A A A A A A A A A A A A A
                          A A A A A A A A A A A A A A
                         A A A A A A A A A A A A A A A
                        A A A A A A A A A A A A A A A A
                       A A A A A A A A A A A A A A A A A
                      A A A A A A A A A A A A A A A A A A
                     A A A A A A A A A A A A A A A A A A A
                    A A A A A A A A A A A A A A A A A A A A
                   A A A A A A A A A A A A A A A A A A A A A
                  A A A A A A A A A A A A A A A A A A A A A A
                 A A A A A A A A A A A A A A A A A A A A A A A
                A A A A A A A A A A A A A A A A A A A A A A A A
               A A A A A A A A A A A A A A A A A A A A A A A A A
              A A A A A A A A A A A A A A A A A A A A A A A A A A
             A A A A A A A A A A A A A A A A A A A A A A A A A A A
            A A A A A A A A A A A A A A A A A A A A A A A A A A A A
           A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
          A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
         A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
        A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
       A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
      A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
     A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
    A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
   A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
  A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
 A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A

820
                                             A
                                            A A
                                           A A A
                                          A A A A
                                         A A A A A
                                        A A A A A A
                                       A A A A A A A
                                      A A A A A A A A
                     A               A A A A A A A A A
                    A A             A A A A A A A A A A
                   A A A           A A A A A A A A A A A
                  A A A A         A A A A A A A A A A A A
         A       A A A A A       A A A A A A A A A A A A A
        A A     A A A A A A     A A A A A A A A A A A A A A
   A   A A A   A A A A A A A   A A A A A A A A A A A A A A A
A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A

1946

               A
              A A
             A A A
            A A A A
           A A A A A
          A A A A A A
         A A A A A A A
        A A A A A A A A
       A A A A A A A A A               A
      A A A A A A A A A A             A A
     A A A A A A A A A A A           A A A
    A A A A A A A A A A A A         A A A A
   A A A A A A A A A A A A A       A A A A A       A
  A A A A A A A A A A A A A A     A A A A A A     A A
 A A A A A A A A A A A A A A A   A A A A A A A   A A A   A
A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A

2252

                                                         A A
                                                      A A A A
                                                   A A A A A A
                                                A A A A A A A A
                                             A A A A A A A A A A
                                          A A A A A A A A A A A A
                                       A A A A A A A A A A A A A A
                                    A A A A A A A A A A A A A A A A
                                 A A A A A A A A A A A A A A A A A A
                              A A A A A A A A A A A A A A A A A A A A
                           A A A A A A A A A A A A A A A A A A A A A A
                        A A A A A A A A A A A A A A A A A A A A A A A A
                     A A A A A A A A A A A A A A A A A A A A A A A A A A
                  A A A A A A A A A A A A A A A A A A A A A A A A A A A A
               A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
            A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
         A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
      A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
   A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A

9958

                   A A
                  A A A A
                 A A A A A A
                A A A A A A A A
               A A A A A A A A A A
              A A A A A A A A A A A A
             A A A A A A A A A A A A A A
            A A A A A A A A A A A A A A A A
           A A A A A A A A A A A A A A A A A A
          A A A A A A A A A A A A A A A A A A A A
         A A A A A A A A A A A A A A A A A A A A A A
        A A A A A A A A A A A A A A A A A A A A A A A A
       A A A A A A A A A A A A A A A A A A A A A A A A A A
      A A A A A A A A A A A A A A A A A A A A A A A A A A A A
     A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
    A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
   A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
  A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
 A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A

5540

A   A   A   A   A   A   A   A   A   A   A   A   A   A   A   A   A   A   A   A

10280

 A   A   A   A   A   A   A   A   A   A   A   A   A   A   A   A   A   A   A   A
A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A

10320

   A       A       A       A       A       A       A       A       A       A
  A A     A A     A A     A A     A A     A A     A A     A A     A A     A A
 A A A   A A A   A A A   A A A   A A A   A A A   A A A   A A A   A A A   A A A
A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A

5794

              A
             A A
            A A A
           A A A A                                               A
          A A A A A                                             A A
         A A A A A A A                                         A A A
        A A A A A A A A               A                       A A A A
       A A A A A A A A A             A A             A       A A A A A   A
      A A A A A A A A A A           A A A           A A     A A A A A A A A
     A A A A A A A A A A A         A A A A         A A A   A A A A A A A A A
    A A A A A A A A A A A A       A A A A A       A A A A A A A A A A A A A A
 A A A A A A A A A A A A A A     A A A A A A     A A A A A A A A A A A A A A A
A A A A A A A A A A A A A A A   A A A A A A A   A A A A A A A A A A A A A A A A

3297

                                                   A A
                                                  A A A
                                                 A A A A
                                                A A A A A
                                               A A A A A A
                                              A A A A A A A
                                             A A A A A A A A
                                            A A A A A A A A A
                                           A A A A A A A A A A     A
                                          A A A A A A A A A A A   A A
                                       A A A A A A A A A A A A A A A A
                                      A A A A A A A A A A A A A A A A A
                                     A A A A A A A A A A A A A A A A A A
      A                             A A A A A A A A A A A A A A A A A A A
     A A                           A A A A A A A A A A A A A A A A A A A A
    A A A             A A         A A A A A A A A A A A A A A A A A A A A A
   A A A A           A A A       A A A A A A A A A A A A A A A A A A A A A A
  A A A A A         A A A A     A A A A A A A A A A A A A A A A A A A A A A A
 A A A A A A     A A A A A A   A A A A A A A A A A A A A A A A A A A A A A A A
A A A A A A A   A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A

4081

                      A
                     A A       A                     A
                    A A A     A A                   A A A                 A
             A     A A A A   A A A A               A A A A     A         A A
  A         A A   A A A A A A A A A A         A   A A A A A   A A       A A A
 A A       A A A A A A A A A A A A A A       A A A A A A A A A A A     A A A A
A A A   A A A A A A A A A A A A A A A A     A A A A A A A A A A A A   A A A A A

4475

                                                             A              
      A           A                       A                 A A A   A       A
     A A         A A   A         A A     A A A   A         A A A A A A     A A
A   A A A A A   A A A A A   A   A A A   A A A A A A   A   A A A A A A A   A A A

5752

즉, 최고 점수는 64,515 개 입니다.

답변:


32

파이썬 2, 64,515

import sys

input = map(str.rstrip, sys.stdin.readlines())
width = (len(input[-1]) + 1) / 2
for i in range(len(input)):
    indent = len(input) - i - 1
    input[i] = [c != " " for c in input[i][indent::2]]
    input[i] += [False] * (width - indent - len(input[i]))
input = [[False] * n for n in range(width - len(input) + 1)] + input
working_area = [[False] * n for n in range(width + 1)]

def add():
    sys.stdout.write("a")
    for row in range(width + 1):
        for i in range(row):
            if not working_area[row][i] and (
                row == width or
                (working_area[row + 1][i] and working_area[row + 1][i + 1])
            ):
                working_area[row][i] = True
                return
def remove():
    sys.stdout.write("r")
    for row in range(width + 1):
        if True in working_area[row]:
            working_area[row][working_area[row].index(True)] = False
            return

for row in range(width, -1, -1):
    r = input[row]; R = working_area[row]
    for i in range(len(r) - 1, -1, -1):
        if r[i]:
            while not R[i]: add()
        else:
            while R[i]: remove()

결과

시험 1 1 - 820 2 - 1,946 # 3 - 2,252 # 4 - 9,958 # 5 - 5,540 # 6 - 10,280 # 7 - 10,320 # 8 - 5,794 # 9 - 3,297 # 10 - 4,081 # 11 - 4,475 # 12 - 5,752시험 2 시험 3
시험 4 시험 5 시험 6
시험 7 시험 8 테스트 9
테스트 10 시험 11 실험 12

64,515

설명

빈 "작업 영역"으로 시작합니다. 오른쪽에서 왼쪽으로, 아래 에서 위로 역순으로 입력을 스캔합니다 . 현재 위치에서 입력과 작업 영역 사이에 불일치가있는 경우 (즉, 컵이 입력에 있지만 작업 영역에 있지 않거나 그 반대 인 경우) 작업 영역에 컵을 추가하거나 제거합니다. 불일치가 해결 될 때까지 다음 위치로 계속 진행합니다.

단정

이 방법이 올바른지, 즉 결과 시퀀스가 ​​입력 구조를 생성한다는 것을 보여주기 위해서는 이미 방문한 위치 (방문 할 때마다 위치를 수정하거나 컵을 추가 또는 제거하지 않음)를 나타내는 것으로 충분합니다. , 우리는 작업 영역이 입력과 일치하는지 확인합니다.) 이것은 컵이 추가되고 제거되는 역순으로 작업한다는 사실의 쉬운 결과입니다.

  • l 위치 의 컵 은 읽기 순서에서 l 다음 에 오는 위치에서 컵 보다 먼저 제거되므로 스캔 순서에서 l 앞에 있는 컵은 항상 제거 되므로 이미 방문한 컵을 제거 할 위험이 없습니다.
  • 마찬가지로, 위치에 컵 항상 스캔 순서로 선행이 있다는 컵 전에 추가됩니다 주어진 아래 두 잔이 이미있다 (또는 하단에 있다는); 그러나 우리는 이미이 위치를 방문 했으므로 필요한 컵을 추가 했으므로 위에서 언급했듯이 나중에 컵을 제거 할 위험이 없으므로이 조건이 충족되므로 컵을 추가 할 위험이 없습니다. 이미 방문한 위치입니다.

최적

구조물에서 컵을 추가하거나 제거하는 효과는 구조물을 생성하는 데 사용되는 작업 순서에 의존하지 않으며 현재 구성에만 의존합니다. 그 결과, 최적의 서열 주어진 S N =를 { (S) (1) , ..., s의 N } 특정 구조의 각 초기 세그먼트 생성 동작의 S , N , 즉, 임의의 시퀀스 (S) m = { S 1 , .. ., s m } (여기서 mn )은 생성 된 해당 구조에 대해 최적의 시퀀스이거나 그렇지 않으면 S n 보다 짧은 시퀀스가됩니다.동일한 구조를 생성합니다.

우리는 최적의 생성 시퀀스의 길이를 유도함으로써 우리의 방법이 최적이라는 것을 보여줄 수있다. 우리의 방법은 최적의 생성 시퀀스가 ​​비어있는 구조에 대해 최적의 시퀀스를 명확하게 생성한다. 이 방법은 최적 시퀀스 (또는 시퀀스) 길이가 n 인 모든 구조에 대해 최적 시퀀스를 생성하고 최적 시퀀스 S n +1에 의해 생성 된 구조를 고려합니다 . 우리는에 의해 생성 된 특정 구조, 즉 표시 할 S N +1 입력으로, 우리의 방법은 (적어도 동일한 길이의 서열 또는.) 동일한 시퀀스를 생성

위에서 언급 한 바와 같이, S n 또한 최적의 시퀀스이므로, 가설에 의해, 본 발명의 방법은 S n에 의해 생성 된 구조 가 입력으로서 주어진 최적의 시퀀스를 생성 한다. 일반성을 잃지 않고 S n 이 우리 방법에 의해 생성 된 시퀀스 라고 가정하십시오 (그렇지 않은 경우 S n +1 의 첫 번째 n 요소를 상기 시퀀스로 항상 대체하고 길이 n + 의 시퀀스를 얻을 수 있음) 동일한 구조를 생성 한).하자 의 마지막 작동에 의해 수정 될 위치 S N +1 (즉, s의 N +1 )을 보자S mS n 의 초기 세그먼트로 , 프로그램이 l에 도달하면 (그러나 l 처리하기 전에 ) 생성됩니다. S nS n +1에 의해 생성 된 구조는 l 다음에 오는 모든 위치 에서 읽기 순서대로 일치하므로 S m 은 입력과 같은 구조 중 하나와 동일합니다.

경우 N +1이 있다 a(즉, 컵 첨가) 한 다음 모든 이전의 위치가 아니어야 L을 컵에 의해 생성 된 구조에 추가 할 수있는 판독 순서에서, S , N . 결과적으로 S m 다음에 나오는 S n 의 하위 시퀀스는 모두되어야합니다 ( l 앞에 빈 공간이 있거나 S n 이 최적이 아님을 암시하기 때문에) l 처리 할 때 , 우리는 l에 컵을 추가하기 전에 정확히 n-m 컵을 추가하십시오. 따라서 결과 시퀀스는 S입니다.arm 다음에 n-m + 1a요소가옵니다. 이는 S n +1 과 같습니다(이 시점 이후에는 불일치가 없으므로 완전한 시퀀스가 ​​생성됩니다).

마찬가지로, s n +1r이면, S n에 의해 생성 된 구조에서, 판독 순서로, l 앞에 위치하는 컵이 없어야한다 . 결과적으로 S m 다음에 나오는 S n 의 하위 시퀀스는 모두이어야합니다 . 우리는 프로세스에 올 때 리터 , 우리는 정확히 제거해야합니다 N - m의 컵을 우리가 컵을 제거하기 전에 리터 따라서 결과 순서가 될 것입니다, S의 m 다음, N - m + 1 개 다시 동일 요소, S의 N을 +1 .rr

다시 말해, 본 발명의 방법은 상기 입력 구조에 대해, 따라서 유도에 의해 임의의 입력 구조에 대해 최적의 시퀀스를 생성한다.

이것이이 구현이 가장 효율적인 것을 의미하지는 않습니다. 예를 들어 실제로 이러한 작업을 수행하는 대신 각 지점에서 직접 추가하거나 제거해야하는 컵 수를 계산할 수 있습니다.

독창성

우리는 최적의 시퀀스가 ​​실제로 고유하다는 것을 보여주기 위해 방법의 최적 성을 사용할 수 있습니다 (즉, 두 개의 별개의 최적 시퀀스가 ​​동일한 구조를 생성하지 않음). 우리는 다시 최적 생성 시퀀스의 크기에 대한 유도를 사용합니다. 빈 시퀀스는 분명히 빈 구조의 고유 한 최적 생성 시퀀스입니다. 길이 n 의 모든 최적 생성 시퀀스 가 고유하다고 가정 하고 두 최적 시퀀스 S n +1T n +1에 의해 생성 된 구조 Σ를 고려하십시오 .

리콜 것을 S , NT n은 자신 고유 가설에 의해, 최적의 때문에이다. 본 방법은 최적의 서열을 생성하기 때문에, S nT n 은 본 방법에 의해 생성 된 것으로 생각 될 수있다. 하자 SL T는 마지막 동작에 의해 수정 된 위치 될 S N +1T N +1 일반성의 손실없이, 각각,와 가정, 즉 L의 S가 다음 또는 같음 T 순서를 판독한다. 이 구조에 의해 발생하기 때문에 S의 N그리고 T nl S 다음의 모든 위치 에서, 읽기 순서대로, 우리의 방법에 의해 생성 된 순서는 입력으로서 구조가 l S에 도달하면 (그러나 처리하기 전에) 두 가지에 대해 동일하다. 이 시퀀스 U를 호출하십시오 .

마지막의 행동 때문에 S N +1 수정 리터 S , Σ는에서 컵이있는 경우 리터를 S 그 전에 공석가 안 리터의 S , 그리고에서 Σ는 컵이없는 경우 L은 S 후 어떤이가 아니어야합니다 읽기 순서로 l S 앞에 컵 . 따라서 U 다음에 Σ를 생성하는 나머지 시퀀스 는 l S 에서 컵의 존재 또는 부재에 의해 지시되는 동일한 명령의 반복 된 적용으로 구성되어야합니다 (또는 그렇지 않으면 최적이 아닙니다). 즉, S n +1T n +1Σ의 최적 생성 시퀀스는 고유하므로, 유도에 의해 모든 최적 생성 시퀀스는 고유 하다 (즉 , U로 시작 하고 상기 반복 된 명령의 시퀀스로 끝남).

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.