Champion de la grenouille

11

Le jeu

La plupart d'entre nous connaissent Frogger , le jeu d'arcade des années 80 où l'objectif est de sauter une grenouille en toute sécurité sur une route très fréquentée et un étang rempli de dangers pour arriver en toute sécurité à la maison.

Un défi a été lancé il y a quelques mois pour développer un clone Frogger. Mais pourquoi cloner Frogger quand vous pouvez jouer à Frogger? :)

Considérez la grille de jeu simplifiée suivante:

 XXXXXXXXXXXXXXXXXXXXXXX  North Safe Zone
 -----------------------
|                       | <<<<       Express Lane West        (Lane 1)
|                       |     >      Gridlock East            (Lane 2)
|                       |   <<       Freeflowing Traffic West (Lane 3)
|                       |    <       Gridlock West            (Lane 4)
|                       |     >>>>   Express Lane East        (Lane 5)
 -----------------------
 XXXXXXXXXXX@XXXXXXXXXXX  South Safe Zone
 \__________ __________/
            '
  23 cells horizontally

Nous avons cinq voies de circulation, chacune de 23 cellules de large, et deux zones de sécurité (où la grenouille peut se déplacer en toute sécurité à gauche et à droite), également de 23 cellules de large. Vous pouvez ignorer les bordures droite et gauche car elles le sont pour la clarté des images.

Notre grenouille commence dans la zone de sécurité sud, sur la cellule centrale (12e), comme indiqué par un @dans la figure ci-dessus.

Le temps dans le jeu est divisé en étapes discrètes appelées trames. Froggy est une grenouille rapide et peut sauter une cellule dans n'importe quelle direction (haut, bas, droite, gauche) par image. Il peut également choisir de rester immobile pour n'importe quelle image. La circulation dans les cinq voies se déplace à vitesse constante comme suit:

  • le trafic dans la voie express ouest (voie 1) se déplace de 2 cellules à gauche à chaque image
  • le trafic dans la voie d'embouteillage est (voie 2) se déplace de 1 cellule à droite toutes les deux images
  • le trafic dans la voie ouest à circulation libre (voie 3) se déplace de 1 cellule à gauche à chaque image
  • le trafic dans la voie ouest bloquée (voie 4) se déplace de 1 cellule à gauche toutes les deux images
  • le trafic dans la voie express est (voie 5) déplace 2 cellules à droite à chaque image

Le trafic lui-même est défini de manière unique pendant env. 3000 pas de temps dans ce fichier texte . Le «trafic» se compose de véhicules et d'espaces entre les véhicules. Tout personnage qui n'est pas un espace fait partie d'un véhicule. Le fichier texte contient cinq lignes, correspondant aux cinq voies de circulation (avec le même ordre).

Pour les voies en direction ouest, au début de l'image 0 (le début du jeu), nous considérons que le premier véhicule dans la voie est juste au-delà du bord droit de la grille de jeu.

Pour les voies en direction est, la chaîne de circulation doit être considérée "en arrière" dans le sens où les véhicules apparaissent à partir de la fin de la chaîne. Au début de l'image 0, nous considérons que le premier véhicule dans ces couloirs est juste au-delà du bord gauche du terrain de jeu.

Considérez comme exemple:

Traffic Lane 1:  [|==|  =
Traffic Lane 2:  |) =  o
Traffic Lane 3:  (|[]-[]:
Traffic Lane 4:  <| (oo|
Traffic Lane 5:  |==|] :=)

Ensuite, la grille de jeu apparaîtra comme suit:

Start of Frame 0       XXXXXXXXXXXXXXXXXXXXXXX
                                              [|==|  =
                |) =  o
                                              (|[]-[]:
                                              <| (oo|
              |==|] :=)
                       XXXXXXXXXXXXXXXXXXXXXXX

Start of Frame 1       XXXXXXXXXXXXXXXXXXXXXXX
                                            [|==|  =
                |) =  o
                                             (|[]-[]:
                                              <| (oo|
                |==|] :=)
                       XXXXXXXXXXXXXXXXXXXXXXX

Start of Frame 2       XXXXXXXXXXXXXXXXXXXXXXX
                                          [|==|  =
                 |) =  o
                                            (|[]-[]:
                                             <| (oo|
                  |==|] :=)
                       XXXXXXXXXXXXXXXXXXXXXXX

Start of Frame 3       XXXXXXXXXXXXXXXXXXXXXXX
                                        [|==|  =
                 |) =  o
                                           (|[]-[]:
                                             <| (oo|
                    |==|] :=)
                       XXXXXXXXXXXXXXXXXXXXXXX

Une fois que tout le trafic dans une voie est "épuisé" (c'est-à-dire que la chaîne est épuisée), nous considérons que tous les caractères de la chaîne sont des espaces.

Notre grenouille est écrasée si l'un des événements suivants se produit:

  • la grenouille occupe une cellule occupée par un véhicule, sur n'importe quel châssis
  • la grenouille reste immobile dans une voie express et un véhicule d'une largeur de cellule passe sur lui dans ce cadre
  • la grenouille saute vers l'est "à travers" un véhicule se dirigeant vers l'ouest, ou saute vers l'ouest à travers un véhicule se dirigeant vers l'est
  • la grenouille saute en dehors de la grille de jeu 7 (ligne) par 23 (cellule), sur n'importe quelle image

Notez que ce sont les seules conditions dans lesquelles une grenouille est écrasée. En particulier, une grenouille sautant le long du trafic "avec" est autorisée, tout comme une grenouille sautant dans ou hors d'une cellule dans une voie express qui est dépassée par un véhicule de largeur 1 dans le même cadre.

Objectif et notation

L'objectif du défi de programmation est de faire passer la grenouille sur la route autant de fois que possible avant que le dernier véhicule ne quitte la grille de jeu . C'est-à-dire que le programme se termine immédiatement après la fin de la trame X , où la trame X est la première trame qui amène la grille dans un état où plus aucun véhicule n'est présent.

La sortie de votre programme doit être une chaîne (ou un fichier texte) contenant la séquence de mouvements pour la grenouille en utilisant l'encodage suivant:

<   frog moves left
>   frog moves right
^   frog moves up
v   frog moves down
.   frog remains stationary

Par exemple, la chaîne <<^.^indique que la grenouille se déplace vers la gauche deux fois, puis vers le haut, puis s'arrête pendant une image, puis se déplace à nouveau.

Un point est marqué chaque fois que la grenouille passe de la zone de sécurité sud à la zone de sécurité nord, et un point est marqué chaque fois que la grenouille passe de la zone de sécurité nord à la zone de sécurité sud.

Quelques règles importantes:

  1. La grenouille ne doit pas être écrasée.
  2. Veuillez poster votre solution (séquence de mouvements) avec votre code de programme, soit en ligne soit sous forme de fichier texte (par exemple en utilisant pastebin.com).
  3. Notre grenouille est prémonitoire et précognitif, c'est pourquoi votre programme peut utiliser toutes les données de trafic dans n'importe quel cadre tout en recherchant des solutions. Cela inclut les données pour le trafic qui n'a pas encore atteint la grille de lecture.
  4. La grille ne s'enroule pas. Sortir de la grille provoquera l'écrasement de la grenouille et n'est donc pas autorisé.
  5. A aucun moment, le trafic n'est "réinitialisé" ou la grenouille "téléportée". La simulation est continue.
  6. La grenouille peut retourner dans la zone de sécurité sud après sa sortie, mais cela ne compte pas comme un point. De même pour la zone de sécurité nord.
  7. Le gagnant du concours est le programme qui génère la séquence de déplacement donnant le plus grand nombre de traversées.
  8. Pour toute question ou préoccupation supplémentaire, n'hésitez pas à demander dans la section commentaires.

Pour une incitation supplémentaire, j'ajouterai une prime de +100 rep au programme gagnant lorsque je serai en mesure de le faire.

Bonus

+ 2,5% au score de base * (jusqu'à + 10%) pour chaque coin de la grille de jeu que la grenouille touche. Les quatre coins de la grille sont les cellules les plus à gauche et à droite des deux zones de sécurité.

+ 25% au score de base * si votre séquence de mouvements maintient la grenouille confinée à +/- 4 cases à gauche ou à droite de sa case de départ pour toute la simulation (il peut bien sûr se déplacer librement verticalement).

Aucun bonus de score, mais les accessoires spéciaux de l'OP iront à toute personne qui publie un validateur de solution rapide et sale, de sorte que je n'ai pas à en programmer un. ;) Un validateur accepterait simplement une séquence de mouvements, assurerait sa légalité (selon les règles et le fichier de trafic), et rendrait compte de son score (ie le nombre total de passages).

* Le score total est égal au score de base plus le bonus, arrondi à l'entier le plus proche.

Bonne chance à la grenouille!

COTO
la source
À tous ceux qui souhaitent publier un validateur de solution: veuillez ne pas le poster comme réponse .
Geobits
En effet. Un lien vers le code dans un commentaire, ou en tant qu'addendum à une solution, serait le moyen préféré de soumettre un validateur.
COTO
La première image dans laquelle les voies lentes avancent doit-elle être la même que la première image dans laquelle les autres voies avancent, ou une image plus tard?
feersum
De plus, est-il possible de marquer en atteignant la zone d'arrivée sur la première image dans laquelle toutes les voitures ont dégagé le terrain?
feersum
@feersum: Les voies lentes avancent d'une image plus tard. Ils restent immobiles dans la toute première image, comme indiqué dans l'exemple. Quant à la grenouille qui marque sur la toute dernière image: oui, c'est possible. Si la grenouille s'est déplacée dans une zone de sécurité sur la même image que le dernier véhicule quitte le terrain de jeu, un point est marqué.
COTO

Réponses:

5

C ++: 176

Production:

176
^^^^^^>vvvvvv>^^^^>^^>>>>>>><<<.vv>v<<<.vvv<<<<<<^.^.^.^.>.>^^<.>>>>>>v>v>.>v<<<<v.<.vv<<<<<^^.<^<<<<<<^.^^>>>>vv>.>.v<v.vv>>^>>^<^<<<<<<<^>.>^^<<<.>>>>>vv>v<vvv<<<<<^^.<^^^^.....vv>.>.>.>v<<vvv<<>>>>^>^<.<.^^>^^>>>>vv.>v<vv.v^>^<.<.<^<^>.>^^>>>>vv.v<<<<<<.vvv<<<<^^^<<v^^.>.^^..>>>>>>vv>.>.v.vvv>>>^>^^<<<<<<<<<^>.>^^>>>>vvv<<v.<.vv<<<<<<>>>>>^^^<<<^^^<<>>vv>.v<<>vvv<<><>>>>>>>^>^^<^^^<.>>>>>>>>vv>.>v<<<vvv<<<<<^^^<<v.<.<^<<^.^<<^...>>>>>>>>>>>>>vv>v<vvv<<<<<<<<^>^.<.^^>.>^^<<<<<<<..>>>>vv>.vvvv<<<<>^.v>>>^^.^^>^<^<>>>>>>>>>vv>vvvv<<<<^^^<^>^<<^.>>vv>v<vvv<<<<<<<>>>>>>>^>^^^.^^>>>>>vvv<<vvv<<<^^^^^^<vvv<<<<<<<vvv<<<>>>>>>>>^^.<.<.^.^.^<^<>>>>>>>>>>vvv<<.vvv<<<^^<^<<^^<<^<<<>>>>vv>.vvvv>>^>>^<.<.<^<<<<<.^^<<^.......>vv.>.>.>v<vvv>>>>>>^>^.<.<^<.^^^<.>>>>>>>vvv<<<v.<vv<<<^^<.<.<.<^<<<^>^^..........v<vvvv>v>>>>>^>>^^^>^^>>>vv>v<vvv<<<<<<<<>^^.<.<^<^^^<.........>vv.>.vvvv>>>>^^<.<.<^^^<^<<.v<v>.>.>.>.>.>.>.vvv.v<<<<<^^<^<^>.>.>.>.^<^.>>>>>>>>vv>v<<vvv<<>>>>>^^^.^.>^<^<<<<<<<<.vv.>.v<<<.vvv<>>>>>^>^.<.<.<.<^^.^<<^<.....>>vvv<.>>vvv<<<>>>>>>>>^^^<<<.^.>.>^^.>>>>>vv.>v<vvv<<<>>>>>>^>^<^<<^.^^<vvv<<<<<vv.v<>>>>>>>>>>^>^.^^>^^<<<<.>vv.>.vvvv>^>>^.<.<.<^<<<^>^^>>>vv>v<<<<<vvv<<<>>>>>^^<.<.<.<.<^<^>.^^.>>>>>vv>v<>vvv<<<<<<<^>^.<^<<<<<<<^^^.>>>>>vv>v<>vvv>>>^^<.<^<<<^>^^.>>>>vv>.v<<vvv<<<<<^^^<<<<<^>.^^<>>>>>>>vv>.>v<<vvv<<<<<<<>>>^>>.>^^^.>^^<>>>>>>vv>vv.<.<.vv>>>>^^<.<.<.<^<<^.>^^.>>>>>vv.>.>v<<vvv<<>>>>>^^<.<.<.^^>.>.>^^<<<<<<<<.>>>>>>vv>v<<v.<.<vv<<<<^^.<^<<<.^^^<.vv.>v<vvv<<<>>>>>>^>^<^<<^.^<^<<.>>vv>.>.>.>vvvv>>>>>>^>^^^^^<<<.vvv<<<<<<vvv>>>>>^>^<.<^<<^.>.>.^^>>>>vv>.>v<<<<<<vvv<<<<^^^<.^.>^^>>>>vvv<<v.vv<<<^>>^^<<<.^^<<^>>>>>>>>>vvv.v.vv<>>>>>^>^^<<<<<<<<<<<<<<<<^^^..>>>>>vv>.>.>.>v<<v.<.<.vv<<<<<^^^<^>.^^...>>>>>>>>vv.v<.vvv>>>^>^<.<^^^^>>>vv>v<<<vvv<<<<>>>>>>^>^.<.<^<^>.>^^.>>>>>vv.v<<<<<<<<vvv<<<<^^<^<<<<<><^>.>^^>>>>vv.>.>.vvv.v>>>>>>>^^<.<^<<^^^>>>vv>.>.>.>.>v<<v.<.<vv>>>>^^^<<<<<.^.>^^>>>vv>.>v<vvv<<<<^^<.<.<.^^>^^>>>vv>.>.v<<<v.<vv<<<<^^.<^<<<^^^>>>>vvvvvv<<<<<<<<>^^.^>>^^^<>>>>>>>vvv<<<v.vv>>>>>^>>^^<<<<<^>.^^>>>>vv>.>v<<<<vvv<<<^^<.<.<.<^<<<<<^>^^>>>>vv.>vv.v.v<^>.>^.<.^^^^>>>>vv>.>.>.v<<<<<<vvv>>>>^^<.<.<^<<^^<^>>>>>>vv>v<<.vvv^>^^<<<^>^^<<<<<<.vvv<<vv>.v>>>>>>^>.>^^<<<<<^>.>.>.>.>.^^>>>>vv>.>.>v<<<<<vvv<<<<^^<^<<^.^^>>>>vv>.>.>.>v<vvv<<<<<^^.<.<^<<^^^>>>>>>>>>>>vv>.>.>.>.>vvvv<<<<^^.<.<^<^^^<<<<<<vvv<v.<vv<<<<^v>>>>>>>>>>^^^<.^.>.>.^^>>>>vvv<<<<<<<vvv<<<<<<<>^^.<^<.^^^.>>>>vv>v<vvv<>>>>^^.<.^.^.>.^<^>>>>>>>>vvvv.<.<vv<<<<^^^<<<<<^>.^^<.vv>.v<<vvv<<><>>>>>^>>^.<^<^^^<<<.>>vv>.>v<<<<v.vv>^>>^.<^^.^^.>>>>>vv>.>.>.v<v.<vv<<<<<^.^^^.>^^<>>>>>>vv>.v<<<v.<vv<<<<>>>>>>>>>>>^^<.<.<.<.<^<<^^<^<<<>>>>>>>vv>v<<<vv.v>>>>>>>>^>^<.<^<<<<<<<<<<<.^.>^^<<<vvv.v.<vv<<<^.>>^.<^^.>.>^^<<......vv.v>vvv>>>^.v^>>^^<<^^^<.>>>>>>>vvv<v.<.<.vv<<<<^^<.<.<.^^^^<.>>>>>>>>vvv<v.<vv^.>^^<<^^^vv>vvvv^>>>>>>>^^^^^vvvvvv^^^^^^vvvvvv>>>>

Il y a moins de 8 millions de combinaisons d' états de position X temps X ensemble de coins visités, de sorte qu'ils peuvent être recherchés de manière exhaustive en moins d'une seconde. Si le code ne contient aucun bogue, il devrait être impossible de le battre. La stratégie optimale était d'utiliser toute la planche, car cela permet à Froggy de traverser la route 160 fois, contre environ 120 lorsqu'elle est confinée au centre. Visiter les virages n'a coûté aucun passage car la circulation était très dense.

/* feersum  2014/9
 /codegolf/37975/frogger-champion */

#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <cstring>

#define B(F, CST, X, Y) best[ ((F)*NCST + (CST)) * BS + (Xmax-Xmin+1) * ((Y)-Ymin) + (X)-Xmin]
#define TL(i) ((int)t[i].length())
#define ABSPEED(I) (speed[i]<0?-speed[i]:speed[i])
#define errr(X) { cout<<"ERROR!!!!!!!!"; return X; }

#define DRAW 0
#if DRAW
    #include <unistd.h>
#endif


using namespace std;

int bc(int cs) {
    int c = 0;
    while(cs) {
        c += cs&1;
        cs >>= 1;
    }
    return c;
}

int main()
{
    const bool bonusTwentyfive = false;
    const int COLS = 23, T_ROWS = 5, YGS = T_ROWS + 2, XGS = COLS + 2;
    string t[5];
    int speed[] = {-4, 1, -2, -1, 4};
    ifstream f("t.txt");
    for(int i = 0; i < T_ROWS; i++)
        getline(f, t[i]);
    if(f.fail())
        return 1;
    f.close();
//for(int i = 0; i < 5; i ++)t[i]="xxx";

    char g[XGS][YGS];

    int mov[][3] = { {-1,  0, '<'},
                     {+1,  0, '>'},
                     { 0, -1, '^'},
                     { 0, +1, 'v'},
                     { 0,  0, '.'} };


    int Ymin = 0, Ymax = YGS-1;


    const int Xstart = 11, Xmaxmove = bonusTwentyfive ? 4 : 10;
    const int Xmin = Xstart - Xmaxmove, Xmax = Xstart + Xmaxmove;

    const int NCST = bonusTwentyfive ? 1 : 1<<4;

    int maxfr = 0;
    for(int i = 0; i < T_ROWS; i++) {
        if(speed[i] < 0) {
            for(int m = 0, n = t[i].length()-1; m < n; ++m,--n)
                swap(t[i][m], t[i][n]);
        }
        int carslen = TL(i);
        for(char*c = &t[i][speed[i]>0?TL(i)-1:0]; carslen; carslen--, speed[i]>0?--c:++c)
            if(*c != ' ')
                break;
        if(carslen)
            maxfr = max(maxfr, ( (carslen + COLS) * 2 + ABSPEED(i)-1 ) / ABSPEED(i));
    }
    const int BS = (Xmax-Xmin+1)*(Ymax-Ymin+1);
    int *best = new int[(maxfr+1)*NCST*BS];
    memset(best, 0xFF, (maxfr+1)*NCST*BS*sizeof(int));
    memset(g, ' ', sizeof(g));
    B(0, 0, Xstart, Ymax) = 0;

    for(int fr = 0; fr < maxfr; fr++) {
        for(int r = 0; r < T_ROWS; r++) {
            for(int x = 0; x < XGS; x++) {
                int ind = speed[r] > 0 ? TL(r)-1 + x - fr*speed[r]/2 : x - (XGS-1) - fr*speed[r]/2;
                g[x][r+1] = ind >= 0 && ind < TL(r) ? t[r][ind] : ' ';
            }
        }
        for(int x = Xmin; x <= Xmax; x++) {
            for(int y = Ymin; y <= Ymax; y++) {
                if(g[x][y] != ' ')
                    continue;
                for(unsigned m = 0; m < sizeof(mov)/sizeof(mov[0]); m++) {
                    int X = x + mov[m][0], Y = y + mov[m][1];
                    if(X < Xmin || X > Xmax || Y < Ymin || Y > Ymax)
                        continue;
                    if(!(mov[m][0]|mov[m][1]) && y > 0 && y > T_ROWS && g[x][y-speed[y-1]/4] != ' ')
                        continue;

                    int csor = ((X==Xmin|X==Xmax)&(Y==Ymin|Y==Ymax)&!bonusTwentyfive) << ((X==Xmax) + 2*(Y==Ymax));

                    for(int cs = 0; cs < NCST; cs++) {
                        int N = B(fr, cs, x, y);
                        if(!~N)
                            continue;
                        if((!(N&1) && y == 1 && Y == 0) ||
                              (N&1 && y == T_ROWS && Y == T_ROWS+1))
                            ++N;
                        if(N > B(fr+1, cs|csor, X, Y))
                            B(fr+1, cs|csor, X, Y) = N;
                    }


                }
            }
        }
    }

    int score = 0, xb, yb, cb, nb;
    for(int x = Xmin; x <= Xmax; x++) {
        for(int y = Ymin; y <= Ymax; y++) {
            for(int cs = 0; cs < NCST; cs++) {
                if(B(maxfr, cs, x, y) * (40 + bc(cs)) / 40 >= score) {
                    score = B(maxfr, cs, x, y) * (40 + bc(cs)) / 40;
                    xb = x, yb = y, cb = cs, nb = B(maxfr, cs, x, y);
                }
            }
        }
    }
    char *mvs = new char[maxfr+1];
    mvs[maxfr] = 0;

    for(int fr = maxfr-1; fr >= 0; --fr) {
        for(int r = 0; r < T_ROWS; r++) {
            for(int x = 0; x < XGS; x++) {
                int ind = speed[r] > 0 ? TL(r)-1 + x - fr*speed[r]/2 : x - (XGS-1) - fr*speed[r]/2;
                g[x][r+1] = ind >= 0 && ind < TL(r) ? t[r][ind] : ' ';
            }
        }
        for(int x = Xmin; x <= Xmax; x++) {
            for(int y = Ymin; y <= Ymax; y++) {
                if(g[x][y] != ' ')
                    continue;

                for(unsigned m = 0; m < sizeof(mov)/sizeof(mov[0]); m++) {
                    int X = x + mov[m][0], Y = y + mov[m][1];
                    if(X < Xmin || X > Xmax || Y < Ymin || Y > Ymax)
                        continue;
                    if(!(mov[m][0]|mov[m][1]) && y > 0 && y > T_ROWS && g[x][y-speed[y-1]/4] != ' ')
                        continue;

                    int csor = ((X==Xmin|X==Xmax)&(Y==Ymin|Y==Ymax)&!bonusTwentyfive) << ((X==Xmax) + 2*(Y==Ymax));

                    for(int cs = 0; cs < NCST; cs++) {
                        int N = B(fr, cs, x, y);
                        if(!~N)
                            continue;
                        if((!(N&1) && y == 1 && Y == 0) ||
                              (N&1 && y == T_ROWS && Y == T_ROWS+1))
                            ++N;
                        if(X==xb && Y==yb && N == nb && (cs|csor) == cb) {
                            mvs[fr] = mov[m][2];
                            xb = x, yb = y, nb = B(fr, cs, x, y), cb = cs;
                            goto fr_next;
                        }
                    }
                }
            }
        }
        errr(3623);
        fr_next:;
    }

    if((xb-Xstart)|(yb-Ymax)|nb)
        errr(789);
    #if DRAW

        for(int fr = 0; fr <= maxfr; ++fr) {
            memset(g, ' ', sizeof(g));
            for(int r = 0; r < T_ROWS; r++) {
                for(int x = 0; x < XGS; x++) {
                    int ind = speed[r] > 0 ? TL(r)-1 + x - fr*speed[r]/2 : x - (XGS-1) - fr*speed[r]/2;
                    ind >= 0 && ind < TL(r) ? g[x][r+1] = t[r][ind] : ' ';
                }
            }
            g[xb][yb] = 'F';
            for(int y = 0; y < YGS; y++) {
                for(int x = 0; x < XGS; x++)
                    cout<<g[x][y];
                cout<<endl;
            }
            cout<<string(XGS,'-')<<endl;
            usleep(55*1000);
            for(int i = 0; i < 5; i++) {
                if(mvs[fr] == mov[i][2]) {
                    xb += mov[i][0];
                    yb += mov[i][1];
                    break;
                }
            }
        }

    #endif
    cout<<score<<endl;
    cout<<mvs<<endl;
}
feersum
la source
1
Je ne sais pas comment vous définissez les "états". Si nous considérons que l'état du système est le profil temporel du mouvement de la grenouille, il y a environ 5 ^ 3000 états, correspondant au profil de mouvement pour les 5 ^ 3000 entrées possibles (cinq entrées possibles par ~ 3000 images). De toute évidence, seule une fraction de ceux-ci se révélera admissible, mais le nombre d'états admissibles serait impossible à rechercher par plusieurs centaines d'ordres de grandeur. Lorsque vous soumettez votre réponse finale, veuillez soumettre une liste de mouvements avec elle.
COTO
De plus, dans le cas où ce n'est pas clair, notez que la grenouille peut sauter à gauche et à droite pendant la circulation, tant qu'aucune des règles "écrasées" n'est violée. Vous n'êtes pas limité à attendre des fenêtres où la grenouille est capable de sauter verticalement sans mouvement latéral.
COTO
@COTO Dans mon calcul des "états", j'ai oublié une chose importante, à savoir le nombre de passages jusqu'à présent, alors j'ai essayé de donner une explication plus claire. La spécification était assez bien écrite. Il semble que j'ai interprété correctement tous ces problèmes particuliers la première fois.
feersum
Je calcule l'optimum comme 162 + 10% = 178 croisements, mais le vôtre est assez proche. Je ne voulais vraiment pas que cela se révèle être capable de force brute, mais évidemment j'aurais dû réfléchir davantage au problème. En toute justice, je vais vous attribuer les 100 représentants.
COTO
Apparemment, je dois attendre 24 heures avant d'attribuer la "prime". Pour quelle raison: qui sait. SE ne doit pas vouloir que les réponses soient récompensées ponctuellement. Si nous faisions cela, les terroristes gagneraient. : O
COTO