21 subscriber

A. Хакерский подбор. Чемпионат по программированию Яндекса: Фронтенд, Квалификация

Пару месяцев назад одна известная компания выпустила новые телефоны. Вместе с тем стала доступна новая более совершенная версия операционной системы. И вот беда — в новой операционке обновлённая система защиты от пиратства.

Хакера Катю это не пугает. Она взламывает телефоны, чтобы можно было устанавливать на них свою версию прошивки и играть бесплатно. Работа над взломом почти завершена.

Сейчас Катя столкнулась с финальной преградой. Нужно подобрать специальный бинарный код — такой, десятичное представление которого будет минимальным. Изменять можно только непрерывную последовательность (отрезок) и только один раз. Код изменяется извне по правилам, которые описала Катя отдельно от решения.

Она уже набросала на коленке решение, но оно работает очень медленно. Помогите ей ускорить его, чтобы оно проходило тесты.

Катин код

На вход подаётся число и функция для замены кода.

Первый аргумент — число a. Оно всегда определено и находится в промежутке между 1 и 10 ** 20. Второй аргумент — функция замены. На входе цифра, которая есть в числе a, на выходе — цифра x (может быть другая, может быть такая же). Цифра на выходе всегда определена и находится в промежутке 0 и 9.

function solve ({ a, replace }) {  
    const variants = [String(a)];  
    for(let i = 0; i < String(a).length; i++) {  
        for (let j = 0; j < String(a).length; j++) {  
                variants.push(  
                    String(a).split(’’).map((char, index) => {  
                        if (index < i) {  
                            return char;  
                        } else if (index > j) {  
                            return char;  
                        } else {  
                            return replace(char);  
                        }  
                    }).join(’’),  
                );  
        }  
    }  
    return Math.min(...variants.map(v => parseInt(v, 10)));  
}  
module.exports = solve;

Функция solve должна вернуть минимальное число, которое должно получиться после применения замены кода Кати.

Примеры

solve ({ a: 9128, replace: (x) => [8, 8, 8, 5, 7, 6, 7, 1, 7, 0][x] }); // 128  

solve ({ a: 33, replace: (x) => [0, 1, 1, 1, 1, 1, 1, 1, 1, 1][x] }); // 11

Примечания

В качестве решения предоставьте файл, который экспортирует исправленный вариант функции solve:

function solve ({ a, replace }) {  
  // ...  
}  
module.exports = solve;

Решение будет запускаться в Nodejs 12.