Compare commits
1 Commits
assignment
...
assignment
| Author | SHA1 | Date | |
|---|---|---|---|
| 0af89a72ba |
21
README.md
21
README.md
@@ -1,17 +1,6 @@
|
||||
# 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.
|
||||
# Advent of Code 2022 - Assignment7 javascript
|
||||
Assignment 7 involves parsing linux directory commands/results into a tree. The solution defines a root TreeNode first and sets it as currentdirectory. Whenever a cd command is found a new node is created if it does not exist and set to currentdir. Whenever a cd .. is found currentdirectory is set to parent. Whenever a file is found size is recursively increased for current node and parent nodes.
|
||||
|
||||
## 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
|
||||
## References
|
||||
- https://adrianmejia.com/data-structures-for-beginners-trees-binary-search-tree-tutorial/
|
||||
- https://stackoverflow.com/questions/8376525/get-value-of-a-string-after-last-slash-in-javascript
|
||||
|
||||
@@ -8,8 +8,6 @@
|
||||
<body>
|
||||
<p>Assignment:</p>
|
||||
<textarea rows="15" cols="50" id="assignment"></textarea>
|
||||
<input type="checkbox" id="algorithm"/>
|
||||
<label for="algorithm">TOP 3</label>
|
||||
|
||||
<p>Answer:</p>
|
||||
<div id="answer">Provide input first</div>
|
||||
|
||||
147
script.js
147
script.js
@@ -1,16 +1,85 @@
|
||||
const ASSIGNMENT = 'assignment';
|
||||
const ANSWER = 'answer';
|
||||
const ALGORITHM_CHECKBOX = 'algorithm';
|
||||
const NEWLINE_CHARACTER = '\n';
|
||||
const TOP_1 = 1;
|
||||
const TOP_N = 3;
|
||||
const MAX_SIZE = 100000;
|
||||
const UPDATE_SIZE = 30000000;
|
||||
const TOTAL_SPACE = 70000000;
|
||||
|
||||
/**
|
||||
* Main function
|
||||
*/
|
||||
window.onload = function() {
|
||||
document.getElementById(ASSIGNMENT).addEventListener("input", calculateAnswer);
|
||||
document.getElementById(ALGORITHM_CHECKBOX).addEventListener("click", calculateAnswer);
|
||||
}
|
||||
|
||||
class TreeNode {
|
||||
constructor(value, parent) {
|
||||
console.debug(((!parent)?"Root ":"") + "node created: " + value);
|
||||
|
||||
this.parent = parent;
|
||||
this.value = value;
|
||||
this.size = 0;
|
||||
this.descendants = [];
|
||||
}
|
||||
|
||||
getDir = function(path) {
|
||||
for(let descendant of this.descendants) {
|
||||
if(descendant.value == path) {
|
||||
return descendant;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
contains = function(path) {
|
||||
// Recursive case
|
||||
let subPathIndex = path.indexOf('/');
|
||||
let subPath = path.substring(0, subPathIndex-1);
|
||||
let leftOverPath = path.substring(subPathIndex);
|
||||
|
||||
// Base case
|
||||
if(subPath == '') {
|
||||
return false;
|
||||
}
|
||||
|
||||
for(let descendant of this.descendants) {
|
||||
if(descendant.value == subPath) {
|
||||
return descendant.contains(subPath);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
findClosestNodeToSize = function(minSize) {
|
||||
let closest = this;
|
||||
|
||||
for(let descendant of this.descendants) {
|
||||
let closestDescendant = descendant.findClosestNodeToSize(minSize);
|
||||
|
||||
if (closestDescendant.size > minSize && closestDescendant.size < closest.size) {
|
||||
console.debug("New closest:" + closestDescendant.size);
|
||||
closest = closestDescendant;
|
||||
}
|
||||
}
|
||||
|
||||
return closest;
|
||||
}
|
||||
|
||||
increaseSize = function(size) {
|
||||
// TODO: Wat doen we met duplicate files?
|
||||
this.size += size;
|
||||
if(this.parent) {
|
||||
this.parent.increaseSize(size);
|
||||
}
|
||||
}
|
||||
|
||||
getSum = function(maxSize) {
|
||||
let result = (this.size < maxSize) ? this.size: 0;
|
||||
|
||||
for(let descendant of this.descendants) {
|
||||
result += descendant.getSum(maxSize);
|
||||
}
|
||||
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -19,52 +88,60 @@ window.onload = function() {
|
||||
*/
|
||||
function calculateAnswer(event) {
|
||||
console.info("Calculating answer for input...");
|
||||
let assignment = document.getElementById(ASSIGNMENT).value;
|
||||
let top3 = document.getElementById(ALGORITHM_CHECKBOX).checked;
|
||||
let answer = algorithm(assignment, (top3)? TOP_N: 1);
|
||||
let answer = algorithm(event.target.value);
|
||||
|
||||
document.getElementById(ANSWER).innerText = answer;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculate the answer to assignment1 with 2 variables, count and highest.
|
||||
* Calculate the answer to assignment.
|
||||
* @param assignment the input from the assignment.
|
||||
* @param topn the
|
||||
* @return string the elf with the highest calory count
|
||||
* @return string the answer
|
||||
*/
|
||||
function algorithm(assignment, topn) {
|
||||
let currentCalorieScore = 0;
|
||||
let highestCalorieScores = Array.from({length: topn}, () => (0));
|
||||
let currentElf = 1;
|
||||
|
||||
function algorithm(assignment) {
|
||||
let lines = assignment.trim().split(NEWLINE_CHARACTER);
|
||||
console.info("Linecount:" + lines.length);
|
||||
|
||||
for(var i = 0; i < lines.length; i++){
|
||||
let line = lines[i];
|
||||
let root = new TreeNode('/');
|
||||
let currentdir = root;
|
||||
|
||||
if(!line && currentCalorieScore > 0) { // Check for empty line and skip subsequent emptylines
|
||||
console.debug("Calculated score for elf " + currentElf + ": " + currentCalorieScore);
|
||||
for(let i=0; i<lines.length; i++) {
|
||||
let terminalLine = lines[i].trim();
|
||||
|
||||
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++;
|
||||
if(terminalLine.substring(0, 4) == "$ cd") {
|
||||
let changeDirectory = terminalLine.substring(5).trim();
|
||||
if(changeDirectory == "..") {
|
||||
console.debug("One directory up from: " + currentdir.value);
|
||||
currentdir = currentdir.parent;
|
||||
console.debug("navigates to: " + currentdir.value);
|
||||
continue;
|
||||
}
|
||||
|
||||
let calorieScore = parseInt(line);
|
||||
currentCalorieScore += calorieScore;
|
||||
if(changeDirectory == "/") {
|
||||
currentdir = root;
|
||||
continue;
|
||||
}
|
||||
|
||||
console.debug(highestCalorieScores);
|
||||
return "The highest of sum of calorie amount: " + highestCalorieScores.reduce(function(a, b) { return a + b; }, 0);
|
||||
if(!currentdir.contains(changeDirectory)) {
|
||||
currentdir.descendants.push(new TreeNode(changeDirectory, currentdir));
|
||||
}
|
||||
|
||||
currentdir = currentdir.getDir(changeDirectory);
|
||||
} else if(terminalLine.substring(0, 3) != 'dir' && !terminalLine.includes('$')) {
|
||||
console.debug(terminalLine);
|
||||
spaceIndex = terminalLine.indexOf(' ');
|
||||
size = parseInt(terminalLine.substring(0, spaceIndex));
|
||||
currentdir.increaseSize(size);
|
||||
}
|
||||
}
|
||||
|
||||
let freeDiskSpace = TOTAL_SPACE - root.size;
|
||||
console.debug("Free disk space: " + freeDiskSpace);
|
||||
|
||||
console.debug("Root size:" + root.size);
|
||||
console.debug("Value to find: " + (UPDATE_SIZE - freeDiskSpace));
|
||||
let closestNode = root.findClosestNodeToSize(UPDATE_SIZE - freeDiskSpace);
|
||||
console.debug("Closest value: " + closestNode.size);
|
||||
|
||||
return "Sum below maxSize " + MAX_SIZE + ": " + root.getSum(MAX_SIZE);
|
||||
}
|
||||
Reference in New Issue
Block a user