Programmer le robot empileur de tasse

36

Je suis sûr que tout le monde a déjà vu que les gobelets peuvent être empilés en pyramides (et autres formes):

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

Oui, Ac'est certainement un personnage adéquat pour représenter une tasse.

De nouvelles tasses pourraient être ajoutées soit sur le sol, à droite de la structure, soit au-dessus de deux tasses adjacentes. Voici à nouveau la structure ci-dessus, mais toutes les places disponibles pour les nouvelles tasses sont marquées par _:

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

Disons que nous voulons construire un robot capable d'assembler ces piles de gobelets. Le robot comprendra deux instructions simples pour manipuler une telle structure:

  • a: Ajoutez une nouvelle tasse dans le premier emplacement disponible dans l’ ordre de lecture de gauche à droite (c’est-à-dire balayez les lignes de haut en bas, de gauche à droite jusqu'à ce que vous trouviez un emplacement disponible, puis placez la tasse à cet endroit). L'exemple ci-dessus deviendrait:

             A A   
            A A A  
     A     A A A A 
    A A A A A A A A
    
  • r: Retirez la première tasse dans l'ordre de lecture de gauche à droite. L'exemple ci-dessus deviendrait:

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

Il s'avère que toute structure peut être construite à partir de zéro en utilisant uniquement ces deux opérations. Par exemple

      A
 A   A A
A A A A A

Peut être construit avec la séquence d'instructions

aaaaaaaaaaaarrrrraa

Le plus grand exemple ci-dessus peut être construit en utilisant

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaarrrrrrrrrrrrrrrrrraaaaaaarr

Voici un encore plus grand:

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

qui peut être construit avec

aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrraaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaarrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrrraaaaaaaaaaaaaaaaaaarrrrrrrrrrrrrrraaaaaaaaaaaaaarrrrrrrrrrraaaaaaaa

Remarque: si les instructions de retrait permettent de libérer des points sur le sol, ils seront réutilisés avant de placer les gobelets à la droite de tous les gobelets existants. Par exemple

aaaarrra

va céder

A   A

ne pas

    A A

Vous pouvez imaginer que le sol repose sur une rangée de tasses semi-infinie.

Le défi

Avec une structure de gobelets empilés, retourne une séquence représentant les instructions pour construire cette structure. Votre score principal est la somme des nombres d'instructions pour les cas de test fournis en bas. En cas d'égalité (ce qui est probable, car je suis convaincu qu'une solution optimale optimale est possible), la solution la plus courte l'emporte.

Voici quelques détails supplémentaires sur les règles:

  • Vous pouvez supposer qu'il n'y a pas d'espaces en tête dans la rangée inférieure de l'entrée. Par conséquent, l'emplacement au sol le plus à gauche d'une tasse est toujours utilisé.
  • Vous pouvez supposer toute quantité raisonnable d’espaces de fin (pas d’espace, un espace, inséré dans un rectangle, puis dans un rectangle avec un seul espace de fin).
  • Vous pouvez éventuellement vous attendre à ce que l'entrée se termine par un retour à la ligne unique.
  • Vous pouvez choisir deux caractères ASCII imprimables distincts (0x20 à 0x7E inclus) à la place d' Aespaces (les règles relatives aux espaces sont ensuite transférées vers le caractère de votre choix).
  • Votre sortie ne doit contenir que deux caractères distincts représentant les opérations (vous pouvez choisir des caractères autres que aet r). Vous pouvez éventuellement imprimer une nouvelle ligne de fin.
  • Votre code doit pouvoir résoudre n'importe lequel des cas de test ci-dessous en moins d'une minute sur un ordinateur de bureau raisonnable (s'il me faut deux minutes, je vous donnerai le bénéfice du doute, mais si cela prend dix, je gagne. 't - Je pense qu'un algorithme optimal est possible, qui résout n'importe lequel d'entre eux en moins d'une seconde).
  • Vous ne devez pas optimiser votre code pour des scénarios de test individuels (par exemple, en les codant en dur). Si je soupçonne quelqu'un de le faire, je me réserve le droit de modifier les cas de test.

Vous pouvez utiliser ce script CJam pour l'opération inverse: il faudra une chaîne d'instructions de construction et imprimer la pile de gobelets résultante. (Merci à Dennis d'avoir réécrit l'extrait et de l'avoir considérablement accéléré.)

Sp3000 a également aimablement fourni ce script Python alternatif dans le même but.

Cas de test

Après chaque cas de test, un numéro indique le nombre optimal d'instructions selon la réponse de 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

Cela signifie que le meilleur score possible est de 64 515 instructions.

Martin Ender
la source

Réponses:

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

Résultats

Test 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 752Test 2 Test 3
Test 4 Test 5 Test 6
Test 7 Test 8 Test 9
Test 10 Test 11 Test 12

Total 64 515

Explication

Nous commençons avec un "espace de travail" vide. Nous balayons l'entrée dans l' ordre de lecture inverse , c'est-à-dire de droite à gauche et de bas en haut. En cas de discordance entre l’entrée et la zone de travail à l’emplacement actuel (c’est-à-dire qu’une tasse est présente dans l’entrée mais pas dans la zone de travail, ou inversement), nous ajoutons ou supprimons des tasses dans la zone de travail, selon aux règles, jusqu'à ce que l'inadéquation soit résolue, à quel point nous continuons à l'emplacement suivant.

La justesse

Pour montrer que cette méthode est correcte, c’est-à-dire que la séquence résultante génère la structure en entrée, il suffit de montrer que nous ne modifions jamais (c’est-à-dire que nous ajoutons ou supprimons des cuvettes sur) les endroits que nous avons déjà visités (depuis, à chaque endroit visité , nous nous assurons que la zone de travail correspond à l’entrée.) C’est une conséquence facile du fait que nous travaillons dans l’ordre inverse dans lequel les gobelets sont ajoutés et supprimés:

  • Une tasse à l' emplacement l sera toujours retiré avant une tasse à un endroit qui réussit l dans l' ordre de lecture, et donc, qui précède l dans l' ordre de balayage, donc il n'y a pas de danger d'enlever une tasse que nous avons déjà visité.
  • De même, un gobelet à l'emplacement l sera toujours ajouté avant un gobelet qui le précède dans l'ordre de numérisation, étant donné qu'il existe déjà deux gobelets en dessous (ou qu'il se trouve en bas); cependant, puisque nous aurons déjà visité ces endroits et ajouté les gobelets nécessaires, et comme indiqué ci-dessus, il n’ya aucun risque que ces gobelets soient retirés par la suite, cette condition est remplie et il n’ya donc pas de danger d’ajouter un gobelet à la place. un endroit que nous avons déjà visité.

Optimalité

Notez que l'effet d'ajout ou de suppression d'une coupe d'une structure ne dépend pas de la séquence d'opérations utilisée pour générer la structure, mais uniquement de sa configuration actuelle. En conséquence, étant donné une séquence optimale S n = { s 1 , ..., s n } d'opérations générant une certaine structure, chaque segment initial de S n , c'est-à-dire toute séquence S m = { s 1 , .. ., s m }, où mn , est également une séquence optimale pour la structure correspondante générée, sinon la séquence serait plus courte que S n, générant la même structure.

Nous pouvons montrer que notre méthode est optimale par induction sur la longueur de la séquence de génération optimale: Notre méthode génère clairement une séquence optimale pour toute structure dont la séquence de génération optimale est vide (une seule structure de ce type est la structure vide.) Supposons que notre méthode génère une séquence optimale pour toutes les structures dont la séquence optimale (ou des séquences) est de longueur n , et considère une structure générée par une séquence optimale S n +1 . Nous voulons montrer que, étant donné la structure générée par S n +1 en entrée, notre méthode produit la même séquence (ou, au moins, une séquence de même longueur).

Comme indiqué ci-dessus, S n est également une séquence optimale et, par hypothèse, notre méthode produit une séquence optimale en fonction de la structure générée par S n en entrée. Supposons, sans perte de généralité, que S n est la séquence produite par notre méthode (sinon, nous pouvons toujours remplacer les n premiers éléments de S n +1 par ladite séquence et obtenir une séquence de longueur n + 1 qui génère la même structure.) Soit l l’emplacement modifié par la dernière opération dans S n +1 (à savoir, s n +1 ), etS m est le segment initial de S n , que notre programme aura produit une fois qu’il aura atteint le l (mais avant le traitement du l ). Notez que, puisque les structures générées par S n et S n + 1 s'accordent dans tous les emplacements qui suivent l , dans l'ordre de lecture, S m est identique, quelle que soit la structure en entrée.

Si s n +1 est a(c.-à-d. Addition d'une tasse), il ne doit y avoir aucun emplacement précédant l , dans l'ordre de lecture, où une tasse peut être ajoutée à la structure générée par S n . En conséquence, la sous-séquence de S n qui suit S m doit être tout a(puisqu’un rimpliquerait qu’il existe un espace vide avant l , ou que S n n’est pas optimal.) Lorsque nous en viendrons au traitement de l , nous devrons ajouter exactement n - m tasses avant d’ajouter une tasse en l , d’où la séquence résultante sera Sm , suivi de n - m + 1aéléments, ce qui équivaut à S n +1 (il n'y aura aucune discordance après ce point, d'où la séquence complète produite.)

De même, si s n +1 est r, il ne doit y avoir aucune coupe à un emplacement précédant l , dans l'ordre de lecture, dans la structure générée par S n . En conséquence, la sous-séquence de S n qui suit S m doit être tout r. Lorsque nous en viendrons au traitement de l , nous devrons supprimer exactement n - m tasses avant de pouvoir supprimer la coupe en l ; la séquence résultante sera donc S m , suivie de n - m + 1 réléments, ce qui correspond à nouveau à S n +1 .

En d'autres termes, notre méthode produit une séquence optimale pour ladite structure d'entrée, et donc, par induction, pour toute structure d'entrée.

Notez que cela ne signifie pas que cette implémentation est la plus efficace. Il est certainement possible, par exemple, de calculer le nombre de gobelets à ajouter ou à supprimer directement à chaque point, au lieu de réaliser ces opérations.

Unicité

Nous pouvons utiliser l'optimalité de notre méthode pour montrer que les séquences optimales sont, en fait, uniques (c'est-à-dire qu'aucune séquence optimale optimale ne génère la même structure). Nous utilisons à nouveau l'induction sur la taille de la séquence génératrice optimale: La séquence vide est évidemment l'unique séquence génératrice optimale de la structure vide. Supposons que toutes les séquences génératrices optimales de longueur n soient uniques et considérons une structure,, générée par les deux séquences optimales S n +1 et T n +1 .

Rappelons que S n et T n sont eux-mêmes optimaux et donc, par hypothèse, uniques. Puisque notre méthode produit des séquences optimales, S n et T n peuvent être considérés comme générés par notre méthode. Soit l S et l T les emplacements modifiés par la dernière opération dans S n +1 et T n +1 , respectivement, et supposons, sans perte de généralité, que l S suive ou soit égal à l T dans l'ordre de lecture. Depuis les structures générées par S net T n conviennent dans tous les endroits suivant l S , dans l' ordre de lecture, la séquence produite par notre procédé, compte tenu de la structure , soit comme entrée, une fois qu'il atteint l S (mais avant de le traiter), est le même pour les deux; appeler cette séquence U .

Puisque la dernière action de S n + 1 modifie l S , si a une tasse en l S, il ne doit y avoir aucune vacance avant l S , et si n'a pas de tasse en l S, il ne doit en exister aucune. tasse avant l S , en ordre de lecture. Par conséquent, le reste de la séquence générant Σ, à la suite de U , doit consister en une application répétée de la même instruction, dictée par la présence ou non d'un gobelet en 1 S (sinon elle ne serait pas optimale). En d'autres termes, S n +1 et T n +1sont égaux (ils commencent tous deux par U et se terminent par ladite séquence d'instructions répétées), c'est-à-dire que la séquence de génération optimale de est unique et que, par induction, toutes les séquences de génération optimales sont uniques.

Aune
la source