Нужно суммировать тариф каждой ночи по дню недели. Указанные в примере результаты противоречат тарифам: 7 ночей стоят 10 000 ₽, а три с пятницы — 5 200 ₽.
Расчёт стоимости проживания в гостинице
Нужно суммировать тариф каждой ночи по дню недели. Указанные в примере результаты противоречат тарифам: 7 ночей стоят 10 000 ₽, а три с пятницы — 5 200 ₽.
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
Определение цены за ночевку в отеле. Функция принимает два параметра:
- Количество ночей (обязательный параметр).
- Дата заезда (необязательный параметр). Если дата не указана, используется текущий день. Стоимость проживания в будние дни (с понедельника по пятницу) — 1200 руб. Стоимость проживания в выходные (суббота, воскресенье) — 2000 руб.
const rates = {
weekday: 1200,
holidays: 2000,
};
function calculateBooking(nights, startDate) {
let total = 0;
return total;
}
console.log(calculateBooking(7)); // 31000
console.log(calculateBooking(3, new Date("2023-11-10"))); // 5000
Ответ
Нужно суммировать тариф каждой ночи по дню недели. Указанные в примере результаты противоречат тарифам: 7 ночей стоят 10 000 ₽, а три с пятницы — 5 200 ₽.
Ниже дни трактуются в UTC, чтобы Date('2023-11-10') не смещалась из-за локальной зоны:
function calculateBooking(nights, startDate = new Date()) {
if (!Number.isSafeInteger(nights) || nights < 0) throw new RangeError('Неверное число ночей');
if (!(startDate instanceof Date) || !Number.isFinite(startDate.getTime())) throw new TypeError('Неверная дата');
const firstDay = startDate.getUTCDay();
const weeks = Math.floor(nights / 7);
let total = weeks * (5 * 1200 + 2 * 2000);
for (let i = 0; i < nights % 7; i++) {
const day = (firstDay + i) % 7;
total += day === 0 || day === 6 ? 2000 : 1200;
}
return total;
}
В реальном бронировании календарную дату определяют в часовом поясе гостиницы. Тариф относится к дате начала ночи; государственные праздники условием не заданы.