@sembokulove (Missing place)

Are you sure you want to delete the question?

If your question is resolved, you may close it.

Leaving a resolved question undeleted may help others!

We hope you find it useful!

森宮野原から屋代高校前駅の計算ロジック異常を改善して、路線図を完了させたいです。

解決したいこと

路線図の森宮野原→屋代高校前間の運賃が1570円となってしまいます。
本当は来春のjr東日本のダイヤ改正時の運賃改定時の運賃1720円としたいです。
ちなみに、篠ノ井までは、1060円と正しい値です。
一方で、路線図の妙高高原→屋代高校前の運賃は正しく1120円となりました。
恐らく長野以降はemainでずっと軽井沢まで行っているものだと思います。
例)
各社鉄道会社でよくあるような路線図をhtmlで作っております。

発生している問題・エラー


例)

NameError (uninitialized constant World)

または、問題・エラーが起きている画像をここにドラッグアンドドロップ
飯山線 2025-12-27 092103.png
上記のようになります。
うまく説明すると、篠ノ井から先はEmainが参照されてしまいます。
html画面

該当するソースコード

<html lang="ja">
<head>
    <meta charset="UTF-8">
    <title>運賃計算システム 最終実装版</title>
</head>
<body>
    <h1>運賃計算システム</h1>
    <p>ブラウザのコンソール(F12キー)で計算結果を確認してください。</p>

    <script src="命令11/east-main.js"></script>
    <script src="命令11/east-local.js"></script>
    <script src="命令11/west-main.js"></script>
    <script src="命令11/west-local.js"></script>

    <script src="命令11/shinatetsu.js"></script>
    <script src="命令11/nagaden.js"></script>
    <script src="命令11/alpico.js"></script>
    <script src="命令11/bessho.js"></script>

    <script src="命令11/jr-calculator51.js"></script>
    <script src="命令11/private-calculator.js"></script>

    <script src="命令11/main.js"></script>
</body>
</html>
<style>
    :root {
        --step-x: 35px; 
        --step-y: 35px;
        --stat-size: 30px; 
    }
body, html { margin: 0; padding: 0; width: 100%; height: 100%; background: #f4f4f4; font-family: "Meiryo", sans-serif; overflow: auto; } /* overflowをautoに変更 */
.app-container { display: flex; flex-direction: column; main-width: 100vw; min-height: 100vh; } /* heightをmin-heightに変更 */
    
    .header { 
        position: fixed; top: 0; width: 100%; background: #fff; 
        padding: 10px; border-bottom: 1px solid #ccc; z-index: 100; 
        text-align: center; box-shadow: 0 2px 8px rgba(0,0,0,0.1); 
    }
    
    /* 修正:右側の端切れを防ぐため min-width を設定し、インラインブロック要素のように振る舞わせる */
/* 修正前 */


/* 修正後 */
.map-area { 
    position: relative; 
    flex: 1;
    overflow: visible; /* autoからvisibleに変更して親のスクロールに任せる */
    background-image: radial-gradient(#ddd 1px, transparent 1px); 
    background-size: var(--step-x) var(--step-y);
    padding: 100px 300px 200px 100px;
    min-height: 2500px; /* y座標 60 * 35px + 余白を考慮して十分な高さを確保 */
}
    .station { 
        position: absolute; width: var(--stat-size); height: var(--stat-size); 
        background: #fff; border: 1.5px solid #333; border-radius: 4px; 
        display: flex; justify-content: center; align-items: center; 
        cursor: pointer; transition: all 0.2s; z-index: 10; 
    }
    .station.start { background: #007bff; border-color: #0056b3; color: white; }
    
    .fare-container { display: flex; flex-direction: column; align-items: center; pointer-events: none; }
    .fare-adult { font-size: 9px; font-weight: bold; color: #d32f2f; line-height: 1; }
    .fare-child { font-size: 7px; color: #1976d2; line-height: 1; }
    .station.start .fare-adult, .station.start .fare-child { color: white; }

    .label { position: absolute; white-space: nowrap; font-size: 11px; font-weight: bold; color: #333; pointer-events: none; }
    .label-t { bottom: 35px; left: 50%; transform: translateX(-50%); writing-mode: vertical-rl; }
    .label-b { top: 35px; left: 50%; transform: translateX(-50%); writing-mode: vertical-rl; }
    .label-l { right: 35px; top: 50%; transform: translateY(-50%); text-align: right; }
    .label-r { left: 35px; top: 50%; transform: translateY(-50%); text-align: left; }

    #panel { display: none; position: fixed; background: rgba(255,255,255,0.9); border: 1px solid #333; padding: 8px; font-size: 12px; z-index: 1000; pointer-events: none; border-radius: 4px; }
</style>
</head>
<body>
    <div class="app-container">
        <div class="header"><div id="statName">出発駅を選択してください</div></div>
        <div class="map-area" id="map-area"></div>
    </div>
    <div id="panel"></div>

    <script>
// --- 1. ユニークな駅リスト ---
// --- 1. ユニークな駅リスト (y座標を14マイナス) ---
// --- 1. ユニークな駅リスト (y座標を2プラス修正) ---
const vertex = [
 ["小淵沢", 32, 45, "b"], 
 ["信濃境", 31, 44, "b"], 
 ["富士見", 30, 43, "b"], 
 ["すずらんの里", 29, 42, "b"], 
 ["青柳", 28, 41, "b"],
 ["茅野", 27, 40, "b"],
 ["上諏訪", 26, 39, "b"],
 ["下諏訪", 25, 38, "b"],
 ["岡谷", 24, 37, "b"],
 ["みどり湖", 23, 36, "r"],
 ["塩尻", 22, 35, "r"],
 ["川岸", 23, 38, "b"],
 ["辰野", 22, 38, "b"],
 ["信濃川島", 21, 37, "r"],
 ["小野", 21, 36, "r"],
 ["広丘", 22, 34, "r"],
 ["村井", 22, 33, "r"],
 ["平田", 22, 32, "r"],
 ["南松本", 22, 31, "r"],
 ["松本", 22, 30, "r"],

 ["田沢", 24, 26, "b"],
 ["明科", 25, 25, "b"],
 ["西条", 26, 24, "b"],
 ["坂北", 27, 23, "b"],
 ["聖高原", 28, 22, "b"],
 ["冠着", 29, 21, "b"],
 ["姨捨", 30, 20, "b"],
 ["稲荷山", 31, 19, "b"],
 ["篠ノ井", 32, 18, "t"],

 ["今井", 33, 17, "b"],
 ["川中島", 34, 16, "b"],
 ["安茂里", 35, 15, "b"],
 ["長野", 36, 14, "b"],

 ["甲斐小泉", 33, 45, "b"],
 ["甲斐大泉", 34, 45, "b"],
 ["清里", 35, 45, "b"],
 ["野辺山", 36, 45, "b"],
 ["信濃川上", 37, 45, "b"],
 ["佐久広瀬", 38, 45, "b"],
 ["佐久海ノ口", 39, 45, "b"],
 ["海尻", 40, 45, "b"],
 ["松原湖", 41, 45, "b"],
 ["小海", 42, 45, "b"],
 ["馬流", 43, 44, "r"],
 ["高岩", 43, 43, "r"],
 ["八千穂", 43, 42, "r"],
 ["海瀬", 43, 41, "r"],
 ["羽黒下", 43, 40, "r"],
 ["青沼", 43, 39, "r"],
 ["臼田", 43, 38, "r"],
 ["龍岡城", 43, 37, "r"],
 ["太田部", 43, 36, "r"],
 ["中込", 43, 35, "r"],
 ["滑津", 43, 34, "r"],
 ["北中込", 43, 33, "r"],
 ["岩村田", 43, 32, "r"],
 ["佐久平", 43, 31, "r"],
 ["中佐都", 43, 30, "r"],
 ["美里", 43, 29, "r"],
 ["三岡", 43, 28, "r"],
 ["乙女", 42, 27, "b"],
 ["東小諸", 41, 27, "b"],
 ["小諸", 40, 26, "b"],

 ["北松本", 21, 28, "r"],
 ["島内", 19, 27, "b"],
 ["島高松", 18, 27, "b"],
 ["梓橋", 17, 27, "b"],
 ["一日市場", 16, 27, "b"],
 ["中萱", 15, 27, "b"],
 ["南豊科", 14, 27, "b"],
 ["豊科", 13, 27, "b"],
 ["柏矢町", 12, 27, "b"],
 ["穂高", 11, 27, "b"],
 ["有明", 10, 27, "b"],
 ["安曇追分", 9, 27, "b"],
 ["細野", 8, 27, "b"],
 ["北細野", 7, 27, "b"],
 ["信濃松川", 6, 27, "b"],
 ["安曇沓掛", 5, 27, "b"],
 ["信濃常盤", 4, 27, "b"],
 ["南大町", 3, 27, "b"],
 ["信濃大町", 2, 27, "b"],
 ["北大町", 1, 26, "r"],
 ["信濃木崎", 1, 25, "r"],
 ["稲尾", 1, 24, "r"],
 ["海ノ口", 1, 23, "r"],
 ["簗場", 1, 22, "r"],
 ["南神城", 1, 21, "r"],
 ["神城", 1, 20, "r"],
 ["飯森", 1, 19, "r"],
 ["白馬", 1, 18, "r"],
 ["信濃森上", 1, 17, "r"],
 ["白馬大池", 1, 16, "r"],
 ["千国", 1, 15, "r"],
 ["南小谷", 1, 14, "r"],

 ["信濃浅野", 46, 5, "b"],
 ["立ケ花", 47, 5, "b"],
 ["上今井", 48, 5, "b"],
 ["替佐", 49, 5, "b"],
 ["蓮", 50, 5, "b"],
 ["飯山", 51, 5, "b"],
 ["北飯山", 52, 5, "b"],
 ["信濃平", 53, 5, "b"],
 ["戸狩野沢温泉", 54, 5, "b"],
 ["上境", 55, 5, "b"],
 ["上桑名川", 56, 5, "b"],
 ["桑名川", 57, 5, "b"],
 ["西大滝", 58, 5, "b"],
 ["信濃白鳥",59, 5, "b"],
 ["平滝", 60, 5, "b"],
 ["横倉", 61, 5, "b"],
 ["森宮野原", 62, 5, "b"],

 ["洗馬", 20, 35, "b"],
 ["日出塩", 19, 35, "b"],
 ["木曽平沢", 18, 35, "b"],
 ["贄川", 17, 35, "b"],
 ["奈良井", 16, 35, "b"],
 ["藪原", 15, 35, "b"],
 ["宮ノ越", 14, 35, "b"],
 ["原野", 13, 35, "b"],
 ["木曽福島", 12, 35, "b"],
 ["上松", 11, 35, "b"],
 ["倉本", 10, 35, "b"],
 ["須原", 9, 35, "b"],
 ["大桑", 8, 35, "b"],
 ["野尻", 7, 35, "b"],
 ["十二兼", 6, 35, "b"],
 ["南木曾", 5, 35, "b"],
 ["田立", 4, 35, "b"],
 ["坂下", 3, 35, "b"],
 ["落合川", 2, 35, "b"],
 ["中津川", 1, 35, "b"],

 ["宮木", 20, 38, "b"],
 ["伊那新町", 19, 38, "b"],
 ["羽場", 18, 38, "b"],
 ["沢", 17, 38, "b"],
 ["伊那松島", 16, 38, "b"],
 ["木ノ下", 15, 38, "b"],
 ["北殿", 14, 38, "b"],
 ["田畑", 13, 38, "b"],
 ["伊那北", 12, 38, "b"],
 ["伊那市", 11, 38, "b"],
 ["下島(JR)", 10, 38, "b"],
 ["沢渡", 9, 38, "b"],
 ["赤木", 8, 38, "b"],
 ["宮田", 7, 38, "b"],
 ["大田切", 6, 38, "b"],
 ["駒ヶ根", 4, 40, "r"],
 ["小町屋", 4, 41, "r"],
 ["伊那福岡", 4, 42, "r"],
 ["田切", 4, 43, "r"],
 ["飯島", 4, 44, "r"],
 ["伊那本郷", 4, 45, "r"],
 ["高遠原", 4, 46, "r"],
 ["七久保", 4, 47, "r"],
 ["伊那田島", 4, 48, "r"],
 ["上片桐", 4, 49, "r"],
 ["伊那大島", 6, 51, "b"],
 ["山吹", 7, 51, "b"],
 ["下平", 8, 51, "b"],
 ["市田", 9, 51, "b"],
 ["下市田", 10, 51, "b"],
 ["元善光寺", 11, 51, "b"],
 ["伊那上郷", 12, 51, "b"],
 ["桜町", 13, 51, "b"],
 ["飯田", 14, 51, "b"],
 ["切石", 15, 51, "b"],
 ["鼎", 16, 51, "b"],
 ["下山村", 17, 51, "b"],
 ["伊那八幡", 16, 51, "b"],
 ["毛賀", 17, 51, "b"],
 ["駄科", 18, 51, "b"],
 ["時又", 19, 51, "b"],
 ["川路", 19, 51, "b"],
 ["天竜峡", 21, 53, "r"],
 ["千代", 21, 54, "r"],
 ["金野", 21, 55, "r"],
 ["唐笠", 21, 56, "r"],
 ["門島", 21, 57, "r"],
 ["田本", 21, 58, "r"],
 ["温田", 21, 59, "r"],
 ["為栗", 21, 60, "r"],
 ["平岡", 21, 61, "r"],
 ["鶯巣", 21, 62, "r"],
 ["伊那小沢", 21, 63, "r"],
 ["中井侍", 21, 64, "r"],

 ["中土", 1, 13, "r"],
 ["北小谷", 1, 12, "r"],

 ["軽井沢", 47, 26, "t"],
 ["中軽井沢", 46, 26, "t"],
 ["信濃追分", 45, 26, "t"],
 ["御代田", 44, 26, "t"],
 ["平原", 43, 26, "t"],
 ["滋野", 39, 26, "t"],
 ["田中", 38, 26, "t"],
 ["大屋", 37, 26, "t"],
 ["信濃国分寺", 36, 26, "t"],
 ["上田", 33, 26, "r"],
 ["西上田", 32, 25, "r"],
 ["テクノさかき", 32, 24, "r"],
 ["坂城", 32, 23, "r"],
 ["戸倉", 32, 22, "r"],
 ["千曲", 32, 21, "r"],
 ["屋代", 32, 20, "r"],
 ["屋代高校前", 32, 19, "r"],

 ["北長野", 39, 11, "b"],
 ["三才", 42, 8, "b"],
 ["豊野", 45, 5, "b"],
 ["牟礼", 45, 4, "r"],
 ["古間", 45, 3, "r"],
 ["黒姫", 45, 2, "r"],
 ["妙高高原", 45, 1, "r"],

 ["市役所前", 36, 13, "r"],
 ["権堂", 36, 12, "r"],
 ["善光寺下", 36, 11, "r"],
 ["本郷", 36, 10, "r"],
 ["桐原", 38, 9, "t"],
 ["信濃吉田", 40, 9, "t"],
 ["朝陽", 43, 9, "b"],
 ["附属中学前", 44, 9, "b"],
 ["柳原", 45, 9, "b"],
 ["村山", 46, 9, "b"],
 ["日野", 47, 9, "b"],
 ["須坂", 48, 9, "b"],
 ["北須坂", 49, 9, "b"],
 ["小布施", 50, 9, "b"],
 ["都住", 51, 9, "b"],
 ["桜沢", 52, 9, "b"],
 ["延徳", 53, 9, "b"],
 ["信州中野", 54, 9, "b"],
 ["中野松川", 55, 9, "b"],
 ["信濃竹原", 56, 9, "b"],
 ["夜間瀬", 57, 9, "b"],
 ["上条", 58, 9, "b"],
 ["湯田中", 59, 9, "b"],

 ["西松本", 21, 30, "b"],
 ["渚", 20, 30, "b"],
 ["信濃荒井", 19, 30, "b"],
 ["大庭", 18, 30, "b"],
 ["下新", 17, 30, "b"],
 ["北新・松本大学前", 16, 30, "b"],
 ["新村", 15, 30, "b"],
 ["三溝", 14, 30, "b"],
 ["森口", 13, 30, "b"],
 ["下島(アルピコ)", 12, 30, "b"],
 ["波田", 11, 30, "b"],
 ["渕東", 10, 30, "b"],
 ["新島々", 9, 30, "b"],

 ["城下", 33, 27, "r"],
 ["三好町", 33, 28, "r"],
 ["赤坂上", 33, 29, "r"],
 ["上田原", 33, 30, "r"],
 ["寺下", 33, 31, "r"],
 ["神畑", 33, 32, "r"],
 ["大学", 33, 33, "r"],
 ["下之郷", 33, 34, "r"],
 ["中塩田", 33, 35, "r"],
 ["塩田町", 33, 36, "r"],
 ["中野", 33, 37, "r"],
 ["舞田", 33, 38, "r"],
 ["八木沢", 33, 39, "r"],
 ["別所温泉", 33, 40, "r"]
];
// --- 2. 接続リスト ---
const edges_data = [
 ["小淵沢", "信濃境", 4.5, "Emain"],
 ["信濃境", "富士見", 4.7, "Emain"],
 ["富士見", "すずらんの里", 3.2, "Emain"],
 ["すずらんの里", "青柳", 1.9, "Emain"],
 ["青柳", "茅野", 7.2, "Emain"],
 ["茅野", "上諏訪", 6.7, "Emain"],
 ["上諏訪", "下諏訪", 4.4, "Emain"],
 ["下諏訪", "岡谷", 4.1, "Emain"],
 ["岡谷", "みどり湖", 7.8, "Emain"],
 ["みどり湖", "塩尻", 3.9, "Emain"],
 ["岡谷", "川岸", 3.5, "Emain"],
 ["川岸", "辰野", 6.0, "Emain"],
 ["辰野", "信濃川島", 4.3, "Emain"],
 ["信濃川島", "小野", 4.0, "Emain"],
 ["小野", "塩尻", 9.9, "Emain"],

 ["塩尻", "広丘", 3.8, "Emain"],
 ["広丘", "村井", 3.0, "Emain"],
 ["村井", "平田", 2.0, "Emain"],
 ["平田", "南松本", 2.1, "Emain"],
 ["南松本", "松本", 2.4, "Emain"],
 ["松本", "田沢", 8.3, "Emain"],
 ["田沢", "明科", 6.6, "Emain"],
 ["明科", "西条", 9.0, "Emain"],
 ["西条", "坂北", 3.7, "Emain"],
 ["坂北", "聖高原", 4.1, "Emain"],
 ["聖高原", "冠着", 3.3, "Emain"],
 ["冠着", "姨捨", 5.9, "Emain"],
 ["姨捨", "稲荷山", 8.7, "Emain"],
 ["稲荷山", "篠ノ井", 3.8, "Emain"],

 ["篠ノ井", "今井", 2.1, "Emain"],
 ["今井", "川中島", 2.2, "Emain"],
 ["川中島", "安茂里", 2.1, "Emain"],
 ["安茂里", "長野", 2.9, "Emain"],

 ["小淵沢", "甲斐小泉", 7.1, "Elocal"],
 ["甲斐小泉", "甲斐大泉", 5.1, "Elocal"],
 ["甲斐大泉", "清里", 5.3, "Elocal"],
 ["清里", "野辺山", 5.9, "Elocal"],
 ["野辺山", "信濃川上", 8.1, "Elocal"],
 ["信濃川上", "佐久広瀬", 3.4, "Elocal"],
 ["佐久広瀬", "佐久海ノ口", 4.5, "Elocal"],
 ["佐久海ノ口", "海尻", 2.7, "Elocal"],
 ["海尻", "松原湖", 2.7, "Elocal"],
 ["松原湖", "小海", 3.5, "Elocal"],
 ["小海", "馬流", 1.6, "Elocal"],
 ["馬流", "高岩", 1.8, "Elocal"],
 ["高岩", "八千穂", 2.2, "Elocal"],
 ["八千穂", "海瀬", 2.6, "Elocal"],
 ["海瀬", "羽黒下", 1.3, "Elocal"],
 ["羽黒下", "青沼", 1.7, "Elocal"],
 ["青沼", "臼田", 1.4, "Elocal"],
 ["臼田", "龍岡城", 1.2, "Elocal"],
 ["龍岡城", "太田部", 2.0, "Elocal"],
 ["太田部", "中込", 1.4, "Elocal"],
 ["中込", "滑津", 1.0, "Elocal"],
 ["滑津", "北中込", 1.9, "Elocal"],
 ["北中込", "岩村田", 2.2, "Elocal"],
 ["岩村田", "佐久平", 0.9, "Elocal"],
 ["佐久平", "中佐都", 0.9, "Elocal"],
 ["中佐都", "美里", 1.4, "Elocal"],
 ["美里", "三岡", 1.5, "Elocal"],
 ["三岡", "乙女", 1.1, "Elocal"],
 ["乙女", "東小諸", 1.0, "Elocal"],
 ["東小諸", "小諸", 1.5, "Elocal"],

 ["松本", "北松本", 0.7, "Elocal"],
 ["北松本", "島内", 1.9, "Elocal"],
 ["島内", "島高松", 1.2, "Elocal"],
 ["島高松", "梓橋", 1.4, "Elocal"],
 ["梓橋", "一日市場", 1.6, "Elocal"],
 ["一日市場", "中萱", 1.6, "Elocal"],
 ["中萱", "南豊科", 2.0, "Elocal"],
 ["南豊科", "豊科", 1.0, "Elocal"],
 ["豊科", "柏矢町", 2.8, "Elocal"],
 ["柏矢町", "穂高", 2.0, "Elocal"],
 ["穂高", "有明", 2.2, "Elocal"],
 ["有明", "安曇追分", 1.5, "Elocal"],
 ["安曇追分", "細野", 2.9, "Elocal"],
 ["細野", "北細野", 1.0, "Elocal"],
 ["北細野", "信濃松川", 2.2, "Elocal"],
 ["信濃松川", "安曇沓掛", 2.6, "Elocal"],
 ["安曇沓掛", "信濃常盤", 2.3, "Elocal"],
 ["信濃常盤", "南大町", 3.1, "Elocal"],
 ["南大町", "信濃大町", 1.1, "Elocal"],
 ["信濃大町", "北大町", 2.1, "Elocal"],
 ["北大町", "信濃木崎", 2.2, "Elocal"],
 ["信濃木崎", "稲尾", 2.2, "Elocal"],
 ["稲尾", "海ノ口", 1.3, "Elocal"],
 ["海ノ口", "簗場", 3.4, "Elocal"],
 ["簗場", "南神城", 6.4, "Elocal"],
 ["南神城", "神城", 2.4, "Elocal"],
 ["神城", "飯森", 1.5, "Elocal"],
 ["飯森", "白馬", 3.0, "Elocal"],
 ["白馬", "信濃森上", 1.9, "Elocal"],
 ["信濃森上", "白馬大池", 3.8, "Elocal"],
 ["白馬大池", "千国", 3.3, "Elocal"],
 ["千国", "南小谷", 1.4, "Elocal"],

 ["豊野", "信濃浅野", 2.2, "Elocal"],
 ["信濃浅野", "立ケ花", 1.7, "Elocal"],
 ["立ケ花", "上今井", 3.0, "Elocal"],
 ["上今井", "替佐", 1.9, "Elocal"],
 ["替佐", "蓮", 5.8, "Elocal"],
 ["蓮", "飯山", 4.6, "Elocal"],
 ["飯山", "北飯山", 1.3, "Elocal"],
 ["北飯山", "信濃平", 3.3, "Elocal"],
 ["信濃平", "戸狩野沢温泉", 3.7, "Elocal"],
 ["戸狩野沢温泉", "上境", 3.6, "Elocal"],
 ["上境", "上桑名川", 4.3, "Elocal"],
 ["上桑名川", "桑名川", 2.2, "Elocal"],
 ["桑名川", "西大滝", 2.1, "Elocal"],
 ["西大滝", "信濃白鳥", 2.1, "Elocal"],
 ["信濃白鳥", "平滝", 2.9, "Elocal"],
 ["平滝", "横倉", 1.9, "Elocal"],
 ["横倉", "森宮野原", 3.1, "Elocal"],

 ["塩尻", "洗馬", 4.2, "Wmain"],
 ["洗馬", "日出塩", 4.2, "Wmain"],
 ["日出塩", "木曽平沢", 5.7, "Wmain"],
 ["木曽平沢", "贄川", 5.2, "Wmain"],
 ["贄川", "奈良井", 1.8, "Wmain"],
 ["奈良井", "藪原", 6.6, "Wmain"],
 ["藪原", "宮ノ越", 5.7, "Wmain"],
 ["宮ノ越", "原野", 2.8, "Wmain"],
 ["原野", "木曽福島", 5.5, "Wmain"],
 ["木曽福島", "上松", 7.3, "Wmain"],
 ["上松", "倉本", 6.6, "Wmain"],
 ["倉本", "須原", 4.8, "Wmain"],
 ["須原", "大桑", 3.3, "Wmain"],
 ["大桑", "野尻", 3.0, "Wmain"],
 ["野尻", "十二兼", 3.7, "Wmain"],
 ["十二兼", "南木曾", 5.5, "Wmain"],
 ["南木曾", "田立", 6.3, "Wmain"],
 ["田立", "坂下", 2.8, "Wmain"],
 ["坂下", "落合川", 6.1, "Wmain"],
 ["落合川", "中津川", 3.8, "Wmain"],

 ["辰野", "宮木", 1.1, "Wlocal"],
 ["宮木", "伊那新町", 1.2, "Wlocal"],
 ["伊那新町", "羽場", 1.8, "Wlocal"],
 ["羽場", "沢", 1.9, "Wlocal"],
 ["沢", "伊那松島", 2.6, "Wlocal"],
 ["伊那松島", "木ノ下", 1.5, "Wlocal"],
 ["木ノ下", "北殿", 2.4, "Wlocal"],
 ["北殿", "田畑", 2.2, "Wlocal"],
 ["田畑", "伊那北", 2.1, "Wlocal"],
 ["伊那北", "伊那市", 0.9, "Wlocal"],
 ["伊那市", "下島(JR)", 3.5, "Wlocal"],
 ["下島(JR)", "沢渡", 1.1, "Wlocal"],
 ["沢渡", "赤木", 3.0, "Wlocal"],
 ["赤木", "宮田", 1.3, "Wlocal"],
 ["宮田", "大田切", 2.1, "Wlocal"],
 ["大田切", "駒ヶ根", 1.4, "Wlocal"],
 ["駒ヶ根", "小町屋", 1.2, "Wlocal"],
 ["小町屋", "伊那福岡", 1.5, "Wlocal"],
 ["伊那福岡", "田切", 2.8, "Wlocal"],
 ["田切", "飯島", 2.2, "Wlocal"],
 ["飯島", "伊那本郷", 2.8, "Wlocal"],
 ["伊那本郷", "高遠原", 2.8, "Wlocal"],
 ["高遠原", "七久保", 1.6, "Wlocal"],
 ["七久保", "伊那田島", 2.5, "Wlocal"],
 ["伊那田島", "上片桐", 1.3, "Wlocal"],
 ["上片桐", "伊那大島", 3.8, "Wlocal"],
 ["伊那大島", "山吹", 2.6, "Wlocal"],
 ["山吹", "下平", 1.0, "Wlocal"],
 ["下平", "市田", 2.7, "Wlocal"],
 ["市田", "下市田", 1.2, "Wlocal"],
 ["下市田", "元善光寺", 1.8, "Wlocal"],
 ["元善光寺", "伊那上郷", 2.7, "Wlocal"],
 ["伊那上郷", "桜町", 1.0, "Wlocal"],
 ["桜町", "飯田", 0.8, "Wlocal"],
 ["飯田", "切石", 1.6, "Wlocal"],
 ["切石", "鼎", 2.0, "Wlocal"],
 ["鼎", "下山村", 1.0, "Wlocal"],
 ["下山村", "伊那八幡", 1.1, "Wlocal"],
 ["伊那八幡", "毛賀", 1.1, "Wlocal"],
 ["毛賀", "駄科", 1.4, "Wlocal"],
 ["駄科", "時又", 1.8, "Wlocal"],
 ["時又", "川路", 1.8, "Wlocal"],
 ["川路", "天竜峡", 1.3, "Wlocal"],
 ["天竜峡", "千代", 1.4, "Wlocal"],
 ["千代", "金野", 1.2, "Wlocal"],
 ["金野", "唐笠", 2.3, "Wlocal"],
 ["唐笠", "門島", 3.4, "Wlocal"],
 ["門島", "田本", 3.7, "Wlocal"],
 ["田本", "温田", 2.0, "Wlocal"],
 ["温田", "為栗", 3.7, "Wlocal"],
 ["為栗", "平岡", 4.7, "Wlocal"],
 ["平岡", "鶯巣", 2.1, "Wlocal"],
 ["鶯巣", "伊那小沢", 1.6, "Wlocal"],
 ["伊那小沢", "中井侍", 2.3, "Wlocal"],

 ["南小谷", "中土", 4.0, "Wlocal"],
 ["中土", "北小谷", 4.4, "Wlocal"],

 ["軽井沢", "中軽井沢", 4.0, "Shinatetsu"],
 ["中軽井沢", "信濃追分", 3.2, "Shinatetsu"],
 ["信濃追分", "御代田", 6.0, "Shinatetsu"],
 ["御代田", "平原", 5.1, "Shinatetsu"],
 ["平原", "小諸", 3.7, "Shinatetsu"],
 ["小諸", "滋野", 5.9, "Shinatetsu"],
 ["滋野", "田中", 3.4, "Shinatetsu"],
 ["田中", "大屋", 3.4, "Shinatetsu"],
 ["大屋", "信濃国分寺", 2.4, "Shinatetsu"],
 ["信濃国分寺", "上田", 2.9, "Shinatetsu"],
 ["上田", "西上田", 4.4, "Shinatetsu"],
 ["西上田", "テクノさかき", 3.5, "Shinatetsu"],
 ["テクノさかき", "坂城", 2.5, "Shinatetsu"],
 ["坂城", "戸倉", 4.5, "Shinatetsu"],
 ["戸倉", "千曲", 2.2, "Shinatetsu"],
 ["千曲", "屋代", 2.8, "Shinatetsu"],
 ["屋代", "屋代高校前", 1.9, "Shinatetsu"],
 ["屋代高校前", "篠ノ井", 3.3, "Shinatetsu"],

 ["長野", "北長野", 3.9, "Shinatetsu"],
 ["北長野", "三才", 2.9, "Shinatetsu"],
 ["三才", "豊野", 4.0, "Shinatetsu"],
 ["豊野", "牟礼", 7.8, "Shinatetsu"],
 ["牟礼", "古間", 6.5, "Shinatetsu"],
 ["古間", "黒姫", 3.8, "Shinatetsu"],
 ["黒姫", "妙高高原", 8.4, "Shinatetsu"],
 
 ["長野", "市役所前", 0.4, "Nagaden"],
 ["市役所前", "権堂", 0.6, "Nagaden"],
 ["権堂", "善光寺下", 0.6, "Nagaden"],
 ["善光寺下", "本郷", 1.1, "Nagaden"],
 ["本郷", "桐原", 0.9, "Nagaden"],
 ["桐原", "信濃吉田", 0.7, "Nagaden"],
 ["信濃吉田", "朝陽", 2.0, "Nagaden"],
 ["朝陽", "附属中学前", 1.7, "Nagaden"],
 ["附属中学前", "柳原", 1.0, "Nagaden"],
 ["柳原", "村山", 2.0, "Nagaden"],
 ["村山", "日野", 1.0, "Nagaden"],
 ["日野", "須坂", 1.5, "Nagaden"],
 ["須坂", "北須坂", 2.5, "Nagaden"],
 ["北須坂", "小布施", 2.5, "Nagaden"],
 ["小布施", "都住", 1.1, "Nagaden"],
 ["都住", "桜沢", 2.7, "Nagaden"],
 ["桜沢", "延徳", 2.0, "Nagaden"],
 ["延徳", "信州中野", 2.2, "Nagaden"],
 ["信州中野", "中野松川", 1.5, "Nagaden"],
 ["中野松川", "信濃竹原", 2.3, "Nagaden"],
 ["信濃竹原", "夜間瀬", 1.0, "Nagaden"],
 ["夜間瀬", "上条", 1.5, "Nagaden"],
 ["上条", "湯田中", 1.3, "Nagaden"],

 ["松本", "西松本", 0.4, "Alpico"],
 ["西松本", "渚", 0.7, "Alpico"],
 ["渚", "信濃荒井", 0.8, "Alpico"],
 ["信濃荒井", "大庭", 0.7, "Alpico"],
 ["大庭", "下新", 1.8, "Alpico"],
 ["下新", "北新・松本大学前", 1.0, "Alpico"],
 ["北新・松本大学前", "新村", 0.8, "Alpico"],
 ["新村", "三溝", 1.4, "Alpico"],
 ["三溝", "森口", 1.0, "Alpico"],
 ["森口", "下島(アルピコ)", 0.9, "Alpico"],
 ["下島(アルピコ)", "波田", 1.6, "Alpico"],
 ["波田", "渕東", 1.6, "Alpico"],
 ["渕東", "新島々", 1.7, "Alpico"],
 
 ["上田", "城下", 0.8, "Bessho"],
 ["城下", "三好町", 0.7, "Bessho"],
 ["三好町", "赤坂上", 0.7, "Bessho"],
 ["赤坂上", "上田原", 0.7, "Bessho"],
 ["上田原", "寺下", 0.9, "Bessho"],
 ["寺下", "神畑", 0.7, "Bessho"],
 ["神畑", "大学", 0.7, "Bessho"],
 ["大学", "下之郷", 0.9, "Bessho"],
 ["下之郷", "中塩田", 1.3, "Bessho"],
 ["中塩田", "塩田町", 0.6, "Bessho"],
 ["塩田町", "中野", 0.5, "Bessho"], 
 ["中野", "舞田", 0.9, "Bessho"],
 ["舞田", "八木沢", 0.7, "Bessho"], 
 ["八木沢", "別所温泉", 1.5, "Bessho"]
];


// --- 3. 運賃テーブル ---
// --- 3. 運賃テーブル ---
// --- 3. メイン制御ロジック ---
let startStation = "松本";

    const adj = {};
    function buildGraph() {
        vertex.forEach(v => adj[v[0]] = []);
        edges_data.forEach(e => {
            if(adj[e[0]] && adj[e[1]]) {
                adj[e[0]].push({to: e[1], dist: e[2], type: e[3]});
                adj[e[1]].push({to: e[0], dist: e[2], type: e[3]});
            }
        });
    }

    function calculate(targetName) {
        if (targetName === startStation) return { r: 0, k: 0, a: 0, c: 0 };
        let distK = {}, distR = {}, compDists = {};
        vertex.forEach(v => {
            distK[v[0]] = Infinity;
            compDists[v[0]] = { em: 0, el: 0, wm: 0, wl: 0, shina: 0, nagaden: 0, alpico: 0, bessho: 0 };
        });
        distK[startStation] = 0;
        let pq = [[0, 0, startStation, compDists[startStation]]];
        const typeMap = { "Emain":"em", "Elocal":"el", "Wmain":"wm", "Wlocal":"wl", "Shinatetsu":"shina", "Nagaden":"nagaden", "Alpico":"alpico", "Bessho":"bessho" };

        while (pq.length > 0) {
            pq.sort((a, b) => a[0] - b[0]);
            let [ck, cr, u, cd] = pq.shift();
            if (ck > distK[u]) continue;
            adj[u].forEach(edge => {
                let stepK = (edge.type.includes("local")) ? edge.dist * 1.1 : edge.dist;
                let nextK = ck + stepK;
                let ncd = { ...cd };
                ncd[typeMap[edge.type]] += edge.dist;
                if (nextK < distK[edge.to]) {
                    distK[edge.to] = nextK;
                    distR[edge.to] = cr + edge.dist;
                    compDists[edge.to] = ncd;
                    pq.push([nextK, distR[edge.to], edge.to, ncd]);
                }
            });
        }
        const fd = compDists[targetName];
const jrFare = FareApp.JRCalculator.calculate(fd);
const pvtFare = FareApp.PrivateCalculator.calculate(fd);
        const totalAdult = jrFare + pvtFare;
        return { r: distR[targetName].toFixed(1), k: distK[targetName].toFixed(1), a: totalAdult, c: Math.floor(totalAdult / 2 / 10) * 10 };
    }

    function init() {
        buildGraph();
        const area = document.getElementById('map-area');
        const panel = document.getElementById('panel');
        
        vertex.forEach((v, i) => {
            const div = document.createElement('div');
            div.id = 'st-' + i;
            div.className = 'station';
            
            // 修正:座標計算の起点を100pxずらし、右側と下側に余裕を持たせる
            div.style.left = (100 + v[1] * 35) + 'px'; 
            div.style.top = (100 + v[2] * 35) + 'px';
            
            div.onclick = () => { startStation = v[0]; update(); };
            div.onmouseover = (e) => {
                if (v[0] === startStation) return;
                let res = calculate(v[0]);
                panel.style.display = 'block';
                panel.innerHTML = `<b>${v[0]}</b><br>実キロ: ${res.r}km<hr>大人: ${res.a}円<br>小児: ${res.c}円`;
                panel.style.left = (e.pageX + 15) + 'px';
                panel.style.top = (e.pageY + 15) + 'px';
            };
            div.onmouseout = () => { panel.style.display = 'none'; };
            div.innerHTML = `<div class="fare-container"><div class="fare-adult"></div><div class="fare-child"></div></div><div class="label label-${v[3]}">${v[0]}</div>`;
            area.appendChild(div);
        });
        update();
    }

    function update() {
        document.getElementById('statName').innerText = "出発駅: " + startStation;
        vertex.forEach((v, i) => {
            const div = document.getElementById('st-' + i);
            const adultEl = div.querySelector('.fare-adult');
            const childEl = div.querySelector('.fare-child');
            if (v[0] === startStation) {
                div.classList.add('start');
                adultEl.innerText = '-'; childEl.innerText = '-';
            } else {
                div.classList.remove('start');
                let res = calculate(v[0]);
                adultEl.innerText = res.a;
                childEl.innerText = res.c;
            }
        });
    }
    window.onload = init;
    </script>
</body>
</html>

jr東日本運賃

var FareApp = FareApp || {};
FareApp.EastMainTable = [
            {limit: 3, price: 160}, {limit: 6, price: 200}, {limit: 10, price: 210},
            {limit: 15, price: 260}, {limit: 20, price: 350}, {limit: 25, price: 440},
            {limit: 30, price: 530}, {limit: 35, price: 620}, {limit: 40, price: 720},
            {limit: 45, price: 810}, {limit: 50, price: 910}, {limit: 60, price: 1040},
            {limit: 70, price: 1230}, {limit: 80, price: 1410}, {limit: 90, price: 1600},
            {limit: 100, price: 1790}, {limit: 120, price: 2090}, {limit: 140, price: 2420},
            {limit: 160, price: 2750}, {limit: 180, price: 3190}, {limit: 200, price: 3520},
            {limit: 220, price: 3850}, {limit: 240, price: 4180}, {limit: 260, price: 4620},
            {limit: 280, price: 5060}, {limit: 300, price: 5390},
            {limit: Infinity, price: 360}
];

しなの鉄道運賃

var FareApp = FareApp || {};
FareApp.ShinatetsuTable = [
            {limit: 3, price: 190},
            {limit: 6, price: 230},
            {limit: 9, price: 240},
            {limit: 11, price: 260},
            {limit: 12, price: 280},
            {limit: 13, price: 300},
            {limit: 14, price: 320},
            {limit: 15, price: 340},
            {limit: 16, price: 360},
            {limit: 17, price: 390},
            {limit: 18, price: 410},
            {limit: 19, price: 430},
            {limit: 20, price: 450},
            {limit: 21, price: 480},
            {limit: 22, price: 500},
            {limit: 23, price: 520},
            {limit: 24, price: 540},
            {limit: 25, price: 560},
            {limit: 26, price: 580},
            {limit: 27, price: 610},
            {limit: 28, price: 630},
            {limit: 29, price: 650},
            {limit: 30, price: 670},
            {limit: 31, price: 690},
            {limit: 32, price: 720},
            {limit: 33, price: 740},
            {limit: 34, price: 760},
            {limit: 35, price: 780},
            {limit: 36, price: 800},
            {limit: 37, price: 830},
            {limit: 38, price: 850},
            {limit: 39, price: 870},
            {limit: 40, price: 890},
            {limit: 41, price: 910},
            {limit: 42, price: 940},
            {limit: 43, price: 960},
            {limit: 44, price: 980},
            {limit: 45, price: 1000},
            {limit: 46, price: 1020},
            {limit: 47, price: 1050},
            {limit: 48, price: 1070},
            {limit: 49, price: 1090},
            {limit: 50, price: 1110},
            {limit: 51, price: 1130},
            {limit: 52, price: 1160},
            {limit: 53, price: 1180},
            {limit: 54, price: 1200},
            {limit: 55, price: 1220},
            {limit: 56, price: 1240},
            {limit: 57, price: 1270},
            {limit: 58, price: 1290},
            {limit: 59, price: 1310},
            {limit: 60, price: 1330},
            {limit: 61, price: 1350},
            {limit: 62, price: 1380},
            {limit: 63, price: 1400},
            {limit: 64, price: 1420},
            {limit: 65, price: 1440},
            {limit: 66, price: 1470},
            {limit: 67, price: 1490},
            {limit: 68, price: 1510},
            {limit: 69, price: 1530},
            {limit: 70, price: 1550},
            {limit: 71, price: 1570},
            {limit: 72, price: 1600},
            {limit: 73, price: 1620},
            {limit: 74, price: 1640},
            {limit: 75, price: 1670},
            {limit: 76, price: 1690},
            {limit: 77, price: 1710},
            {limit: 78, price: 1730},
            {limit: 79, price: 1750},
            {limit: 80, price: 1770},
            {limit: 81, price: 1790},
            {limit: 82, price: 1820},
            {limit: 83, price: 1840},
            {limit: 84, price: 1860},
            {limit: 85, price: 1880},
            {limit: 86, price: 1900},
            {limit: 87, price: 1930},
            {limit: 88, price: 1950},
            {limit: 89, price: 1970},
            {limit: 90, price: 1990},
            {limit: 91, price: 2010},
            {limit: 92, price: 2040},
            {limit: 93, price: 2060},
            {limit: 94, price: 2080},
            {limit: 95, price: 2100},
            {limit: 96, price: 2120},
            {limit: 97, price: 2150},
            {limit: 98, price: 2170},
            {limit: 99, price: 2190},
            {limit: 100, price: 2210},
            {limit: 101, price: 2230},
            {limit: 102, price: 2260},
            {limit: 103, price: 2280},
];

jr運賃計算ロジック(ただし今回は加算額は関係しないので、一部省略)

var FareApp = FareApp || {};
FareApp.JRCalculator = {
    // 東日本独自の加算額ルール(MainとLocalで個別に判定)
    getEastSurcharge: function(fd) {
        // 合算に使用する東日本の「短い方の距離」を特定(ここでは東日本区間の合計)
        var dist = fd.em + fd.el;
        if (dist <= 0) return 0;

        // East Localが1メートルでもある場合はLocalの閾値を適用、それ以外はMain
        if (fd.el > 0) {
            if (dist <= 10) return 10;
            if (dist <= 28) return 20;
            if (dist <= 32) return 30;
            if (dist <= 10000) return 440;
            return 0; // 閾値を超えた場合は加算なし(既存ルールに準拠)
        } else {
            if (dist <= 10) return 10;
            if (dist <= 30) return 20;
            if (dist <= 35) return 30;
            return 0;
        }
    },

    // 汎用検索メソッド
    findPrice: function(table, dist) {
        if (!table || dist <= 0) return 0;
        var entry = table.find(function(e) { return dist <= e.limit; });
        return entry ? entry.price : table[table.length - 1].price;
    },

    calculate: function(fd) {
        // 1. JR東日本分の計算
        var eDistK = Math.ceil(fd.em + (fd.el * 1.1));
        var eFare = 0;
        if (eDistK > 0) {
            var eTable = (fd.el > fd.em && eDistK <= 10) ? FareApp.EastLocalTable : FareApp.EastMainTable;
            eFare = this.findPrice(eTable, eDistK);
        }

        // 2. JR東海(西日本)分の計算
        var wDistK = Math.ceil(fd.wm + (fd.wl * 1.1));
        var wFare = 0;
        if (wDistK > 0) {
            var wTable = (fd.wl > fd.wm && wDistK <= 10) ? FareApp.WestLocalTable : FareApp.WestMainTable;
            wFare = this.findPrice(wTable, wDistK);
        }

        // 3. 運賃の合算
        var totalFare = eFare + wFare;

        // 4. 境界を跨ぐ場合の加算額(東日本ルール)を適用
        if (eFare > 0 && wFare > 0) {
            totalFare += this.getEastSurcharge(fd);
        }

        return totalFare;
    }
};

私鉄運賃計算ロジック(ただし今回は加算額は関係しないので、一部省略)

var FareApp = FareApp || {};
FareApp.PrivateCalculator = {
    calculate: function(fd) {
        var sum = 0;
        var find = FareApp.JRCalculator.findPrice; // ロジックの再利用

        if (fd.shina > 0) sum += find(FareApp.ShinatetsuTable, Math.ceil(fd.shina));
        if (fd.nagaden > 0) sum += find(FareApp.NagadenTable, Math.ceil(fd.nagaden));
        if (fd.alpico > 0) sum += find(FareApp.AlpicoTable, Math.ceil(fd.alpico));
        if (fd.bessho > 0) sum += find(FareApp.BesshoTable, Math.ceil(fd.bessho));
        
        return sum;
    }
};
/**
 * main.js - 運賃計算システム:全11乗換駅・距離設定 完全実装
 */
var FareApp = FareApp || {};

/**
 * 1. 駅間距離データベース
 * vertex/edges_data を除き、直接距離を定義しました。
 */
const RouteDatabase = {
    EastMain: {
        "小淵沢-岡谷": 24.3,
        "岡谷-塩尻": 11.7,
        "岡谷-辰野": 9.5,
        "辰野-塩尻": 18.2,
        "塩尻-松本": 13.3,
        "松本-篠ノ井": 56.7,
        "篠ノ井-長野": 9.3,
    },
    EastLocal: {
        "松本-南小谷": 70.1,
    },
    Shinatetsu: {
        "小諸-上田": 14.3,
        "上田-篠ノ井": 20.8,
        "長野-豊野": 10.8,
    },
    Westlocal: {
        "南小谷-糸魚川": 35.3
    },
    // 北しなの線(豊野〜長野〜篠ノ井)
    ShinaNorth: {
        "豊野-長野": 10.8,
        "長野-篠ノ井": 9.3
    },
    // しなの鉄道線(篠ノ井〜軽井沢)
    ShinaMain: {
        "篠ノ井-上田": 20.8,
        "上田-小諸": 14.3,
        "小諸-軽井沢": 30.0 // 篠ノ井〜軽井沢合計が65.1kmになるよう調整
    }
};

/**
 * 2. 入力データの初期化
 */
var inputData = {
    em: 0, el: 0, wm: 0, wl: 0,
    shina_north: 0, // 北側(豊野〜篠ノ井)
    shina_main: 0,  // 南側(篠ノ井〜軽井沢)
    nagaden: 0, alpico: 0, bessho: 0
};

/**
 * 3. 経路構築
 */
function setupJourney() {
    const DB = RouteDatabase;

    // JR飯山線
    inputData.el += DB.EastLocal["森宮野原-豊野"];

    // しなの鉄道・北しなの線(20.1km)
    inputData.shina_north += DB.ShinaNorth["豊野-長野"];
    inputData.em += DB.EastMain["長野-篠ノ井"];

    // しなの鉄道線(65.1km)
    inputData.shina_main += DB.ShinaMain["篠ノ井-上田"];
    inputData.shina_main += DB.ShinaMain["上田-小諸"];
    inputData.shina_main += DB.ShinaMain["小諸-軽井沢"];
}

/**
 * 4. 計算実行
 */
function execute() {
    // データリセット
    inputData.em = 0; inputData.el = 0;
    inputData.shina_north = 0; inputData.shina_main = 0;
    
    setupJourney();

    const find = FareApp.JRCalculator.findPrice;

    // ① JR運賃の計算 (45.1km -> 1020円)
    let jrFare = FareApp.JRCalculator.calculate(inputData);

    // ② 北しなの線運賃の計算 (20.1km -> 480円)
    let fareN = 0;
    if (inputData.shina_north > 0) {
        fareN = find(FareApp.ShinatetsuTable, Math.ceil(inputData.shina_north));
    }

    // ③ しなの鉄道線運賃の計算 (65.1km -> 1470円)
    let fareM = 0;
    if (inputData.shina_main > 0) {
        fareM = find(FareApp.ShinatetsuTable, Math.ceil(inputData.shina_main));
    }

    // 合計
    let total = jrFare + fareN + fareM;

    console.log("========== 運賃計算内訳 ==========");
    console.log(`JR区間 (森宮野原-豊野) : ${jrFare}円`);
    console.log(`北しなの線 (豊野-篠ノ井) : ${fareN}円`);
    console.log(`しなの鉄道線 (篠ノ井-軽井沢) : ${fareM}円`);
    console.log("----------------------------------");
    console.log(`総合計 : ${total}円`); // 1020 + 480 + 1470 = 2970円
}

// 実行
execute();

例)

def greet
  puts Hello World
end

自分で試したこと

geminiでいろいろ質問しましたが、有力な手掛かりは見つかりませんでした。
尚、こちらが元ネタです。
http://hotmist.ddo.jp/files/tokyo_fare.html#origin

0 likes

No Answers yet.

Your answer might help someone💌