森宮野原から屋代高校前駅の計算ロジック異常を改善して、路線図を完了させたいです。
解決したいこと
路線図の森宮野原→屋代高校前間の運賃が1570円となってしまいます。
本当は来春のjr東日本のダイヤ改正時の運賃改定時の運賃1720円としたいです。
ちなみに、篠ノ井までは、1060円と正しい値です。
一方で、路線図の妙高高原→屋代高校前の運賃は正しく1120円となりました。
恐らく長野以降はemainでずっと軽井沢まで行っているものだと思います。
例)
各社鉄道会社でよくあるような路線図をhtmlで作っております。
発生している問題・エラー
例)
NameError (uninitialized constant World)
または、問題・エラーが起きている画像をここにドラッグアンドドロップ

上記のようになります。
うまく説明すると、篠ノ井から先は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