На 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]
}