Как посчитать сколько остановок нужно проехать?

218
23 июля 2021, 16:40

Очень нужна помощь в 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') 
   }

Answer 1

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'));

Answer 2

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

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)

READ ALSO
функция connect не видит ошибки UDP

функция connect не видит ошибки UDP

Как работает connect в UDP, он реагирует как то или нет?

220
C++ поиск совпадения ключ-значения в map

C++ поиск совпадения ключ-значения в map

Вечер добрый! Есть std::map myMap, который я заполнил из filetxt файла(заполнился и отображается корректно) 1 qwerty 2 sef 3 hhhh

141
Не могу создать структуру

Не могу создать структуру

Не могу создать переменную структуруЕсли мы объявляем структуру в том же файле где и main функция, то все инициализируется нормально

452