Bardak İstifleme Robotunu Programlayın


36

Eminim o bardakların piramitlerde (ve diğer şekillerde) istiflenebildiğinden eminim:

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

Evet, Akesinlikle bir bardağı temsil etmek için yeterli bir karakter.

Zemine, yapının sağına veya iki bitişik bardağın üzerine yeni bardaklar eklenebilir. İşte yine yukarıdaki yapı, ancak yeni kupalar için mevcut tüm noktalar aşağıdakilerle işaretlenmiştir _:

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

Diyelim ki bu bardak yığınlarını monte edebilecek bir robot yapmak istiyoruz. Robot, böyle bir yapıyı işlemek için iki basit talimatı anlayacaktır:

  • a: Soldan sağa okuma sırasına göre ilk kullanılabilir noktaya yeni bir bardak ekleyin (yani, uygun bir nokta bulana kadar satırları yukarıdan aşağıya, soldan sağa tarayın, sonra bardağı yerleştirin). Yukarıdaki örnek şöyle olacaktır:

             A A   
            A A A  
     A     A A A A 
    A A A A A A A A
    
  • r: İlk kabı soldan sağa okuma sırasına göre çıkarın. Yukarıdaki örnek şöyle olacaktır:

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

Sadece bu iki işlem kullanılarak herhangi bir yapının sıfırdan inşa edilebileceği ortaya çıktı . Örneğin

      A
 A   A A
A A A A A

Talimatların sırası ile inşa edilebilir

aaaaaaaaaaaarrrrraa

Yukarıdaki daha büyük örnek kullanılarak oluşturulabilir

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaarrrrrrrrrrrrrrrrrraaaaaaarr

İşte daha da büyüğü:

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

ile inşa edilebilir

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrraaaaaaaaaaaaaaaaaaarrrrrrrrrrrrrrraaaaaaaaaaaaaarrrrrrrrrrraaaaaaaa

Not: Yerdeki lekeler sökme talimatı ile serbest bırakılırsa, bardakları mevcut tüm bardakların sağına yerleştirmeden önce yeniden kullanılacaktır . Örneğin

aaaarrra

verecek

A   A

değil

    A A

Yerin, yarı sonsuz bir fincan bardak üstünde olduğunu düşünebilirsiniz.

Meydan okuma

Yığılmış bardakların bir yapısı göz önüne alındığında, bu yapıyı oluşturmak için talimatları temsil eden bir sıra döndürün. Birincil puanınız, altta verilen test durumlarına ilişkin talimat sayısının toplamıdır. Eşitlik durumunda (bu muhtemelen etkili bir en uygun çözümün mümkün olduğuna ikna olduğum için), en kısa çözüm kazanır.

İşte kurallar hakkında daha ayrıntılı bilgi:

  • Girişin alt satırında ön boşluk bulunmadığını, bu nedenle her zaman kullanılan bir bardak için en soldaki zemin noktasının olduğunu varsayabilirsiniz.
  • Makul miktarda takip eden boşluk (varsayımsız boşluk bırakabilirsiniz (boşluk bırakmayın, bir boşluk bırakmayın, bir dikdörtgene kadar yatık bir dikdörtgene kadar doldurun).
  • İsteğe bağlı olarak, girişin tek bir izleyen yeni satırda bitmesini bekleyebilirsiniz.
  • ABoşluklar yerine herhangi iki farklı yazdırılabilir ASCII karakteri (0x20 - 0x7E, dahil) seçebilirsiniz ( boşluklarla ilgili kurallar sonra seçtiğiniz karaktere aktarılır).
  • Çıktınız, işlemleri temsil eden yalnızca iki farklı karakter içermelidir ( ave dışında başka karakterler seçebilirsiniz r). İsteğe bağlı olarak tek bir izleyen yeni satır yazdırabilirsiniz.
  • Kodunuz makul bir masaüstü bilgisayarında aşağıdaki test durumlarından herhangi birini bir dakikadan daha kısa sürede çözebilmelidir (benim için iki dakika sürerse, size şüphe avantajı veririm, ancak ondan alırsam 't - Bir tanesinden daha kısa sürede çözen optimal bir algoritmanın mümkün olduğuna inanıyorum).
  • Kodunuzu bireysel test durumlarına göre optimize etmemelisiniz (örneğin, bunları kodlayarak). Bunu yapan birinin şüphesini alırsam, test durumlarını değiştirme hakkını saklı tutarım.

Bu CJam betiğini ters işlem için kullanabilirsiniz : bir dizi inşaat talimatı alacak ve elde edilen bardak yığınını yazdıracaktır. (Snippet'i yeniden yazdığı ve önemli ölçüde hızlandırdığı için Dennis'e teşekkür ederiz.)

Sp3000 aynı zamanda bu alternatif Python betiğini de aynı amaçla sağladı .

Test Kılıfları

Her test durumundan sonra, Ell'in cevabına göre en uygun talimat sayısını belirten bir numara vardı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 A A A
                                A A A A A A A A
                               A A A A A A A A A
                              A A A A A A A A A A
                             A A A A A A A A A A A
                            A A A A A A A A A A A A
                           A A A A A A A A A A A A A
                          A A A A A A A A A A A A A A
                         A A A A A A A A A A A A A A A
                        A A A A A A A A A A A A A A A A
                       A A A A A A A A A A A A A A A A A
                      A A A A A A A A A A A A A A A A A A
                     A A A A A A A A A A A A A A A A A A A
                    A A A A A A A A A A A A A A A A A A A A
                   A A A A A A A A A A A A A A A A A A A A A
                  A A A A A A A A A A A A A A A A A A A A A A
                 A A A A A A A A A A A A A A A A A A A A A A A
                A A A A A A A A A A A A A A A A A A A A A A A A
               A A A A A A A A A A A A A A A A A A A A A A A A A
              A A A A A A A A A A A A A A A A A A A A A A A A A A
             A A A A A A A A A A A A A A A A A A A A A A A A A A A
            A A A A A A A A A A A A A A A A A A A A A A A A A A A A
           A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
          A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
         A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
        A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
       A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
      A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
     A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
    A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
   A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
  A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
 A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A A
A A A A A A A A A A A A A A A A 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

Bu, mümkün olan en iyi skor 64.515 talimatı anlamına gelir .

Yanıtlar:


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()

Sonuçlar

Test 1 1. - 820 2. - 1,946 3. - 2,252 4. - 9958 5. - 5.540 6. - 10.280 7. - 10.320 8. - 5.794 9. - 3,297 10. - 4.081 11. - 4.475 12. - 5.752Test 2 Test 3
Test 4 5. Test Test 6
Test 7 Test 8 Test 9
Test 10 Test 11 Test 12

Toplam 64,515

açıklama

Boş bir "çalışma alanı" ile başlıyoruz. Girişi ters okuma sırasına göre, yani sağdan sola ve aşağıdan yukarıya tararız . Girdi ile çalışma alanı arasında mevcut konumdaki bir uyuşmazlık varsa (yani, girişte bir bardak var ancak çalışma alanında değil veya tam tersi), çalışma alanına bardak ekler veya çıkarırız. Kurallara, uyuşmazlık çözülene kadar, hangi noktada bir sonraki konuma devam ediyoruz.

doğruluk

Bu yöntemin doğru olduğunu, yani sonuçta ortaya çıkan dizinin girdi yapısını oluşturduğunu göstermek için, daha önce ziyaret ettiğimiz (o zamandan beri ziyaret ettiğimiz her yerde) hiçbir zaman değişiklik yapmadığımızı (yani, bardak eklediğimizi veya kaldırdığımızı) göstermek yeterlidir. , çalışma alanının girdiyle eşleştiğinden emin oluruz.) Bu, bardakların eklenip çıkarıldığı ters sırada çalışmamızın kolay bir sonucudur:

  • Konumu A fincan l her zaman başarılı bir yerde bir fincan önce kaldırılacaktır l okuma sırasına göre ve ilerlettiği bu nedenle l tarama sırayla, dolayısıyla biz zaten ziyaret etmiş olduğunuz bir fincan kaldırma tehlikesi yoktur.
  • Benzer şekilde, konum bir fincan l daima tarama sırayla önce gelir bunu, o bir fincan önce eklenecektir göz önüne alındığında onun altında iki bardak zaten var (ya da altta olduğunu); bununla birlikte, bu yerleri daha önce ziyaret ettiğimiz ve dolayısıyla gerekli bardakları eklediğimizden ve yukarıda belirtildiği gibi, daha sonra bu bardakları çıkarma tehlikesi bulunmadığından, bu koşul yerine getirilmiş olduğundan ve buna bir bardak ekleme tehlikesi yoktur. zaten ziyaret ettiğimiz bir yer.

Optimalliği

Bir yapıya bir bardak ekleme veya çıkarma etkisinin, yapıyı oluşturmak için kullanılan işlem sırasına, sadece mevcut konfigürasyonuna bağlı olmadığını unutmayın. Bunun bir sonucu olarak, en uygun bir sıra verilir S , n = { s 1 , ..., s , n } belirli bir yapı, her başlangıç segmenti üretmek işlemleri S , n , örneğin, herhangi bir dizi S m = { s 1 , .. ., s m }, mn karşılık gelen yapısı oluşturur, ya da başka daha kısa bir dizi olacaktır için, optimal bir sekansıdır, S n, aynı yapıyı oluşturur.

Metodumuzun, optimal üretici sekansın uzunluğu ile indüksiyon yaparak en uygun olduğunu gösterebiliriz: Metodumuz, optimum sekansı boş olan herhangi bir yapı için net bir sekans üretir (bu tür bir yapı vardır - boş yapı). yöntem uzunluğunun optimal dizi (ya da dizileri) bütün yapılar için optimal dizi üreten n optimal sekans tarafından oluşturulan bir yapı ve dikkate S , n + 1 . Biz tarafından oluşturulan yapı göz önüne alındığında, bu göstermek istiyorum S , n + 1 giriş olarak, bizim yöntemi (en azından, aynı uzunlukta bir dizisi veya.) Aynı diziyi üretir

Yukarıda belirtildiği gibi, S , n optimal bir sekansıdır, ve bu nedenle, varsayım ile, bizim bir yöntem ile üretilen bir yapı verdiği optimal dizisi üreten S , n girdi olarak kullanılmaktadır. Bu, genelliği kaybetmeden, varsayalım S , n eğer değilse eden yöntem ile üretilen dizisidir (, her zaman ilk yerine N elemanlarını S , n + 1 bahsedilen dizi ile ve uzunlukta bir dizisi elde n + aynı yapıyı oluşturur 1). Let l son işlem ile değiştirilebilir yer olması S , n + 1 (yani, s , n + 1 ) ve izinG m ilk segment , S N program ulaştığı bir kez üretilen olacağı, l (ancak işlem öncesi l ). Tarafından üretilen yapılarla Not bu S , n ve S , n + 1 takip eden tüm konumlarda kabul l okuma sırasına göre, S m girdi olarak ya da yapı verilen ile aynıdır.

Eğer s , n + 1 olduğunu a(diğer bir deyişle, kap ek olarak), daha sonra, önceki herhangi bir yer olmamalıdır l bir kap tarafından üretilen yapıya eklenebilir okuma sırası içinde, S , n . Sonuç olarak, bir alt dizi S n aşağıdaki S m bütün olmalıdır a(bir yana rya orada önce boş bir yer olduğunu ima l veya bu S n biz süreci geldiğinizde optimal değildir.) L , biz gerekir l'de bir bardak ekleyebilmemiz için tam olarak n - m bardak ekleyelim , sonuçta elde edilen sıra S olacaktır.m , ardından N - m + 1aeşit elemanları, S , n + 1 (bu noktadan sonra herhangi bir uyumsuzluk söz konusu olmaz, bu nedenle bu, üretilen tüm dizisidir.)

Benzer şekilde, s , n + 1 olup r, daha sonra, bir konum önceki herhangi bir kap olmamalıdır l tarafından oluşturulan yapı, okuma sırasına göre, S , N . Bunun bir sonucu olarak, bir alt-dizi S , n , aşağıdaki G m her olmalıdır r. L işlemine geldiğimizde, l'deki bardağı çıkarmadan önce tam olarak n - m bardakları çıkarmamız gerekir , bu nedenle sonuçtaki sıra S m , ardından n - m + 1 relementleri olur, sonra tekrar S n olur +1 .

Başka bir deyişle, bizim yöntemimiz, bahsedilen giriş yapısı için ve dolayısıyla indüksiyonla herhangi bir giriş yapısı için optimum bir sekans üretir.

Bunun, uygulamanın en verimli olduğu anlamına gelmediğine dikkat edin. Örneğin, bu işlemleri yapmak yerine doğrudan her noktaya eklenmesi veya çıkarılması gereken bardak sayısını hesaplamak kesinlikle mümkündür.

benzersizlik

En uygun dizilerin aslında benzersiz olduğunu göstermek için (yani, iki ayrı en uygun dizinin aynı yapıyı üretmediğini göstermek için) yöntemimizin optimizasyonunu kullanabiliriz. Yine, en iyi üretici dizinin boyutunda indüksiyon kullanıyoruz: Boş dizi açık bir şekilde boş yapının benzersiz optimum üretici dizisidir. Uzunluktaki tüm uygun üreten dizileri Varsayalım ki n benzersiz ve iki uygun sekansları tarafından oluşturulan bir yapı, a, dikkate S , n + 1 ve T , n + 1 .

Hatırlatma; S , n ve T , n kendileri özgün, hipotez, en uygun ve bu nedenle bulunmaktadır. Bizim yöntemi en uygun dizileri üreten yana, S , n ve T , n eden yöntem ile üretilen olarak düşünülebilir. Let l S ve L T son işlem ile değiştirilebilir yerleri olarak S , n + 1 ve T , n + 1 genelliği kaybetmeden, sırasıyla, ve varsayalım ki l S , aşağıdaki, veya eşittir, l , T okuma sırasına göre. S n tarafından oluşturulan yapılarve T , n , aşağıdaki tüm konumlarda kabul l S , ya yapı, girdi olarak verilir, düzeni, bizim yöntem ile üretilen sekansı okuma, bu ulaştığında l S (ama işleme öncesi), her ikisi için de aynıdır; bu sırayı U olarak adlandırın .

Geçen eylem yana S n 1 , değiştirmektedir l S , Σ bir fincan varsa l S tarihten önce herhangi bir boşluk olmamalıdır l S , ve en Σ bir fincan yoksa l S sonra herhangi bir orada olmamalıdır l S'den önce fincan , okuma sırasına göre. Bu nedenle, aşağıdaki sekans üreten Σ geri kalanı, U , bir bardağın olması veya olmaması ile dikte edilen aynı talimat tekrar tekrar uygulanması, oluşmalıdır l S (ya da başka optimal olmaz). Başka bir deyişle, S n + 1 ve T n + 1eşittir (her ikisi de U ile başlar ve söz konusu tekrarlanan talimatlar dizisi ile biter), yani, optimal'nin optimal üretici dizisi benzersizdir ve dolayısıyla, indüksiyonla, tüm optimal üretici diziler benzersizdir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.