Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <!DOCTYPE html>
- <html>
- <head>
- <meta charset="utf-8">
- <title>Bowling Scores</title>
- <script>
- // Edit these configurations
- const DAY_COUNT = 240, ROUNDS_PER_DAY = 20;
- const FRAME_COUNT = 10, PIN_COUNT = 10;
- const ABOVE_OLD_SCORE = 0, BELOW_OLD_SCORE = 301;
- const MAX_SPLITS = 11, MAX_STRIKES = 12, MAX_STRIKE_STRING_SUM = 11;
- const MAX_STRIKE_STRING_LENGTH = 11, MAX_SPLIT_SPARES = 10;
- const ASC_SCORE_MILESTONES = [
- 0,
- 10,
- 20,
- 30,
- 40,
- 50,
- 60,
- 70,
- 80,
- 90,
- 100,
- 110,
- 120,
- 130,
- 140,
- 150,
- 160,
- 170,
- 180,
- 190,
- 200,
- 210,
- 220,
- 230,
- 240,
- 250,
- 260,
- 270,
- 280,
- 290,
- 300
- ], SPARE_MARK = "./", EMPTY_MARK = " .", FRAME_SEPARATOR = "|";
- const STRIKE_MARK = ".X", ZERO_MARK = ".-", SPLIT_MARK = "S";
- const SCORE_9_MARK = ".9", SCORE_8_MARK = ".8";
- const SCORE_7_MARK = ".7", SCORE_6_MARK = ".6";
- const SCORE_5_MARK = ".5", SCORE_4_MARK = ".4";
- const SCORE_3_MARK = ".3", SCORE_2_MARK = ".2";
- const SCORE_1_MARK = ".1", SPLIT_8_MARK = `${SPLIT_MARK}8`;
- const SPLIT_7_MARK = `${SPLIT_MARK}7`;
- const SPLIT_6_MARK = `${SPLIT_MARK}6`;
- const SPLIT_5_MARK = `${SPLIT_MARK}5`, MARK_SCORES = {
- [STRIKE_MARK]: 10,
- [SCORE_9_MARK]: 9,
- [SCORE_8_MARK]: 8,
- [SPLIT_8_MARK]: 8,
- [SCORE_7_MARK]: 7,
- [SPLIT_7_MARK]: 7,
- [SCORE_6_MARK]: 6,
- [SPLIT_6_MARK]: 6,
- [SCORE_5_MARK]: 5,
- [SPLIT_5_MARK]: 5,
- [SCORE_4_MARK]: 4,
- [SCORE_3_MARK]: 3,
- [SCORE_2_MARK]: 2,
- [SCORE_1_MARK]: 1,
- [ZERO_MARK]: 0
- };
- const HEAD_SCORES = {
- [STRIKE_MARK]: 49,
- [SCORE_9_MARK]: 28,
- [SCORE_8_MARK]: 11,
- [SPLIT_8_MARK]: 4,
- [SCORE_7_MARK]: 13,
- [SPLIT_7_MARK]: 2,
- [SCORE_6_MARK]: 7
- };
- const TAIL_SCORES = {
- [SCORE_9_MARK]: { [SCORE_1_MARK]: 1 },
- [SCORE_8_MARK]: { [SCORE_2_MARK]: 1 },
- [SPLIT_8_MARK]: { [SCORE_2_MARK]: 1, [SCORE_1_MARK]: 1 },
- [SCORE_7_MARK]: {
- [SCORE_3_MARK]: 14,
- [SCORE_2_MARK]: 1,
- [SCORE_1_MARK]: 1
- },
- [SPLIT_7_MARK]: { [SCORE_3_MARK]: 1, [SCORE_2_MARK]: 3 },
- [SCORE_6_MARK]: {
- [SCORE_4_MARK]: 8,
- [SCORE_3_MARK]: 2,
- [SCORE_2_MARK]: 1
- }
- };
- //
- // Don't edit these implementations
- const isStrike = headMark => {
- const headScore = MARK_SCORES[headMark];
- return headScore && headScore == PIN_COUNT;
- };
- const isSpare = (headMark, tailMark) => {
- if (isStrike(headMark)) return false;
- if (tailMark == SPARE_MARK) return true;
- const headScore = MARK_SCORES[headMark];
- if (!headScore) return false;
- const tailScore = MARK_SCORES[tailMark];
- return tailScore && headScore + tailScore == PIN_COUNT;
- }, isLastFrame = count => count == FRAME_COUNT;
- const sum = (s, no) => s + no, ballScoreMark = scores => {
- let rand = Math.floor(Math.random() * Object.values(scores).reduce(sum, 0)) + 1;
- for (const mark of Object.keys(scores)) {
- const ratio = scores[mark];
- if (rand <= ratio) return mark;
- rand -= ratio;
- }
- return ZERO_MARK;
- };
- const tailMark = headMark => {
- if (isStrike(headMark)) return EMPTY_MARK;
- const tailScore = TAIL_SCORES[headMark];
- const mark = tailScore ? ballScoreMark(tailScore) : ZERO_MARK;
- return isSpare(headMark, mark) ? SPARE_MARK : mark;
- };
- const oldFrameScores = round => {
- let isStrike1 = false, isStrike2 = false, isLastSpare = false;
- const scores = [];
- round.forEach(({ mark1, mark2, mark3 }, i) => {
- const score1 = MARK_SCORES[mark1];
- const score2 = MARK_SCORES[mark2];
- const score3 = MARK_SCORES[mark3];
- const isLast = isLastFrame(i + 1);
- const lastScore = () => {
- if (isStrike(mark2)) {
- return (scores[i - 1] || 0) + 20 + score3;
- } else if (isSpare(mark2, mark3)) {
- return (scores[i - 1] || 0) + 20;
- } else {
- return (scores[i - 1] || 0) + 10 + score2 + score3;
- }
- }
- if (isStrike1) {
- if (isStrike2) {
- scores[i - 2] = (scores[i - 3] || 0) + 20 + score1;
- }
- if (isStrike(mark1)) {
- if (isLast) {
- scores[i - 1] = (scores[i - 2] || 0) + 20 + score2;
- scores[i] = lastScore();
- } else {
- isStrike2 = true;
- }
- } else {
- isStrike1 = isStrike2 = false;
- if (isSpare(mark1, mark2)) {
- scores[i - 1] = (scores[i - 2] || 0) + 20;
- isLastSpare = true;
- if (!isLast) return;
- scores[i] = (scores[i - 1] || 0) + 10 + score3;
- } else {
- scores[i - 1] = (scores[i - 2] || 0) + 10 + score1 + score2;
- scores[i] = (scores[i - 1] || 0) + score1 + score2;
- }
- }
- } else {
- if (isLastSpare) {
- isLastSpare = false;
- scores[i - 1] = (scores[i - 2] || 0) + 10 + score1;
- }
- if (isStrike(mark1)) {
- isStrike1 = true;
- if (isLast) scores[i] = lastScore();
- } else if (isSpare(mark1, mark2)) {
- isLastSpare = true;
- if (!isLast) return;
- scores[i] = (scores[i - 1] || 0) + 10 + score3;
- } else {
- scores[i] = (scores[i - 1] || 0) + score1 + score2;
- }
- }
- });
- return scores;
- };
- const newFrameScore = ({ mark1, mark2 }) => {
- if (isStrike(mark1)) return 30;
- const headScore = MARK_SCORES[mark1];
- return headScore + (isSpare(mark1, mark2) ? 10 : MARK_SCORES[mark2]);
- };
- const newFrameScores = round => {
- let total = 0;
- const scores = [];
- round.forEach(frame => {
- const score = newFrameScore(frame);
- scores.push(total + score);
- total += score;
- });
- return scores;
- };
- const lastFrame = headMark => {
- if (isStrike(headMark)) {
- const headMark2 = ballScoreMark(HEAD_SCORES);
- return {
- mark1: headMark,
- mark2: headMark2,
- mark3: isStrike(headMark2) ? ballScoreMark(HEAD_SCORES) : tailMark(headMark2)
- }
- }
- const tail = tailMark(headMark);
- return {
- mark1: headMark,
- mark2: tail,
- mark3: isSpare(headMark, tail) ? ballScoreMark(HEAD_SCORES) : EMPTY_MARK
- };
- };
- const frame = (_, i) => {
- const headMark = ballScoreMark(HEAD_SCORES);
- return isLastFrame(i + 1) ? lastFrame(headMark) : {
- mark1: headMark,
- mark2: tailMark(headMark)
- };
- }, roundScore = scores => scores[9];
- const roundMarkCount = (mark, round) => round.map(frame => {
- return Object.values(frame).filter(m => {
- return m.includes(mark);
- }).length;
- }).reduce(sum, 0);
- const roundStrikeStringSum = round => {
- let sum = 0, isLastStrike;
- round.forEach(frame => {
- Object.entries(frame).filter(([key, mark]) => {
- return key !== "mark3" && mark !== EMPTY_MARK;
- }).map(([key, mark]) => mark).forEach(mark => {
- if (!isStrike(mark)) return isLastStrike = false;
- if (isLastStrike) sum++;
- isLastStrike = true;
- });
- });
- return sum;
- };
- const roundStrikeStringLength = round => {
- let length = 0, tempLength = 0, isLastStrike;
- round.forEach(frame => {
- Object.entries(frame).filter(([key, mark]) => {
- return key !== "mark3" && mark !== EMPTY_MARK;
- }).map(([key, mark]) => mark).forEach(mark => {
- if (!isStrike(mark)) {
- length = Math.max(length, tempLength);
- tempLength = 0;
- return isLastStrike = false;
- }
- if (isLastStrike) tempLength++;
- isLastStrike = true;
- });
- });
- return Math.max(length, tempLength);
- };
- const roundSplitSpareCount = round => round.filter(frame => {
- const marks = Object.values(frame);
- if (!marks.includes(SPARE_MARK)) return false;
- if (frame.mark1.includes(SPLIT_MARK)) return true;
- return frame.mark2.includes(SPLIT_MARK);
- }).length;
- const isValid = round => {
- if (roundStrikeStringLength(round) > MAX_STRIKE_STRING_LENGTH) {
- return false;
- } else if (roundStrikeStringSum(round) > MAX_STRIKE_STRING_SUM) {
- return false;
- } else if (roundMarkCount(STRIKE_MARK, round) > MAX_STRIKES) {
- return false;
- } else if (roundSplitSpareCount(round) > MAX_SPLIT_SPARES) {
- return false;
- } else if (roundMarkCount(SPLIT_MARK, round) > MAX_SPLITS) {
- return false;
- }
- const score = roundScore(oldFrameScores(round));
- return score > ABOVE_OLD_SCORE && score < BELOW_OLD_SCORE;
- }
- const round = () => {
- const rawRound = Array(10).fill(0);
- let round;
- do { round = rawRound.map(frame); } while (!isValid(round));
- return round;
- };
- const roundScores = (system, rounds) => {
- return rounds.map(system).map(roundScore);
- };
- const roundScoreRanges = rounds => {
- const oldScores = roundScores(oldFrameScores, rounds);
- return roundScores(newFrameScores, rounds).map((score, i) => {
- return score - oldScores[i];
- });
- };
- const roundMarks = (mark, rounds) => {
- return rounds.map(roundMarkCount.bind(null, mark));
- };
- const roundStrikeStringSums = rounds => {
- return rounds.map(roundStrikeStringSum);
- };
- const roundStrikeStringLengths = rounds => {
- return rounds.map(roundStrikeStringLength);
- }, roundSplitSpares = rounds => rounds.map(roundSplitSpareCount);
- const isOpen = ({ mark2, mark3 }) => {
- if (mark2 === EMPTY_MARK || mark2 === SPARE_MARK) return false;
- return !isStrike(mark2) && mark3 !== SPARE_MARK;
- }, roundOpenCount = round => round.filter(isOpen).length;
- const roundOpens = rounds => rounds.map(roundOpenCount);
- const isSplitOpen = frame => {
- const marks = Object.values(frame);
- if (marks.some(mark => mark === SPARE_MARK)) return false;
- if (frame.mark1.includes(SPLIT_MARK)) return true;
- return frame.mark2.includes(SPLIT_MARK);
- };
- const roundSplitOpenCount = round => {
- return round.filter(isSplitOpen).length;
- }, roundSplitOpens = rounds => rounds.map(roundSplitOpenCount);
- const roundNonSplitOpenCount = round => {
- return roundOpenCount(round) - roundSplitOpenCount(round);
- };
- const roundNonSplitOpens = rounds => {
- return rounds.map(roundNonSplitOpenCount);
- }, avgNo = nos => nos.reduce(sum, 0) / nos.length;
- const ascSort = (a, b) => a - b, medianNo = nos => {
- const ascNos = nos.sort(ascSort);
- const l = ascNos.length;
- return (ascNos[Math.floor((l + 1) / 2) - 1] + ascNos[Math.ceil((l + 1) / 2) - 1]) / 2;
- };
- const sdNo = nos => {
- const l = nos.length;
- if (l <= 1) return 0;
- const avg = avgNo(nos);
- return Math.sqrt(nos.reduce((sd, no) => {
- return sd + Math.pow(no - avg, 2);
- }, 0) / (l - 1));
- };
- const summary = (data, name) => {
- const ascData = data.sort(ascSort);
- return [
- `Min ${name}: ${ascData[0]}`,
- `Avg ${name}: ${avgNo(ascData)}`,
- `Max ${name}: ${ascData[ascData.length - 1]}`,
- `Median ${name}: ${medianNo(ascData)}`,
- `SD ${name}: ${sdNo(ascData)}`
- ].join(" ");
- }, isClearGame = round => !round.some(isOpen);
- const clearGameCount = rounds => rounds.filter(isClearGame).length;
- const clearGames = rounds => {
- return `Clear games: ${clearGameCount(rounds)}`;
- };
- const isSplitOnlyNonClearGame = round => {
- if (roundSplitOpenCount(round) === 0) return false;
- return roundNonSplitOpenCount(round) === 0;
- };
- const splitOnlyNonClearGameCount = rounds => {
- return rounds.filter(isSplitOnlyNonClearGame).length;
- };
- const splitOnlyNonClearGames = rounds => {
- return `Split only non-clear games: ${splitOnlyNonClearGameCount(rounds)}`;
- };
- const scoreMilestones = scores => {
- const milestone1 = ASC_SCORE_MILESTONES[0];
- return [
- `[0, ${milestone1}): ${scores.filter(score => {
- return score < milestone1;
- }).length}`
- ].concat(ASC_SCORE_MILESTONES.map((milestone, i) => {
- const nextMilestone = ASC_SCORE_MILESTONES[i + 1];
- if (!isNaN(nextMilestone)) {
- return `[${milestone}, ${nextMilestone}): ${scores.filter(score => {
- return score >= milestone && score < nextMilestone;
- }).length}`;
- }
- return `[${milestone}, 300]: ${scores.filter(score => {
- return score >= milestone;
- }).length}`;
- })).join(" ");
- };
- const markResults = (rounds, resultMark) => {
- return Object.keys(MARK_SCORES).concat([
- SPARE_MARK
- ]).map(mark => {
- return `${mark}: ${rounds.reduce((sum, round) => {
- return sum + round.filter(frame => {
- return frame[resultMark] === mark;
- }).length;
- }, 0)}`;
- }).join(" | ");
- };
- const gameBlockScore = (system, rounds, l) => {
- return new Array(rounds.length - l).fill("").map((e, i) => {
- return rounds.slice(i, i + l).reduce((sum, round) => {
- return sum + system(round)[9];
- }, 0);
- });
- };
- const summaries = rounds => [
- summary(roundScores(oldFrameScores, rounds), "old score"),
- summary(roundScores(newFrameScores, rounds), "new score"),
- summary(roundScoreRanges(rounds), "new - old score difference"),
- summary(roundMarks(STRIKE_MARK, rounds), "strikes"),
- summary(roundStrikeStringSums(rounds), "strike string sum"),
- summary(roundStrikeStringLengths(rounds), "strike string length"),
- summary(roundMarks(SPARE_MARK, rounds), "spares"),
- summary(roundMarks(SPLIT_MARK, rounds), "splits"),
- summary(roundMarks(ZERO_MARK, rounds), "zeroes"),
- summary(roundSplitSpares(rounds), "split spares"),
- summary(roundOpens(rounds), "opens"),
- summary(roundSplitOpens(rounds), "split opens"),
- summary(roundNonSplitOpens(rounds), "non-split opens"),
- summary(gameBlockScore(oldFrameScores, rounds, 2),
- "2 game block old score"),
- summary(gameBlockScore(newFrameScores, rounds, 2),
- "2 game block new score"),
- summary(gameBlockScore(oldFrameScores, rounds, 3),
- "3 game block old score"),
- summary(gameBlockScore(newFrameScores, rounds, 3),
- "3 game block new score"),
- summary(gameBlockScore(oldFrameScores, rounds, 4),
- "4 game block old score"),
- summary(gameBlockScore(newFrameScores, rounds, 4),
- "4 game block new score"),
- summary(gameBlockScore(oldFrameScores, rounds, 5),
- "5 game block old score"),
- summary(gameBlockScore(newFrameScores, rounds, 5),
- "5 game block new score"),
- summary(gameBlockScore(oldFrameScores, rounds, 6),
- "6 game block old score"),
- summary(gameBlockScore(newFrameScores, rounds, 6),
- "6 game block new score"),
- summary(gameBlockScore(oldFrameScores, rounds, 7),
- "7 game block old score"),
- summary(gameBlockScore(newFrameScores, rounds, 7),
- "7 game block new score"),
- summary(gameBlockScore(oldFrameScores, rounds, 8),
- "8 game block old score"),
- summary(gameBlockScore(newFrameScores, rounds, 8),
- "8 game block new score"),
- summary(gameBlockScore(oldFrameScores, rounds, 9),
- "9 game block old score"),
- summary(gameBlockScore(newFrameScores, rounds, 9),
- "9 game block new score"),
- summary(gameBlockScore(oldFrameScores, rounds, 10),
- "10 game block old score"),
- summary(gameBlockScore(newFrameScores, rounds, 10),
- "10 game block new score"),
- clearGames(rounds),
- splitOnlyNonClearGames(rounds),
- "Old Score Milestones:",
- scoreMilestones(roundScores(oldFrameScores, rounds)),
- "New Score Milestones:",
- scoreMilestones(roundScores(newFrameScores, rounds)),
- "1st Frame Mark",
- markResults(rounds, "mark1"),
- "2nd Frame Mark",
- markResults(rounds, "mark2"),
- "3rd Frame Mark",
- markResults(rounds, "mark3")
- ].join("<br>");
- const recordedFrames = round => round.map(({ mark1, mark2, mark3 }) => {
- return `${mark1}${mark2}${mark3 || ""}`
- }).join(FRAME_SEPARATOR);
- const recordedScore = score => {
- return `${Array(4 - `${score}`.length).fill(".").join("")}${score}`;
- };
- const recordedScores = scores => {
- return scores.map(recordedScore).join(FRAME_SEPARATOR);
- };
- const recordedRound = round => [
- recordedFrames(round),
- recordedScores(oldFrameScores(round)),
- recordedScores(newFrameScores(round))
- ].join("<br>");
- const recordedDay = rounds => [
- `<code>${rounds.map(recordedRound).join("<br>")}</code>`,
- `<div>${summaries(rounds)}</div>`
- ].join("<br>");
- const setHTML = (id, html) => {
- document.getElementById(id).innerHTML = html;
- };
- const ROUNDS = Array(DAY_COUNT * ROUNDS_PER_DAY).fill(0).map(round);
- const DAYS = (() => {
- const days = [], rounds = ROUNDS.slice();
- while (rounds.length > 0) {
- days.push(rounds.splice(0, ROUNDS_PER_DAY));
- }
- return days;
- })(), ASC_DAY_CLEAR_GAMES = DAYS.map(clearGameCount).sort(ascSort);
- const ASC_DAY_SPLIT_ONLY_NON_CLEAR_GAMES = DAYS.map(splitOnlyNonClearGameCount).sort(ascSort);
- const OLD_DAY_SCORES = DAYS.map(roundScores.bind(null, oldFrameScores));
- const NEW_DAY_SCORES = DAYS.map(roundScores.bind(null, newFrameScores));
- const ASC_AVG_OLD_DAY_SCORES = OLD_DAY_SCORES.map(avgNo).sort(ascSort);
- const ASC_AVG_NEW_DAY_SCORES = NEW_DAY_SCORES.map(avgNo).sort(ascSort);
- const ASC_MEDIAN_OLD_DAY_SCORES = OLD_DAY_SCORES.map(medianNo).sort(ascSort);
- const ASC_MEDIAN_NEW_DAY_SCORES = NEW_DAY_SCORES.map(medianNo).sort(ascSort);
- const ASC_SD_OLD_DAY_SCORES = OLD_DAY_SCORES.map(sdNo).sort(ascSort);
- const ASC_SD_NEW_DAY_SCORES = NEW_DAY_SCORES.map(sdNo).sort(ascSort);
- const ASC_MIN_OLD_DAY_SCORES = OLD_DAY_SCORES.map(nos => nos.sort(ascSort)[0]).sort(ascSort);
- const ASC_MAX_OLD_DAY_SCORES = OLD_DAY_SCORES.map(nos => nos.sort(ascSort)[nos.length - 1]).sort(ascSort);
- const ASC_MIN_NEW_DAY_SCORES = NEW_DAY_SCORES.map(nos => nos.sort(ascSort)[0]).sort(ascSort);
- const ASC_MAX_NEW_DAY_SCORES = NEW_DAY_SCORES.map(nos => nos.sort(ascSort)[nos.length - 1]).sort(ascSort);
- window.onload = () => {
- setHTML("summary", summaries(DAYS.reduce((rounds, days) => {
- return rounds.concat(days);
- }, [])));
- setHTML("minDayClear", ASC_DAY_CLEAR_GAMES[0]);
- setHTML("maxDayClear", ASC_DAY_CLEAR_GAMES[ASC_DAY_CLEAR_GAMES.length - 1]);
- setHTML("minDaySplitNonClear", ASC_DAY_SPLIT_ONLY_NON_CLEAR_GAMES[0]);
- setHTML("maxDaySplitNonClear", ASC_DAY_SPLIT_ONLY_NON_CLEAR_GAMES[ASC_DAY_SPLIT_ONLY_NON_CLEAR_GAMES.length - 1]);
- setHTML("minAvgOldDay", ASC_AVG_OLD_DAY_SCORES[0]);
- setHTML("maxAvgOldDay", ASC_AVG_OLD_DAY_SCORES[ASC_AVG_OLD_DAY_SCORES.length - 1]);
- setHTML("minAvgNewDay", ASC_AVG_NEW_DAY_SCORES[0]);
- setHTML("maxAvgNewDay", ASC_AVG_NEW_DAY_SCORES[ASC_AVG_NEW_DAY_SCORES.length - 1]);
- setHTML("minMedianOldDay", ASC_MEDIAN_OLD_DAY_SCORES[0]);
- setHTML("maxMedianOldDay", ASC_MEDIAN_OLD_DAY_SCORES[ASC_MEDIAN_OLD_DAY_SCORES.length - 1]);
- setHTML("minMedianNewDay", ASC_MEDIAN_NEW_DAY_SCORES[0]);
- setHTML("maxMedianNewDay", ASC_MEDIAN_NEW_DAY_SCORES[ASC_MEDIAN_NEW_DAY_SCORES.length - 1]);
- setHTML("minSDOldDay", ASC_SD_OLD_DAY_SCORES[0]);
- setHTML("maxSDOldDay", ASC_SD_OLD_DAY_SCORES[ASC_SD_OLD_DAY_SCORES.length - 1]);
- setHTML("minSDNewDay", ASC_SD_NEW_DAY_SCORES[0]);
- setHTML("maxSDNewDay", ASC_SD_NEW_DAY_SCORES[ASC_SD_NEW_DAY_SCORES.length - 1]);
- setHTML("maxOldDayMin", ASC_MIN_OLD_DAY_SCORES[ASC_MIN_OLD_DAY_SCORES.length - 1]);
- setHTML("minOldDayMax", ASC_MAX_OLD_DAY_SCORES[0]);
- setHTML("maxNewDayMin", ASC_MIN_NEW_DAY_SCORES[ASC_MIN_NEW_DAY_SCORES.length - 1]);
- setHTML("minNewDayMax", ASC_MAX_NEW_DAY_SCORES[0]);
- setHTML("dayOldScoreMilestones", scoreMilestones(ASC_AVG_OLD_DAY_SCORES));
- setHTML("dayNewScoreMilestones", scoreMilestones(ASC_AVG_NEW_DAY_SCORES));
- setHTML("days", DAYS.map(recordedDay).join("<hr>"));
- };
- //
- </script>
- </head>
- <body>
- <div id="summary"></div>
- <br>
- Min day clear games: <span id="minDayClear"></span>
- Max day clear games: <span id="maxDayClear"></span>
- <br>
- Min day split only non-clear games: <span id="minDaySplitNonClear"></span>
- Max day split only non-clear games: <span id="maxDaySplitNonClear"></span>
- <br>
- Min old day avg score: <span id="minAvgOldDay"></span>
- Max old day avg score: <span id="maxAvgOldDay"></span>
- <br>
- Min new day avg score: <span id="minAvgNewDay"></span>
- Max new day avg score: <span id="maxAvgNewDay"></span>
- <br>
- Min old day median score: <span id="minMedianOldDay"></span>
- Max old day median score: <span id="maxMedianOldDay"></span>
- <br>
- Min new day median score: <span id="minMedianNewDay"></span>
- Max new day median score: <span id="maxMedianNewDay"></span>
- <br>
- Min old day sd score: <span id="minSDOldDay"></span>
- Max old day sd score: <span id="maxSDOldDay"></span>
- <br>
- Min new day sd score: <span id="minSDNewDay"></span>
- Max new day sd score: <span id="maxSDNewDay"></span>
- <br>
- Max old day min score: <span id="maxOldDayMin"></span>
- Min old day max score: <span id="minOldDayMax"></span>
- <br>
- Max new day min score: <span id="maxNewDayMin"></span>
- Min new day max score: <span id="minNewDayMax"></span>
- <br>
- Old score milestones:
- <br>
- <div id="dayOldScoreMilestones"></div>
- New score milestones:
- <br>
- <div id="dayNewScoreMilestones"></div>
- <br>
- <hr>
- <br>
- <div id="days"></div>
- </body>
- </html>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement