カップスタッキングロボットをプログラムする


36

カップをピラミッド(およびその他の形状)に積み重ねることができることは誰もが前に見たことがあると思います。

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

はい、A間違いなくカップを表すのに十分なキャラクターです。

新しいカップは、地面、構造物の右側、または隣接する2つのカップのいずれかに追加できます。再び上記の構造がありますが、新しいカップに使用できるすべてのスポットにはが付いてい_ます:

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

これらのカップスタックを組み立てることができるロボットを構築したいとしましょう。ロボットは、このような構造を操作するための2つの簡単な指示を理解します。

  • 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
    

これら2つの操作のみを使用して、任意の構造をゼロから構築できることがわかります。例えば

      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

地面はカップの半無限の列の上にあると考えることができます。

チャレンジ

積み重ねられたカップの構造を指定すると、この構造を構築するための指示を表すシーケンスを返します。プライマリスコアは、下部にあるテストケースの指示数の合計です。同点の場合(おそらく、効率的な最適なソリューションが可能であると確信しているため)、最短のソリューションが優先されます。

ルールの詳細は次のとおりです。

  • 入力の一番下の行に先頭のスペースがないと仮定することができます。そのため、常にカップの一番左のグラウンドスポットが使用されます。
  • 合理的な量の後続スペースを想定することができます(スペースなし、1つのスペース、長方形に埋め込まれる、単一の末尾スペースを持つ長方形に埋め込まれる)。
  • オプションで、入力が単一の末尾の改行で終了することを期待できます。
  • Aスペースの代わりに、任意の2つの異なる印刷可能なASCII文字(0x20〜0x7Eを含む)を選択できます(スペースに関する規則は、選択した文字に転送されます)。
  • 出力には、操作を表す2つの異なる文字のみを含める必要があります(aおよび以外の文字を選択することもできますr)。オプションで、単一の末尾の改行を印刷できます。
  • あなたのコードは、妥当なデスクトップPC で1分未満で以下のテストケースのいずれかを解決できる必要があります(私の場合2分かかる場合、私はあなたに疑いの利益を与えますが、10 't-1秒未満でそれらのいずれかを解決する最適なアルゴリズムが可能だと思います。
  • 個々のテストケースに対してコードを最適化しないでください(ハードコーディングするなど)。誰かがそうする疑いがある場合、私はテストケースを変更する権利を留保します。

このCJamスクリプトを逆の操作に使用できます。一連の構築指示を受け取り、結果のカップのスタックを印刷します。(スニペットを書き直して大幅に高速化してくれたデニスに感謝します。)

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

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 - 9958 #5 - 5540 #6 - 10280 #7 - 10320 #8 - 5794 #9 - 3297 #10 - 4081 #11 - 4475 #12 - 5752テスト2 テスト3
テスト4 テスト5 テスト6
テスト7 テスト8 テスト9
テスト10 テスト11 テスト12

合計 64,515

説明

空の「作業領域」から始めます。入力を読み順、つまり右から左、下から上にスキャンします。現在の場所で入力と作業領域の間に不一致がある場合(つまり、カップが入力に存在するが作業領域に存在しない、またはその逆)、カップを作業領域に追加または削除します。ミスマッチが解決されるまでルールに進み、その時点で次の場所に進みます。

正しさ

このメソッドが正しいこと、つまり、結果のシーケンスが入力構造を生成することを示すには、訪問した場所(訪問する各場所で)を変更(カップの追加または削除)しないことを示すだけで十分です。 、作業領域が入力と一致することを確認します。)これは、カップが追加および削除される逆の順序で作業するという事実の簡単な結果です。

  • 場所lのカップは、読み取り順でlに続く場所のカップの前に常に削除されます。したがって、スキャン順でlに先行します。したがって、既に訪れたカップを削除する危険はありません。
  • 同様に、位置にカップLは常にスキャン順で先行し、それが、ことカップの前に追加されることを考えると、その下の2個のカップが既に存在する(またはそれが底ATのこと)。ただし、これらの場所を既に訪れているため、必要なカップを追加しているため、上記のように、後でこれらのカップを削除する危険がないため、この条件が満たされているため、でカップを追加する危険はありませんすでに訪れた場所。

最適性

構造にカップを追加または削除する効果は、構造の生成に使用される操作のシーケンスに依存せず、現在の構成にのみ依存することに注意してください。その結果、特定の構造を生成する操作の最適なシーケンスS n = { s 1、...、s n }が与えられると、 S nは、すなわち、任意の配列S M = { S 1、.. 。、S 、M }、Mはnは、対応する構造が生成する、あるいはより短い配列が存在することになるため、また、最適な配列であり、S n個、同じ構造を生成します。

最適な生成シーケンスの長さの帰納法により、この方法が最適であることを示すことができます。この方法は、最適な生成シーケンスが空の構造に対して最適なシーケンスを明確に生成します。メソッドは、最適なシーケンスの長さがnであるすべての構造に対して最適なシーケンスを生成し、最適なシーケンスS n +1によって生成された構造を考慮します。入力としてS n +1によって生成された構造が与えられると、このメソッドは同じシーケンス(または、少なくとも同じ長さのシーケンス)を生成することを示したいと思います。

上記のように、S nも最適なシーケンスであるため、仮説により、本方法は入力としてS nによって生成された構造が与えられると最適なシーケンスを生成します。一般性を失うことなく、S nがメソッドによって生成されたシーケンスであると仮定します(そうでない場合、S n +1の最初のn個の要素を常に上記のシーケンスで置き換え、長さn +のシーケンスを取得できます1は同じ構造を生成します。)lS n +1の最後の操作(つまり、s n +1)によって変更された場所とし、S mは、プログラムがlに達すると(ただしlを処理する前に)生成するS nの初期セグメントです。S nS n +1によって生成された構造は、lに続くすべての位置で読み取り順序で一致するため、S mは入力と同じ構造であることに注意してください。

場合S N +1であるa(すなわち、カップ添加)、次いで、前述の任意の場所があってはならないLをカップによって生成された構造に付加することができる読み取るために、S N。結果としてのサブシーケンスS n個以下のS mは、すべてでなければなりませんa(ので、rどちらかの空きスペースが前にありますことを暗示するリットル、またはことをS nが最適ではない。)私たちはプロセスに来るときリットル、我々はする必要がありますlにカップを追加する前に正確にn-m個のカップを追加します。したがって、結果のシーケンスはなります。 Sにm、その後に n-m + 1個のa要素が続きます。これは S n +1に等しくなります(この点の後に不一致はありません。したがって、これが生成される完全なシーケンスです)。

同様に、s n +1がの場合、S nによって生成された構造内で、読み取り順でlのr前の位置にカップがあってはなりません。結果としてのサブシーケンスS n個以下のS mは、すべてでなければなりません。プロセスlに来たら、lでカップを削除する前に正確にn-m個のカップを削除する必要があります。したがって、結果のシーケンスは次のようになります。r SのM続いて、N - M + 1つのr要素、再び等しくS Nを 1

言い換えれば、我々の方法は、入力構造に対して最適なシーケンスを生成するため、誘導により、任意の入力構造に対して最適なシーケンスを生成します。

これは、この実装が最も効率的な実装であることを意味するものではないことに注意してください。たとえば、これらの操作を実際に実行する代わりに、各ポイントで直接追加または削除する必要があるカップの数を計算することは間違いなく可能です。

一意性

メソッドの最適性を使用して、実際に最適なシーケンスが一意であることを示すことができます(つまり、2つの異なる最適なシーケンスが同じ構造を生成しないことを示します)。再び、最適な生成シーケンスのサイズの帰納法を使用します。空のシーケンスは、明らかに空の構造の一意の最適な生成シーケンスです。長さnのすべての最適な生成シーケンスが一意であり、2つの最適なシーケンスSによって生成される構造Σを考慮すると仮定します。 n +1および T n +1

S nT n自体が最適であり、したがって、仮説により一意であることを思い出してください。この方法は最適なシーケンスを生成するため、S nT nはこの方法で生成されたものと考えることができます。ましょL SおよびL Tは、最後に操作によって改変位置であるS N +1T 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で始まり、繰り返し命令のシーケンスで終わる)、つまり、Σの最適な生成シーケンスは一意であるため、誘導により、すべての最適な生成シーケンスが一意になります。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.