На 13-й день вам дается вход в две строки. Первая строка содержит число, обозначающее время. Вторая строка содержит строку с идентификаторами шины, разделенными запятыми, которые доставят вас к месту назначения. Каждое число в строке представляет собой время, необходимое для полного путешествия и возврата к исходному положению.

Проблема в том, чтобы найти самый ранний автобус, который доставит вас к месту назначения. Другими словами, предполагая, что вы уезжаете в то время, которое представлено в первый раз, какой автобус прибудет первым, исходя из времени, необходимого для полной поездки. Нам говорят, что на основе входных данных будет только 1 правильный ответ.

Если мы посмотрим на образцы данных:

939
7,13,x,x,59,x,31,19

Мы видим, что есть 5 автобусов, которые доставят нас к месту назначения по второй нитке, и что время, в которое мы уезжаем, - 939.

time   bus 7   bus 13  bus 59  bus 31  bus 19
929      .       .       .       .       .
930      .       .       .       D       .
931      D       .       .       .       D
932      .       .       .       .       .
933      .       .       .       .       .
934      .       .       .       .       .
935      .       .       .       .       .
936      .       D       .       .       .
937      .       .       .       .       .
938      D       .       .       .       .
939      .       .       .       .       .       ---- Time leaving
940      .       .       .       .       .
941      .       .       .       .       .
942      .       .       .       .       .
943      .       .       .       .       .
944      .       .       D       .       .       ---- Earliest bus
945      D       .       .       .       .
946      .       .       .       .       .
947      .       .       .       .       .
948      .       .       .       .       .
949      .       D       .       .       .

Визуально мы видим, что автобус № 7 прибывает каждые семь минут и прибывает в то время, на которое он полностью делится; 931, 938, 935 и т. Д. То же самое касается любого другого идентификатора шины в строке.

Когда мы уезжаем в момент 939, мы видим, что автобус, который прибудет раньше, будет с идентификатором 59 с разницей в 5 до прибытия после нашего времени отправления.

Упрощая этот вопрос, мы можем взять модуль цели и каждый идентификатор шины. Он сообщит нам, сколько времени прошло с момента последнего прибытия этого автобуса. Мы можем использовать это, чтобы вычесть и узнать, сколько времени потребуется, чтобы прибыть следующий автобус. Мы сделаем это для каждой шины и вернем наименьшую разницу.

function day13(input){
    const [departureTime, buses] = input.split('\n')
    let busTime = buses.split(',')
    let minArr = []
    for(let i = 0; i < busTime.length; i++){
        if(!Number(arr[i]){
            busTime.splice(i, 1)
            i--
        }
    }
}
//busTime = [7, 13, 59, 31, 19]

В первой строке мы деструктурируем входные данные и помещаем их в две переменные: leaveTime, который хранит время, в которое мы уходим, и bus, в котором хранится строка. После этого мы разделяем строку и создаем массив времени шины. Оглядываясь назад на пример ввода, у нас есть несколько моментов, обозначенных как «x», которые мы должны удалить. Мы удаляем каждый экземпляр в массиве, не являющийся числом.

function day13(input){
    const [departureTime, buses] = input.split('\n')
    let busTime = buses.split(',')
    let minArr = []
    for(let i = 0; i < busTime.length; i++){
        if(!Number(busTime[i]){
            busTime.splice(i, 1)
            i--
        }
    }
    for(let time of busTimes){ // 7 of [7, 13, 59, 31, 19]
        let mod = target % time // 939 % 7 = 1
        minArr.push(time - mod) // 7 - 1 = 6
    }
}
// minArr = [6, 10, 5, 22, 11]

Во втором цикле мы каждый раз берем модуль цели и каждой шины и сохраняем количество времени до его следующего прибытия в массив.

Значение, которое запрашивает Advent of Code, - это идентификатор автобуса, умноженный на количество времени, которое вам придется ждать, пока он прибудет.

function day13(input){
    const [departureTime, buses] = input.split('\n')
    let busTime = buses.split(',')
    let minArr = []
    for(let i = 0; i < busTime.length; i++){
        if(!Number(busTime[i]){
            busTime.splice(i, 1)
            i--
        }
    }
    for(let time of busTimes){ // 7 of [7, 13, 59, 31, 19]
        let mod = target % time // 939 % 7 = 1
        minArr.push(time - mod) // 7 - 1 = 6
    }
    let min = Math.min(...minArr)
    let index = minArr.indexOf(min)
    return min * arr[index]
}