Compare commits
1 Commits
assignment
...
assignment
| Author | SHA1 | Date | |
|---|---|---|---|
| 3f3daab726 |
21
README.md
21
README.md
@@ -1,6 +1,17 @@
|
||||
# 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.
|
||||
# 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.
|
||||
|
||||
## 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
|
||||
## 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
|
||||
@@ -8,6 +8,8 @@
|
||||
<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>
|
||||
|
||||
151
script.js
151
script.js
@@ -1,85 +1,16 @@
|
||||
const ASSIGNMENT = 'assignment';
|
||||
const ANSWER = 'answer';
|
||||
const ALGORITHM_CHECKBOX = 'algorithm';
|
||||
const NEWLINE_CHARACTER = '\n';
|
||||
const MAX_SIZE = 100000;
|
||||
const UPDATE_SIZE = 30000000;
|
||||
const TOTAL_SPACE = 70000000;
|
||||
const TOP_1 = 1;
|
||||
const TOP_N = 3;
|
||||
|
||||
/**
|
||||
* Main function
|
||||
*/
|
||||
window.onload = function() {
|
||||
document.getElementById(ASSIGNMENT).addEventListener("input", 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;
|
||||
}
|
||||
document.getElementById(ALGORITHM_CHECKBOX).addEventListener("click", calculateAnswer);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -88,60 +19,52 @@ class TreeNode {
|
||||
*/
|
||||
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) {
|
||||
let lines = assignment.trim().split(NEWLINE_CHARACTER);
|
||||
console.info("Linecount:" + lines.length);
|
||||
function algorithm(assignment, topn) {
|
||||
let currentCalorieScore = 0;
|
||||
let highestCalorieScores = Array.from({length: topn}, () => (0));
|
||||
let currentElf = 1;
|
||||
|
||||
let root = new TreeNode('/');
|
||||
let currentdir = root;
|
||||
let lines = assignment.trim().split(NEWLINE_CHARACTER);
|
||||
console.info("Linecount:" + lines.length);
|
||||
|
||||
for(let i=0; i<lines.length; i++) {
|
||||
let terminalLine = lines[i].trim();
|
||||
for(var i = 0; i < lines.length; i++){
|
||||
let line = lines[i];
|
||||
|
||||
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;
|
||||
}
|
||||
if(!line && currentCalorieScore > 0) { // Check for empty line and skip subsequent emptylines
|
||||
console.debug("Calculated score for elf " + currentElf + ": " + currentCalorieScore);
|
||||
|
||||
if(changeDirectory == "/") {
|
||||
currentdir = root;
|
||||
continue;
|
||||
}
|
||||
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;
|
||||
}
|
||||
}
|
||||
|
||||
if(!currentdir.contains(changeDirectory)) {
|
||||
currentdir.descendants.push(new TreeNode(changeDirectory, currentdir));
|
||||
}
|
||||
// Reset values
|
||||
currentCalorieScore = 0;
|
||||
currentElf++;
|
||||
continue;
|
||||
}
|
||||
|
||||
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 calorieScore = parseInt(line);
|
||||
currentCalorieScore += calorieScore;
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
console.debug(highestCalorieScores);
|
||||
return "The highest of sum of calorie amount: " + highestCalorieScores.reduce(function(a, b) { return a + b; }, 0);
|
||||
}
|
||||
Reference in New Issue
Block a user