From 3f3daab72615fb220d3a1cd1bec879b652855852 Mon Sep 17 00:00:00 2001 From: paulusgaming Date: Mon, 5 Dec 2022 01:09:57 +0100 Subject: [PATCH] Solution for assignment1. --- README.md | 18 +++++++++++++++++- index.html | 2 ++ script.js | 47 ++++++++++++++++++++++++++++++++++++++++++----- style.css | 4 ++++ 4 files changed, 65 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index da57339..f666b84 100644 --- a/README.md +++ b/README.md @@ -1 +1,17 @@ -This repository contains answers to the assignments of Advent of Coding 2022 +# Advent of Code 2022 - assignment 1 +This is the first assignment for Advent of Code 2022. The provided solution uses 3 variables: currentScore, highestCalorieScore, currentElf, highestElf. +It is complexity O(n+m) since it loops through every line exactly once (n) and the iterates for recalculating highscore (m). +The GUI also provides a checkbox to toggle top3 or top1. + +## Solution description +Every iteration the score is added to the currentScore. If an empty line is detected we check if currentscore exceeds one of our highestCalorieScore, if yes we assign currentElf to highestElf. + +## references +- https://adventofcode.com/2022/day/1 +- https://stackoverflow.com/questions/17595361/how-to-read-text-line-by-line-in-a-html-text-area +- https://bobbyhadz.com/blog/javascript-get-value-of-textarea +- https://stackoverflow.com/questions/154059/how-do-i-check-for-an-empty-undefined-null-string-in-javascript +- https://www.geeksforgeeks.org/convert-a-string-to-an-integer-in-javascript/#:~:text=In%20JavaScript%20parseInt()%20function,argument%20of%20parseInt()%20function. +- https://stackoverflow.com/questions/1230233/how-to-find-the-sum-of-an-array-of-numbers +- https://www.w3schools.com/js/js_break.asp +- https://2ality.com/2018/12/creating-arrays.html \ No newline at end of file diff --git a/index.html b/index.html index 5cf1ba4..6765329 100644 --- a/index.html +++ b/index.html @@ -8,6 +8,8 @@

Assignment:

+ +

Answer:

Provide input first
diff --git a/script.js b/script.js index a6e2848..402c2f3 100644 --- a/script.js +++ b/script.js @@ -1,12 +1,16 @@ const ASSIGNMENT = 'assignment'; const ANSWER = 'answer'; +const ALGORITHM_CHECKBOX = 'algorithm'; const NEWLINE_CHARACTER = '\n'; +const TOP_1 = 1; +const TOP_N = 3; /** * Main function */ window.onload = function() { document.getElementById(ASSIGNMENT).addEventListener("input", calculateAnswer); + document.getElementById(ALGORITHM_CHECKBOX).addEventListener("click", calculateAnswer); } /** @@ -15,19 +19,52 @@ window.onload = function() { */ function calculateAnswer(event) { console.info("Calculating answer for input..."); - let answer = algorithm(event.target.value); + let assignment = document.getElementById(ASSIGNMENT).value; + let top3 = document.getElementById(ALGORITHM_CHECKBOX).checked; + let answer = algorithm(assignment, (top3)? TOP_N: 1); document.getElementById(ANSWER).innerText = answer; } /** - * Calculate the answer to assignment. + * Calculate the answer to assignment1 with 2 variables, count and highest. * @param assignment the input from the assignment. - * @return string the answer + * @param topn the + * @return string the elf with the highest calory count */ -function algorithm(assignment) { +function algorithm(assignment, topn) { + let currentCalorieScore = 0; + let highestCalorieScores = Array.from({length: topn}, () => (0)); + let currentElf = 1; + let lines = assignment.trim().split(NEWLINE_CHARACTER); console.info("Linecount:" + lines.length); - // TODO: implement assignment + for(var i = 0; i < lines.length; i++){ + let line = lines[i]; + + if(!line && currentCalorieScore > 0) { // Check for empty line and skip subsequent emptylines + console.debug("Calculated score for elf " + currentElf + ": " + currentCalorieScore); + + for(let j=0; j < highestCalorieScores.length; j++) { + if(currentCalorieScore > highestCalorieScores[j]) { + console.debug("New highest #"+(j+1) + " elf found, with score:" + currentCalorieScore); + let oldHighestCalorieScore = highestCalorieScores[j]; + highestCalorieScores[j] = currentCalorieScore; + currentCalorieScore = oldHighestCalorieScore; + } + } + + // Reset values + currentCalorieScore = 0; + currentElf++; + continue; + } + + let calorieScore = parseInt(line); + currentCalorieScore += calorieScore; + } + + console.debug(highestCalorieScores); + return "The highest of sum of calorie amount: " + highestCalorieScores.reduce(function(a, b) { return a + b; }, 0); } \ No newline at end of file diff --git a/style.css b/style.css index f39a6bd..11e662f 100644 --- a/style.css +++ b/style.css @@ -6,6 +6,10 @@ body { font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, Oxygen, Ubuntu, Cantarell, 'Open Sans', 'Helvetica Neue', sans-serif; } + textarea { + display: block; + } + #answer { color: purple }