Чемпіон Фроггера


11

Гра

Більшість із нас знає про Frogger , аркадну гру 80-х років, де мета - безпечно перескочити жабу через напружене шосе та заповнений небезпекою ставок, щоб безпечно прибути додому.

Кілька місяців тому було випущено завдання щодо створення клона Frogger. Але навіщо клонувати Frogger, коли ти можеш грати у Frogger? :)

Розглянемо наступну спрощену ігрову сітку:

 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

У нас є п'ять смуг руху, кожна на 23 клітини шириною, і дві безпечні зони (де жаба може безпечно рухатися ліворуч та праворуч), також 23 клітини шириною. Ви можете ігнорувати праву та ліву межі, оскільки це для наочності наочності.

Наша жаба починається в південній безпечній зоні, в центральній (12-й) клітині, як зазначено на @малюнку вище.

Час у грі поділяється на дискретні кроки, які називаються кадрами. Жаба - це швидка жаба, яка може скакати одну клітинку в будь-якому напрямку (вгору, вниз, вправо, вліво) на кадр. Він також може залишитися нерухомим для будь-якого кадру. Рух по п'яти смугах руху рухається з постійною швидкістю таким чином:

  • рух по експрес-смузі на захід (смуга 1) переміщує 2 комірки зліва від кожного кадру
  • трафік у сітковій смузі східної смуги (смуга 2) рухається по 1 осередку вправо кожного другого кадру
  • трафік по потоку, що протікає по потоку на західній смузі (смуга 3), переміщується по 1 осередку зліва від кожного кадру
  • трафік у сітковій смузі заходу (смуга 4) переміщається по 1 осередку зліва на кожен другий кадр
  • рух по експрес-смузі на схід (смуга 5) рухається по 2 комірки вправо кожного кадру

Сам трафік однозначно визначений на бл. 3 000 часових кроків у цьому текстовому файлі . "Рух" складається з транспортних засобів та просторів між транспортними засобами. Будь-який персонаж, який не є пробілом, є частиною транспортного засобу. Текстовий файл містить п'ять рядків, що відповідають п'яти смугам руху (з однаковим порядком).

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

Для смуг, що перебувають на схід, смугу руху слід вважати "назад" в тому сенсі, що транспортні засоби з'являються починаючи в кінці рядка. На початку кадру 0 ми вважаємо, що перший автомобіль на цих смугах знаходиться лише за лівим краєм ігрового поля.

Розглянемо як приклад:

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

Тоді гральна сітка з’явиться наступним чином:

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

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

Наша жаба лущиться, якщо трапляється щось із наступного:

  • жаба займає клітинку, зайняту транспортним засобом, на будь-якій рамі
  • жаба залишається нерухомою в експрес-смузі, і транспортний засіб шириною 1 клітини проходить над ним у цій рамці
  • жаба стрибає на схід «через» транспортний засіб, який прямує на захід, або стрибає на захід через транспортний засіб, що прямує на схід
  • жаба стрибає за межами 7 (лінії) на 23 (клітинку) граючої сітці, на будь-якому кадрі

Зауважте, що це єдині умови, при яких жаба лягає. Зокрема, дозволено жабу, що стрибає разом із «рухом», як і жаба, що стрибає у клітину або виходить із неї в експрес-смузі, що передається автомобілем шириною-1 у тому ж кадрі.

Мета та підрахунок балів

Завдання програмування полягає в тому, щоб якомога більше разів переходити жабу через дорогу до виходу останнього транспортного засобу з гральної сітки . Тобто програма закінчується відразу після заповнення кадру X , де кадр X - перший кадр, який приймає сітку до стану, коли більше транспортних засобів немає.

Виведенням вашої програми повинен бути рядок (або текстовий файл), що містить послідовність рухів для жаби, використовуючи таке кодування:

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

Наприклад, рядок <<^.^вказує на те, що жаба двічі рухається ліворуч, потім вгору, потім робиться пауза для одного кадру, потім знову рухається вгору.

Один бал набирається кожного разу, коли жаба перетинає південну безпечну зону до північно безпечної зони, і один бал нараховується всякий раз, коли жаба перетинає від безпечної північної зони до південної безпечної зони.

Деякі важливі правила:

  1. Жаба не повинна коситись.
  2. Будь ласка, опублікуйте своє рішення (послідовність рухів) разом із кодом програми, вбудованим чи текстовим файлом (наприклад, використовуючи pastebin.com).
  3. Наша жаба є давнім і невідомим, тому ваша програма може використовувати будь-які дані про трафік у будь-якому кадрі, шукаючи рішення. Сюди входять дані про трафік, який ще не досяг сітки гри.
  4. Сітка не загортається. Вихід із сітки призведе до того, що жаба буде скуйовджена, а значить, заборонена.
  5. Ні в якому разі трафік не "скидається" або жаба "телепортується". Моделювання безперервне.
  6. Жаба може повернутися до безпечної зони на південь після виходу з неї, але це не зараховується. Так само і для північної безпечної зони.
  7. Переможець конкурсу - програма, яка генерує послідовність руху, даючи найбільшу кількість перетинів.
  8. По будь-яких додаткових питаннях чи занепокоєннях, будь ласка, не соромтесь задавати їх у розділі коментарів.

Для деякого додаткового стимулу, я додаю ще суму в 100 переспівів програмі-переможниці, коли зможу це зробити.

Бонуси

+ 2,5% до базового показника * (до + 10%) за кожен кут ігрової сітки, до якого жаба торкається. Чотири кути сітки - це крайній лівий і правий осередки двох безпечних зон.

+ 25% до базового балу *, якщо ваша послідовність рухів утримує жабу в межах +/- 4 клітинок ліворуч або праворуч від його вихідної комірки протягом усього моделювання (він, звичайно, може вільно рухатися вертикально).

Жоден бонусний бонус не буде, але спеціальні реквізити в ОП потраплять до тих, хто опублікує швидкий n 'брудний валідатор рішення, щоб мені не довелося програмувати його. ;) Валідатор просто прийняв би послідовність рухів, забезпечив його законність (відповідно до правил та файлу трафіку) та повідомив про його рахунок (тобто загальну кількість переїздів).

* Загальний бал дорівнює базовому балу плюс бонус, округлений до найближчого цілого числа.

Удачі жаба!


Для всіх, хто хоче опублікувати валідатор рішення: Будь ласка, не публікуйте це як відповідь .
Геобіт

Справді. Посилання на код у коментарі чи як доповнення до рішення є кращим способом подання валідатора.
COTO

Чи повинен перший кадр, в якому просування по повільних смугах буде таким самим, як перший кадр, в якому просуваються інші смуги, або один кадр пізніше?
feersum

Також, чи можна забити, досягнувши крайньої зони на першому кадрі, в якому всі машини очистили поле?
feersum

@feersum: повільні смуги просуваються на один кадр пізніше. Вони залишаються нерухомими в першому кадрі, як зазначено в прикладі. Що стосується того, як жаба забиває останній кадр: так, можливо. Якщо жаба перебралася в безпечну зону на тому ж кадрі, що і останній транспортний засіб, виходить з ігрового поля, нараховується один бал.
COTO

Відповіді:


5

C ++: 176

Вихід:

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

Є до 8 мільйонів станів комбінацій позиції X час X безлічі відвідуваних кутів, так що вони можуть бути вичерпно шукали менш ніж за 1 секунду. Якщо в коді немає помилок, перемогти його слід неможливо. Оптимальною стратегією було використання всієї дошки, оскільки це дозволяє жабі перейти дорогу 160 разів, проти приблизно 120, якщо обмежитися центром. Відвідування кутів не обійшлося без переїздів, оскільки трафік був настільки інтенсивним.

/* 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;
}

1
Я не впевнений, як ви визначаєте "держави". Якщо ми розглянемо стан системи як часовий профіль руху жаби, то існує приблизно 5 ^ 3000 станів, що відповідає профілю руху для 5 ^ 3000 можливих входів (п'ять можливих входів на ~ 3000 кадрів). Очевидно, що лише частина з них виявиться прийнятною, але кількість допустимих штатів було б неможливим для пошуку на багато сотень порядків. Коли ви подаєте остаточну відповідь, будь ласка, надішліть список кроків разом із нею.
COTO

Крім того, якщо це не зрозуміло, зауважте, що жаба може стрибати вліво і вправо, перебуваючи в русі, доки не порушено жодне з "закручених" правил. Ви не обмежуєтесь очікуванням вікон, де жаба може перестрибувати вертикально поперек без бокового руху.
COTO

@COTO У своєму розрахунку "штати" я забув важливу річ, а саме кількість перетинів досі, тому спробував дати більш чітке пояснення. Специфікація була досить добре написана. Здається, я вперше правильно інтерпретував усі ці конкретні проблеми.
feersum

Я обчислюю оптимум як 162 + 10% = 178 перетинів, але ваш досить близький. Я справді не хотів, щоб це виявилося грубим, але я, мабуть, мав би більше продумати проблему. Чесно кажучи, я присуджу вам 100 повторень.
COTO

Мабуть, мені доводиться чекати 24 години, перш ніж присудити "премію". З якої причини: хто знає. ДП не повинен бажати, щоб відповіді були нагороджені пунктуально. Якби ми це зробили, терористи перемогли б. : O
COTO
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.