Запрограмуйте робот для укладання чашок


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). Ви можете необов'язково надрукувати один зворотний рядок.
  • Ваш код повинен мати можливість вирішити будь-який із наведених нижче тестових випадків на розумному настільному ПК (якщо на моєму потрібно дві хвилини, я дам вам користь від сумнівів, але якщо це займе десять, я виграю 't - я вважаю, що можливий оптимальний алгоритм, який вирішує будь-який з них менше ніж за секунду).
  • Ви не повинні оптимізувати свій код до окремих тестових випадків (наприклад, шляхом жорсткого кодування). Якщо я підозрюю когось у цьому, я залишаю за собою право змінювати тестові справи.

Ви можете використовувати цей скрипт 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 555 інструкцій.

Відповіді:


32

Пітон 2, 64 555

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 555

Пояснення

Починаємо з порожньої "робочої зони". Ми скануємо вхід у зворотному порядку читання, тобто праворуч ліворуч та знизу вгору. Якщо між входом і робочою зоною в поточному місці є невідповідність (тобто чашка присутня на вході, але не в робочій зоні, або навпаки), ми додаємо або видаляємо чашки в робочу зону, відповідно до правил, доки невідповідність не буде усунена, в який момент ми продовжуємо переходити до наступного місця.

Правильність

Щоб показати, що цей метод є правильним, тобто, що отримана послідовність генерує структуру введення, достатньо довести, що ми ніколи не змінюємо (тобто додаємо або видаляємо чашки в) місцях, які ми вже відвідали (оскільки в кожному місці, яке ми відвідуємо , ми переконуємося, що робоча зона відповідає вхідній.) Це простий наслідок того, що ми працюємо в зворотному порядку, в якому чашки додаються та виймаються:

  • Чашка в місці 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 є тим самим, заданим будь-якою структурою, як вхідним.

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

Так само, якщо s n +1 є r, то в розташуванні, що передує l , в порядку читання, в структурі, породженій S n , не повинно бути жодної чашки . Як результат, підрядність 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 , і закінчуються зазначеною послідовністю повторних інструкцій), тобто оптимальна генеруюча послідовність Σ є унікальною, і, таким чином, за допомогою індукції всі оптимальні генеруючі послідовності є унікальними.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.