Найти тему
Николай Сталин

F. Педро бросает пить — Yandex Cup 2020 Frontend — Пробный раунд

Оглавление

Ограничение времени 100 секунд
Ограничение памяти 640Mb
Ввод: input.json
Вывод: стандартный вывод или output.json

Педро бросает пить. У него есть часы, которые показывают, сколько времени он не пьёт. Когда Педро на очередной вечеринке не удаётся сдержать себя, он нажимает на кнопку, и отсчёт сбрасывается к нулю. Недавно Педро уронил часы, из-за чего перестали работать все стрелки кроме секундной. Но самое печальное — перестала работать кнопка сброса. Пожалуйста, помогите Педро починить часы. Без них в его жизни будет полная неразбериха.

Часы работают на JavaScript и в их основе лежит js-фреймворк под названием Framework. У часов есть 4 стрелки: дни, часы, минуты, секунды. Cтрелки должны двигаться не постоянно, а только в момент переключения периода, который они отсчитывают (по аналогии с работающей секундной стрелкой). При нажатии на кнопку сброса стрелки должны переводиться в 0 движением вперёд за кратчайшее время. После того, как все стрелки достигают 0, они должны продолжить движение.

Пример кода прошивки часов

const ONE_SECOND_DEGREES = 6;  
const ONE_SECOND_FACTOR = 1 / Framework.SPEED * ONE_SECOND_DEGREES;  

class MyClock extends Framework.Clock {  
    constructor() {  
        super();  

        this.arrows.push(new Framework.Arrow("seconds", {  
            color: "red"  
        }));  

        this.arrows.push(new Framework.Arrow("minutes", {  
            weight: 3,  
            length: 80  
        }));  

        this.arrows.push(new Framework.Arrow("hours", {  
            weight: 3,  
            length: 60  
        }));  

        this.arrows.push(new Framework.Arrow("days", {  
            weight: 3,  
            length: 60  
        }));  

        this.buttons.push(new Framework.Button("Reset", () => {  
            alert("reset");  
        }));  

        this.tick = 0;  
    }  

    onBeforeTick() {  
        const [arrow] = this.arrows;  

        this.tick++;  

        arrow.rotateFactor = this.tick % 10 ? 0 : ONE_SECOND_FACTOR;  

        console.log("before: " + arrow.pos);  
    }  

    onAfterTick() {  
        const [arrow] = this.arrows;  

        console.log("after: " + arrow.pos);  
    }  
}

Пример

Ввод:

{
"comment": "положение стрелок",
"steps": [
{ "ticks": 36000 },
{ "ticks": 1200 },
{ "ticks": 150 },
{ "button": 0, "ticks": 4 },
{ "ticks": 9 },
{ "ticks": 2 }
]
}

Вывод:

[
{
"seconds": 0,
"minutes": 0,
"hours": 30,
"days": 0
},
{
"seconds": 0,
"minutes": 12,
"hours": 30,
"days": 0
},
{
"seconds": 90,
"minutes": 12,
"hours": 30,
"days": 0
},
{
"seconds": 0,
"minutes": 0,
"hours": 0,
"days": 0
},
{
"seconds": 0,
"minutes": 0,
"hours": 0,
"days": 0
},
{
"seconds": 6,
"minutes": 0,
"hours": 0,
"days": 0
}
]

Примечания

Откройте HTML-файл тестовой страницы по ссылке «Скачать условие задачи» в конце описания. Вам нужно написать на JavaScript класс с названием MyClock, который реализует поведение, описанное в условии.

class MyClock extends Framework.Clock {  
    // ваш код  
}

При проверке, файл с вашим решением будет подключен на тестовую страницу в место, обозначенное комментарием:

<!-- в качестве решения предоставьте файл solution.js -->  
<script src="solution.js"></script>

Идентификаторы стрелок (первый параметр их конструктора) должны быть такими же, как в примере: "seconds", "minutes", "hours", "days".

Считайте, что деления отсчета дней совпадают с делениями минутной/секундной стрелок. Т.е. один оборот стрелки "days" — это 60 дней.

Ваше решение будет тестироваться в браузере Google Chrome 77.

Скачать условие задачи