Запрограммируйте Робот-Укладчик Чашек

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

Вы можете думать о земле как о вершине полубесконечного ряда чашек.

Соревнование

Учитывая структуру сложенных чашек, верните последовательность, представляющую инструкции для построения этой структуры. Ваша основная оценка - это сумма чисел инструкций для контрольных примеров, представленных внизу. В случае ничьей (что вероятно, потому что я убежден, что возможно эффективное и оптимальное решение), выигрывает самое короткое решение.

Вот еще несколько подробностей о правилах:

  • Вы можете предположить, что в нижнем ряду ввода нет начальных пробелов, поэтому всегда следует использовать крайнее левое место для чашки.
  • Вы можете принять любое разумное количество конечных пробелов (без пробелов, один пробел, дополненный прямоугольником, дополненный прямоугольником с одним завершающим пробелом).
  • При желании вы можете ожидать, что ввод завершится одним завершающим переводом строки.
  • Вы можете выбрать любые два различных печатаемых символа ASCII (от 0x20 до 0x7E включительно) вместо Aпробелов (правила о пробелах затем переносятся на выбранный вами символ).
  • Ваш вывод должен содержать только два различных символа, представляющих операции (вы можете выбрать другие символы, кроме aи r). При желании вы можете распечатать один завершающий символ новой строки.
  • Ваш код должен быть в состоянии решить любой из приведенных ниже тестовых случаев менее чем за минуту на подходящем настольном ПК (если у меня на это уйдет две минуты, я не сомневаюсь, но если это займет десять, я выиграл Я считаю, что возможен оптимальный алгоритм, который решает любой из них менее чем за секунду).
  • Вы не должны оптимизировать свой код для отдельных тестовых случаев (например, путем их жесткого кодирования). Если я подозреваю кого-либо в этом, я оставляю за собой право изменять контрольные примеры.

Вы можете использовать этот сценарий CJam для обратной операции: он возьмет строку инструкций по сборке и напечатает полученную стопку чашек. (Спасибо Деннису за переписывание фрагмента и его ускорение.)

Sp3000 также любезно предоставил этот альтернативный скрипт Python для той же цели.

Тестовые случаи

После каждого теста есть число, указывающее оптимальное количество инструкций в соответствии с ответом Элл.

                                       A
                                      A A
                                     A A A
                                    A A A A
                                   A A A A A
                                  A A A A A A
                                 A A A A A A A
                                A A A A A A A A
                               A A A A A A A A A
                              A A A A A A A A A A
                             A A A A A A A A A A A
                            A A A A A A A A A A A A
                           A A A A A A A A A A A A A
                          A A A A A A A A A A A A A A
                         A A A A A A A A A A A A A A A
                        A A A A A A A A A A A A A A A A
                       A A A A A A A A A A A A A A A A A
                      A A A A A A A A A A A A A A A A A A
                     A A A A A A A A A A A A A A A A A A A
                    A A A A A A A A A A A A A A A A A A A A
                   A A A A A A A A A A A A A A A A A A A A A
                  A A A A A A A A A A A A A A A A A A A A A A
                 A A A A A A A A A A A A A A A A A A A A A A A
                A A A A A A A A A A A A A A A A A A A A A A A A
               A A A A A A A A A A A A A A A A A A A A A A A A A
              A A A A A A A A A A A A A A A A A A A A A A A A A A
             A A A A A A A A A A A A A A A A A A A A A A A A A A A
            A A A A A A A A A A A A A A A A A A A A A A A A A A A A
           A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
          A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
         A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
        A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
       A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
      A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
     A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
    A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
   A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
  A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
 A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
A A A A A A A A A A A A A A A A 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

Python 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 в порядке сканирования, следовательно, нет никакой опасности удалить чашку, которую мы уже посетили.
  • Точно так же чашка в местоположении 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 - это последовательность, произведенная нашим методом (если это не так, мы всегда можем заменить первые n элементов S n +1 указанной последовательностью и получить последовательность длиной n + 1, которая генерирует ту же структуру.) Пусть l будет местоположением, измененным последней операцией в S n +1 (а именно, s n +1 ), и пустьS m будет начальным сегментом S n , который наша программа произведет, как только достигнет l (но до обработки l ). Обратите внимание, что, поскольку структуры, сгенерированные S n и S n +1, согласуются во всех местоположениях, следующих за l , в порядке чтения, S m является той же самой заданной любой структурой в качестве ввода.

Если ы п + 1 является a(то есть, чашки дополнение), то есть не должно быть любое место , предшествующий л , в порядке чтения, где чашка могут быть добавлены к структуре , порожденной S н . В результате подпоследовательность S n, следующая за S m, должна быть всей a(поскольку из a rследует, что перед l есть пустое пространство , или что S n не оптимальна). Когда мы перейдем к процессу l , нам нужно добавьте ровно n - m чашек, прежде чем мы сможем добавить чашку в l , следовательно, полученная последовательность будет Sm , за которым следует n - m + 1aэлементов, что равно S n +1 (после этой точки не будет никакого несоответствия, следовательно, это полная полученная последовательность.)

Аналогичным образом, если ы п + 1 является r, то есть не должно быть любой чашки на месте предшествующего л , в порядке чтения, в структуре , порожденной S н . В результате подпоследовательность S n, следующая за S m, должна быть всем r. Когда мы перейдем к процессу l , нам нужно будет удалить ровно n - m чашек, прежде чем мы сможем удалить чашку в l , следовательно, в результате получится последовательность S m , за которой следует n - m + 1 rэлементов, что снова равно S n +1 .

Другими словами, наш метод создает оптимальную последовательность для указанной структуры ввода и, следовательно, по индукции для любой структуры ввода.

Обратите внимание, что это не означает, что эта реализация является наиболее эффективной. Определенно возможно, например, вычислить количество чашек, которые должны быть добавлены или удалены непосредственно в каждой точке вместо фактического выполнения этих операций.

уникальность

Мы можем использовать оптимальность нашего метода, чтобы показать, что оптимальные последовательности на самом деле уникальны (то есть, что никакие две различные оптимальные последовательности не генерируют одинаковую структуру.) Мы снова используем индукцию по размеру оптимальной генерирующей последовательности: Пустая последовательность, очевидно, является единственной оптимальной порождающей последовательностью пустой структуры. Предположим, что все оптимальные порождающие последовательности длины n уникальны, и рассмотрим структуру Σ, порожденную двумя оптимальными последовательностями S n +1 и T n +1 .

Напомним, что S n и T n сами по себе оптимальны и, следовательно, по условию, уникальны. Поскольку наш метод дает оптимальные последовательности, S n и T n можно рассматривать как генерируемые нашим методом. Пусть l S и l T будут местоположениями, измененными последней операцией в S n +1 и T n +1 , соответственно, и предположим, без ограничения общности, что l S следует или равно l T в порядке чтения. Поскольку структуры, порожденные S nи T n согласуются во всех местоположениях, следующих за l S , в порядке чтения последовательность, полученная нашим методом, с учетом любой структуры в качестве входных данных, как только она достигнет l S (но до ее обработки), одинакова для обоих; называют эту последовательность U .

Поскольку последнее действие S n + 1 изменяет l S , если у Σ есть чашка при l S, то до l S не должно быть вакансий , а если у Σ нет чашки при l S, то не должно быть никаких чашка до l S , в порядке чтения. Следовательно, остальная часть последовательности, генерирующей Σ, после U , должна состоять из многократного применения одной и той же инструкции, продиктованной наличием или отсутствием чашки при l S (иначе это не будет оптимальным). Другими словами, S n +1 и T n +1равны (они оба начинаются с U и заканчиваются указанной последовательностью повторяющихся инструкций), то есть оптимальная порождающая последовательность Σ уникальна, и поэтому по индукции все оптимальные порождающие последовательности уникальны.

флигель
источник