From a8c8e1d7e2b762d0e0927d80c43e45254f26e2bd Mon Sep 17 00:00:00 2001 From: gribse Date: Mon, 17 Feb 2025 16:41:26 +0000 Subject: [PATCH] initial commit --- app.js | 152 +++++++++++++++++++++++++++++++++++++++++++++++++++++ index.html | 66 +++++++++++++++++++++++ info.png | Bin 0 -> 12641 bytes readme.md | 0 styles.css | 0 5 files changed, 218 insertions(+) create mode 100755 app.js create mode 100755 index.html create mode 100755 info.png create mode 100644 readme.md create mode 100755 styles.css diff --git a/app.js b/app.js new file mode 100755 index 0000000..6191923 --- /dev/null +++ b/app.js @@ -0,0 +1,152 @@ +document.getElementById('start-ranking').addEventListener('click', startRanking); +document.getElementById('help-button').addEventListener('click', toggleHelp); +document.getElementById('copy-results').addEventListener('click', copyResultsToClipboard); + +let words = []; +let currentPair = []; +let scores = {}; +let rounds = 0; +let currentRound = 0; +let playedPairs = new Set(); +const scoreThreshold = 5; +let totalVotes = 0; +let votesDone = 0; + +function startRanking() { + const wordList = document.getElementById('word-list').value.trim().split('\n'); + words = wordList.filter(word => word.trim() !== ''); + if (words.length < 2) { + showMessage('Please enter at least two words.'); + return; + } + + words.forEach(word => scores[word] = 1000); + rounds = Math.ceil(Math.log2(words.length)) + 2; // Number of rounds for Swiss-system + currentRound = 0; + playedPairs.clear(); + totalVotes = rounds * (words.length / 2); + votesDone = 0; + + document.getElementById('ranking-section').classList.remove('hidden'); + document.getElementById('progress').style.width = '0%'; + updateRankingList(); + nextPair(); +} + +function nextPair() { + if (currentRound >= rounds) { + showMessage('Ranking complete!'); + disableVoteButtons(); + return; + } + + currentPair = getNextPair(); + if (!currentPair) { + currentRound++; + nextPair(); + return; + } + + document.getElementById('word1').textContent = currentPair[0]; + document.getElementById('word2').textContent = currentPair[1]; + + document.getElementById('word1').onclick = () => vote(currentPair[0], currentPair[1]); + document.getElementById('word2').onclick = () => vote(currentPair[1], currentPair[0]); +} + +function getNextPair() { + const sortedWords = Object.keys(scores).sort((a, b) => scores[b] - scores[a]); + for (let i = 0; i < sortedWords.length - 1; i++) { + for (let j = i + 1; j < sortedWords.length; j++) { + if (!hasPlayed(sortedWords[i], sortedWords[j]) && Math.abs(scores[sortedWords[i]] - scores[sortedWords[j]]) <= scoreThreshold) { + return [sortedWords[i], sortedWords[j]]; + } + } + } + return null; +} + +function hasPlayed(word1, word2) { + const pair = [word1, word2].sort().join('-'); + return playedPairs.has(pair); +} + +function vote(winner, loser) { + const k = 32; + const expectedScoreWinner = 1 / (1 + Math.pow(10, (scores[loser] - scores[winner]) / 400)); + const expectedScoreLoser = 1 - expectedScoreWinner; + + scores[winner] += k * (1 - expectedScoreWinner); + scores[loser] += k * (0 - expectedScoreLoser); + + const pair = [winner, loser].sort().join('-'); + playedPairs.add(pair); + + votesDone++; + updateProgress(); + updateRankingList(); + nextPair(); +} + +function updateProgress() { + const progress = (votesDone / totalVotes) * 100; + document.getElementById('progress').style.width = progress + '%'; +} + +function updateRankingList() { + const rankingList = document.getElementById('ranking-list'); + rankingList.innerHTML = ''; + + const sortedWords = Object.keys(scores).sort((a, b) => scores[b] - scores[a]); + sortedWords.forEach(word => { + const listItem = document.createElement('li'); + listItem.classList.add('ranking-item', 'p-2', 'border', 'rounded', 'bg-gray-100', 'flex', 'justify-between'); + const wordSpan = document.createElement('span'); + wordSpan.classList.add('word'); + wordSpan.textContent = word; + const scoreSpan = document.createElement('span'); + scoreSpan.classList.add('score'); + scoreSpan.textContent = Math.round(scores[word]); + listItem.appendChild(wordSpan); + listItem.appendChild(scoreSpan); + rankingList.appendChild(listItem); + }); +} + +function disableVoteButtons() { + document.getElementById('word1').disabled = true; + document.getElementById('word2').disabled = true; + document.getElementById('word1').classList.add('bg-gray-500', 'cursor-not-allowed'); + document.getElementById('word2').classList.add('bg-gray-500', 'cursor-not-allowed'); +} + +function toggleHelp() { + const helpSection = document.getElementById('help-section'); + helpSection.classList.toggle('hidden'); + if (!helpSection.classList.contains('hidden')) { + helpSection.style.maxHeight = helpSection.scrollHeight + "px"; + } else { + helpSection.style.maxHeight = null; + } +} + +function showMessage(message) { + const messageBox = document.getElementById('message-box'); + const messageText = document.getElementById('message-text'); + messageText.textContent = message; + messageBox.classList.remove('hidden'); +} + +function copyResultsToClipboard() { + const sortedWords = Object.keys(scores).sort((a, b) => scores[b] - scores[a]); + const results = sortedWords.map(word => `${word}: ${Math.round(scores[word])}`).join('\n'); + navigator.clipboard.writeText(results).then(() => { + const clipboardOkIcon = document.querySelector('.clipboard-ok'); + clipboardOkIcon.classList.remove('hidden'); + setTimeout(() => { + clipboardOkIcon.classList.add('hidden'); + }, 5000); + }).catch(err => { + alert('Failed to copy results: ', err); + }); +} \ No newline at end of file diff --git a/index.html b/index.html new file mode 100755 index 0000000..695b313 --- /dev/null +++ b/index.html @@ -0,0 +1,66 @@ + + + + + + ELO Ranking System 2 + + + + +
+
+

Input Words

+ + +
+ +
+ +
+
+

Ranking

+
+ + +
+
+
+
+ +
+
+

Current Rankings

+
    + +
+
+
+ + + \ No newline at end of file diff --git a/info.png b/info.png new file mode 100755 index 0000000000000000000000000000000000000000..0261e243f376c2e4d4966bbd8ecf2e7d3d0dacc8 GIT binary patch literal 12641 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 literal 0 HcmV?d00001 diff --git a/readme.md b/readme.md new file mode 100644 index 0000000..e69de29 diff --git a/styles.css b/styles.css new file mode 100755 index 0000000..e69de29