Compare commits
1 Commits
assignment
...
assignment
| Author | SHA1 | Date | |
|---|---|---|---|
| 28597a3f26 |
23
README.md
23
README.md
@@ -1,17 +1,8 @@
|
||||
# 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 - Assignment8 javascript
|
||||
## Description
|
||||
This problem is all about walking through a grid. In this solution, we look through an entire column and row until we find a node with height <= height.
|
||||
|
||||
## 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://www.w3schools.com/jsref/jsref_charat.asp
|
||||
- https://stackabuse.com/javascript-check-if-variable-is-a-number/
|
||||
- https://www.w3schools.com/jsref/jsref_abs.asp
|
||||
@@ -8,8 +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>
|
||||
<input type="checkbox" id="algorithm" />
|
||||
<label for="algorithm">Highest scenic score?</label>
|
||||
|
||||
<p>Answer:</p>
|
||||
<div id="answer">Provide input first</div>
|
||||
|
||||
140
script.js
140
script.js
@@ -2,15 +2,13 @@ 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);
|
||||
window.onload = function () {
|
||||
document.getElementById(ASSIGNMENT).addEventListener("input", calculateAnswer);
|
||||
document.getElementById(ALGORITHM_CHECKBOX).addEventListener("click", calculateAnswer);
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -20,51 +18,117 @@ 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 getHighestScenicScore = document.getElementById(ALGORITHM_CHECKBOX).checked;
|
||||
let answer = algorithm(assignment, getHighestScenicScore);
|
||||
|
||||
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, getHighestScenicScore) {
|
||||
let lines = assignment.trim().split(NEWLINE_CHARACTER);
|
||||
console.info("Linecount:" + lines.length);
|
||||
|
||||
let lines = assignment.trim().split(NEWLINE_CHARACTER);
|
||||
console.info("Linecount:" + lines.length);
|
||||
let visibleTreeCount = 0;
|
||||
let highestScenicScore = 0;
|
||||
|
||||
for(var i = 0; i < lines.length; i++){
|
||||
let line = lines[i];
|
||||
for (let i = 0; i < lines.length; i++) {
|
||||
let row = lines[i].trim();
|
||||
|
||||
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 < row.length; j++) {
|
||||
if (i <= 0 || i >= lines.length - 1 || j <= 0 || j >= row.length - 1) { // Edge node
|
||||
//console.debug("Edge node found.");
|
||||
visibleTreeCount++;
|
||||
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;
|
||||
}
|
||||
}
|
||||
let height = parseInt(lines[i].charAt(j));
|
||||
if (!walkRowVisible(height, j, row) && !walkColumnVisible(height, i, j, lines)) {
|
||||
console.log("Found invisible tree, height:" + height + ", i:" + i + ", j:" + j);
|
||||
visibleTreeCount--;
|
||||
}
|
||||
|
||||
// Reset values
|
||||
currentCalorieScore = 0;
|
||||
currentElf++;
|
||||
continue;
|
||||
if (getHighestScenicScore) {
|
||||
let scenicScore = walkRowCount(height, j, row) * walkColumnCount(height, i, j, lines);
|
||||
if (scenicScore > highestScenicScore) {
|
||||
console.debug("Found new highest scenic score: " + scenicScore);
|
||||
highestScenicScore = scenicScore;
|
||||
}
|
||||
|
||||
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);
|
||||
// Tree is on edge.
|
||||
visibleTreeCount++;
|
||||
}
|
||||
}
|
||||
|
||||
if (getHighestScenicScore) {
|
||||
return "Highest scenic score: " + highestScenicScore;
|
||||
}
|
||||
|
||||
return "Amount of visible trees in the grid: " + visibleTreeCount;
|
||||
}
|
||||
|
||||
function walkColumnCount(height, index, rowIndex, column) {
|
||||
return walkCount(height, index, column, false, rowIndex);
|
||||
}
|
||||
|
||||
function walkRowCount(height, index, row) {
|
||||
return walkCount(height, index, row, true, -1);
|
||||
}
|
||||
|
||||
function walkColumnVisible(height, index, rowIndex, column) {
|
||||
return walkVisible(height, index, column, false, rowIndex);
|
||||
}
|
||||
|
||||
function walkRowVisible(height, index, row) {
|
||||
return walkVisible(height, index, row, true, -1);
|
||||
}
|
||||
|
||||
function walkCount(height, index, line, isRow, rowIndex) {
|
||||
let visibleLeftCount = __walkHelper(height, index, line, isRow, -1, rowIndex, 0);
|
||||
let visibleRightCount = __walkHelper(height, index, line, isRow, 1, rowIndex, 0);
|
||||
|
||||
return visibleLeftCount * visibleRightCount;
|
||||
}
|
||||
|
||||
function walkVisible(height, index, line, isRow, rowIndex) {
|
||||
let visibleLeft = __walkHelper(height, index, line, isRow, -1, rowIndex);
|
||||
let visibleRight = __walkHelper(height, index, line, isRow, 1, rowIndex);
|
||||
|
||||
return visibleLeft || visibleRight;
|
||||
}
|
||||
|
||||
function __walkHelper(height, index, line, isRow, direction, rowIndex, count) {
|
||||
if (direction == 0) {
|
||||
console.error("Invalid direction 0 in __walkhelper");
|
||||
return -1;
|
||||
}
|
||||
|
||||
direction = direction / Math.abs(direction);
|
||||
|
||||
// Edge reached
|
||||
if ((direction < 0 && index <= 0) || (direction > 0 && index >= line.length - 1)) {
|
||||
return (count == undefined) ? true : count;
|
||||
}
|
||||
|
||||
let nextIndex = index + direction;
|
||||
let nextHeightCharacter = (isRow) ? line.charAt(nextIndex) : line[nextIndex].trim().charAt(rowIndex);
|
||||
let nextHeight = parseInt(nextHeightCharacter);
|
||||
|
||||
if (isNaN(height) || isNaN(nextHeightCharacter)) {
|
||||
console.error("Invalid height found, height:" + height + ", nextHeight: " + nextHeightCharacter);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (height <= nextHeight) {
|
||||
if (count == undefined)
|
||||
return false;
|
||||
return count + 1;
|
||||
}
|
||||
|
||||
return __walkHelper(height, nextIndex, line, isRow, direction, rowIndex, (count !=undefined)? count + 1 : undefined);
|
||||
}
|
||||
Reference in New Issue
Block a user