fe-map: note under the score when flight times are off; contribute links on the three sites

Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com>
This commit is contained in:
Toby
2026-10-30 18:58:45 -04:00
parent ad8b889437
commit 6ffeabb6d7
3 changed files with 6 additions and 0 deletions
+2
View File
@@ -197,6 +197,7 @@ footer{padding-block:18px 30px;color:var(--faint);font-size:13px}
</table> </table>
<div class="hist"><span>Map distance ÷ timed length, every flight</span><canvas id="hist" aria-label="Histogram of map distance divided by timed length"></canvas></div> <div class="hist"><span>Map distance ÷ timed length, every flight</span><canvas id="hist" aria-label="Histogram of map distance divided by timed length"></canvas></div>
<div><h2 style="margin-bottom:6px">Farthest out</h2><ul class="worst" id="worst"></ul></div> <div><h2 style="margin-bottom:6px">Farthest out</h2><ul class="worst" id="worst"></ul></div>
<p class="note" id="flnote" hidden>Flight times are off, so every remaining measurement is a maximum distance. Any flat map drawn small enough meets them all, so a score of 0 here says nothing about the shape. The triangles do not depend on the layout.</p>
<p class="note" id="globenote">Globe: the same rules applied to great-circle distances on a sphere of radius 6,371 km.</p> <p class="note" id="globenote">Globe: the same rules applied to great-circle distances on a sphere of radius 6,371 km.</p>
</aside> </aside>
</section> </section>
@@ -488,6 +489,7 @@ function globeScore() {
let SC = null, GS = null; let SC = null, GS = null;
function update(full) { function update(full) {
SC = score(sv.X, 2); if (full) GS = globeScore(); SC = score(sv.X, 2); if (full) GS = globeScore();
$("#flnote").hidden = S.fl;
const nAct = { rt: act.l.filter(l => l.kind === "rt").length, rr: act.l.filter(l => l.kind === "rail" || l.kind === "road").length, sat: act.l.filter(l => l.kind === "sat").length }; const nAct = { rt: act.l.filter(l => l.kind === "rt").length, rr: act.l.filter(l => l.kind === "rail" || l.kind === "road").length, sat: act.l.filter(l => l.kind === "sat").length };
const row = (label, a, b, n, cls) => `<tr><th scope="row">${label}</th><td class="${a ? cls : "ok"}">${fmt(a)}<span class="of"> / ${fmt(n)}</span></td><td class="${b ? cls : "ok"}">${fmt(b)}</td></tr>`; const row = (label, a, b, n, cls) => `<tr><th scope="row">${label}</th><td class="${a ? cls : "ok"}">${fmt(a)}<span class="of"> / ${fmt(n)}</span></td><td class="${b ? cls : "ok"}">${fmt(b)}</td></tr>`;
const nf = S.fl ? FL.length : 0; const nf = S.fl ? FL.length : 0;
+2
View File
@@ -197,6 +197,7 @@ footer{padding-block:18px 30px;color:var(--faint);font-size:13px}
</table> </table>
<div class="hist"><span>Map distance ÷ timed length, every flight</span><canvas id="hist" aria-label="Histogram of map distance divided by timed length"></canvas></div> <div class="hist"><span>Map distance ÷ timed length, every flight</span><canvas id="hist" aria-label="Histogram of map distance divided by timed length"></canvas></div>
<div><h2 style="margin-bottom:6px">Farthest out</h2><ul class="worst" id="worst"></ul></div> <div><h2 style="margin-bottom:6px">Farthest out</h2><ul class="worst" id="worst"></ul></div>
<p class="note" id="flnote" hidden>Flight times are off, so every remaining measurement is a maximum distance. Any flat map drawn small enough meets them all, so a score of 0 here says nothing about the shape. The triangles do not depend on the layout.</p>
<p class="note" id="globenote">Globe: the same rules applied to great-circle distances on a sphere of radius 6,371 km.</p> <p class="note" id="globenote">Globe: the same rules applied to great-circle distances on a sphere of radius 6,371 km.</p>
</aside> </aside>
</section> </section>
@@ -488,6 +489,7 @@ function globeScore() {
let SC = null, GS = null; let SC = null, GS = null;
function update(full) { function update(full) {
SC = score(sv.X, 2); if (full) GS = globeScore(); SC = score(sv.X, 2); if (full) GS = globeScore();
$("#flnote").hidden = S.fl;
const nAct = { rt: act.l.filter(l => l.kind === "rt").length, rr: act.l.filter(l => l.kind === "rail" || l.kind === "road").length, sat: act.l.filter(l => l.kind === "sat").length }; const nAct = { rt: act.l.filter(l => l.kind === "rt").length, rr: act.l.filter(l => l.kind === "rail" || l.kind === "road").length, sat: act.l.filter(l => l.kind === "sat").length };
const row = (label, a, b, n, cls) => `<tr><th scope="row">${label}</th><td class="${a ? cls : "ok"}">${fmt(a)}<span class="of"> / ${fmt(n)}</span></td><td class="${b ? cls : "ok"}">${fmt(b)}</td></tr>`; const row = (label, a, b, n, cls) => `<tr><th scope="row">${label}</th><td class="${a ? cls : "ok"}">${fmt(a)}<span class="of"> / ${fmt(n)}</span></td><td class="${b ? cls : "ok"}">${fmt(b)}</td></tr>`;
const nf = S.fl ? FL.length : 0; const nf = S.fl ? FL.length : 0;
+2
View File
@@ -70,7 +70,9 @@ await p.waitForFunction(() => /^Done/.test(document.getElementById('status').tex
const kf = await broken(); const kf = await broken();
console.log('Limits only: broken', kf); console.log('Limits only: broken', kf);
if (kf > 5) fail('limits alone should be (nearly) satisfiable on a plane', kf); if (kf > 5) fail('limits alone should be (nearly) satisfiable on a plane', kf);
if (await p.evaluate(() => document.getElementById('flnote').hidden)) fail('flight-times-off note not shown');
await p.click('#d-fl'); await p.click('#d-fl');
if (!(await p.evaluate(() => document.getElementById('flnote').hidden))) fail('flight-times-off note still shown');
await p.click('#starts button[data-start="best"]'); await p.click('#starts button[data-start="best"]');
await p.waitForTimeout(300); await p.waitForTimeout(300);
// 3D release // 3D release