Очень нужна помощь в JavaScript. Задание для новичков, но совсем не удаётся решить ее.
Дано три линии ветки метро и нужно посчитать расстояние между станциями. Все три линии пересекаются только на одной станции “Park Street”. Скажем, если я сяду на одной станции метро, а выйду на другой, то сколько остановок я проеду?
Ниже прилагается скелет кода. Пожалуйста, помогите разобраться.
const subwayLines = {
Red: [
'South Station',
'Park Street',
'Kendall',
'Central',
'Harvard',
'Porter',
'Davis',
'Alewife'
],
Green: [
'Government Center',
'Park Street',
'Boylston',
'Arlington',
'Copley',
'Hynes',
'Kenmore'
],
Orange: [
'North Station',
'Haymarket',
'Park Street',
'State',
'Downtown Crossing',
'Chinatown',
'Back Bay',
'Forest Hills'
]
}
const stopNumber = function (stop, line) {
for (let i = 0; i < line.length; i++) {
if (line[i] === stop) {
return i
}
}
return 0
}
const stopsOnOneLine = function (line, start, end) {
const stops =
stopNumber(start, subwayLines[line]) -
stopNumber(end, subwayLines[line])
return stops < 0 ? -stops : stops
}
const stopsBetweenStations = (startLine, startStation, endLine, endStation) => {
let stops = 0
if (startLine === endLine) {
stops = stopsOnOneLine(startLine, startStation, endStation)
} else {
stops = stopsOnOneLine(startLine, startStation, 'Park Street') +
stopsOnOneLine(endLine, endStation, 'Park Street')
}
const subwayLines = {
Red: ['South Station','Park Street','Kendall','Central','Harvard','Porter','Davis','Alewife'],
Green: ['Government Center','Park Street','Boylston','Arlington','Copley','Hynes','Kenmore'],
Orange: ['North Station','Haymarket','Park Street','State','Downtown Crossing','Chinatown','Back Bay','Forest Hills']
}
function stationIndex(line, station) {
for (var i = 0; i < subwayLines[line].length; i++) {
if (subwayLines[line][i] == station)
return i;
}
}
const stopsBetweenStations = (startLine, startStation, endLine, endStation) => {
if (startLine == endLine) {
return Math.abs(stationIndex(startLine, startStation) - stationIndex(endLine, endStation));
} else {
var start = Math.abs(stationIndex(startLine, startStation) - stationIndex(startLine, 'Park Street'));
var end = Math.abs(stationIndex(endLine, endStation) - stationIndex(endLine, 'Park Street'));
return start + end;
}
}
console.log(stopsBetweenStations('Green', 'Hynes', 'Orange', 'North Station'));
console.log(stopsBetweenStations('Red', 'Alewife', 'Red', 'Central'));
console.log(stopsBetweenStations('Red', 'Central', 'Red', 'Alewife'));
В вашем случае задача становится довольно простой. Раз все станции пересекаются только в одной точке, то что бы посчитать кол-во станций, которые будут между двумя точками, достаточной сложить разницу между первой точкой и станцией пересечения и второй точкой и станцией пересечения. Строить графы и искать пути нужно в случае, если бы схема была бы сложнее)
const subwayLines = {
Red: [
'South Station',
'Park Street',
'Kendall',
'Central',
'Harvard',
'Porter',
'Davis',
'Alewife'
],
Green: [
'Government Center',
'Park Street',
'Boylston',
'Arlington',
'Copley',
'Hynes',
'Kenmore'
],
Orange: [
'North Station',
'Haymarket',
'Park Street',
'State',
'Downtown Crossing',
'Chinatown',
'Back Bay',
'Forest Hills'
]
}
const CROSSROAD = 'Park Street';
const getStationIndex = (line, station) =>
line.findIndex(s => s === station);
const hasLineStation = (line, station) =>
getStationIndex(line, station) !== -1;
const getStationsCountInPath =
(startLine, startStation, endLine, endStation) => {
if (!hasLineStation(startLine, startStation) ||
!hasLineStation(endLine, endStation)) {
throw new Error('Wrong subway sheme');
}
return (
Math.abs(getStationIndex(startLine, startStation) - getStationIndex(startLine, CROSSROAD)) +
Math.abs(getStationIndex(endLine, endStation) - getStationIndex(endLine, CROSSROAD)) + 1
);
};
console.log('from Arlington to Downtown Crossing', getStationsCountInPath(
subwayLines.Green,
'Arlington',
subwayLines.Orange,
'Downtown Crossing'
));
console.log('from North Station to Downtown Crossing', getStationsCountInPath(
subwayLines.Orange,
'North Station',
subwayLines.Orange,
'Downtown Crossing'
));
console.log('from Alewife to Forest Hills', getStationsCountInPath(
subwayLines.Red,
'Alewife',
subwayLines.Orange,
'Forest Hills'
));
P.S.
Мой вариант включает первую и последнюю станцию. Так что если это не нужно, просто вычитайте 2)
Айфон мало держит заряд, разбираемся с проблемой вместе с AppLab
Вечер добрый! Есть std::map myMap, который я заполнил из filetxt файла(заполнился и отображается корректно) 1 qwerty 2 sef 3 hhhh
Не могу создать переменную структуруЕсли мы объявляем структуру в том же файле где и main функция, то все инициализируется нормально