diff --git a/README.md b/README.md index da57339..0d5d57c 100644 --- a/README.md +++ b/README.md @@ -1 +1,14 @@ +# Advent of Code - assignment 9 javascript This repository contains answers to the assignments of Advent of Coding 2022 + +## References +- https://betterprogramming.pub/tuples-in-javascript-57ede9b1c9d2 +- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Array/length +- https://www.javascripttutorial.net/javascript-multidimensional-array/ +- https://flaviocopes.com/how-to-replace-whitespace-javascript/ +- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/parseInt +- https://www.sohamkamani.com/javascript/enums/ +- https://www.w3schools.com/js/js_switch.asp +- https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Math/sign +- https://stackoverflow.com/questions/4564414/delete-first-character-of-string-if-it-is-0 +- https://stackoverflow.com/questions/1959040/is-it-possible-to-send-a-variable-number-of-arguments-to-a-javascript-function \ No newline at end of file diff --git a/script.js b/script.js index a6e2848..012881c 100644 --- a/script.js +++ b/script.js @@ -9,6 +9,127 @@ window.onload = function() { document.getElementById(ASSIGNMENT).addEventListener("input", calculateAnswer); } +const DIRECTIONS = { + UP: 'U', + DOWN: 'D', + LEFT: 'L', + RIGHT: 'R' +}; + +class Knot { + constructor(x, y) { + this.x=x; + this.y=y; + } +} +/*class Rope { + constructor(headX, headY, tailX, tailY) { + this.headX = headX; + this.headY = headY; + this.tailX = tailX; + this.tailY = tailY; + console.info("Created Rope with head:" + headX + "," + headY + " and tail: " + tailX + "," + tailY); + } + + step = function (direction) { + let oldHeadX = this.headX; + let oldHeadY = this.headY; + switch (direction) { + case DIRECTIONS.UP: + this.headY++; + break; + case DIRECTIONS.DOWN: + this.headY--; + break; + case DIRECTIONS.LEFT: + this.headX--; + break; + case DIRECTIONS.RIGHT: + this.headX++; + break; + default: + console.error("Invalid direction given: " + direction); + } + this.__correctTail(oldHeadX, oldHeadY); + } + + getTailPosition = function () { + return "" + this.tailX + "," + this.tailY; + } + + __correctTail = function (oldHeadX, oldHeadY) { + let absoluteDifferenceX = Math.abs(this.headX - this.tailX); + let absoluteDifferenceY = Math.abs(this.headY - this.tailY); + + if (absoluteDifferenceX > 1 || absoluteDifferenceY > 1) { + this.tailX = oldHeadX; + this.tailY = oldHeadY; + console.debug("Corrected tail Position: (" + this.tailX + ", " + this.tailY + "), head position: (" + this.headX + ", " + this.headY + ")"); + } + } +};*/ +class Rope { + constructor(count) { + if(count < 2) { + console.error("Rope needs at least 2 knots."); + return; + } + + let knots = []; + while(count > 0) { + knots.push(new Knot(0,0)); + count--; + } + + this.head = knots[0]; + this.knots = Array.from(knots).slice(1); + this.tail = this.knots[this.knots.length-1]; + console.info("Created Rope with " + knots.length + " knots."); + } + + step = function(direction) { + let oldHeadX = this.head.x; + let oldHeadY = this.head.y; + switch(direction) { + case DIRECTIONS.UP: + this.head.y++; + break; + case DIRECTIONS.DOWN: + this.head.y--; + break; + case DIRECTIONS.LEFT: + this.head.x--; + break; + case DIRECTIONS.RIGHT: + this.head.x++; + break; + default: + console.error("Invalid direction given: " + direction); + } + this.__correctTails(oldHeadX, oldHeadY, this.head, this.knots[0], this.knots.slice(1)); + } + + getTailPosition = function() { + return "" + this.tail.x + "," + this.tail.y; + } + + __correctTails = function(oldHeadX, oldHeadY, head, tail, tails) { + let absoluteDifferenceX = Math.abs(head.x - tail.x); + let absoluteDifferenceY = Math.abs(head.y - tail.y); + let oldTailX = tail.x; + let oldTailY = tail.y; + + if(absoluteDifferenceX > 1 || absoluteDifferenceY > 1) { + tail.x = oldHeadX; + tail.y = oldHeadY; + console.debug("Corrected tail Position: (" + this.tail.x + ", " + this.tail.y + "), head position: (" + this.head.x + ", " + this.head.y + ")"); + } + + if(tails.length > 0) + this.__correctTails(oldTailX, oldTailY, tail, tails[0], tails.slice(1)); + } +}; + /** * Listener function for input in assignment field. * @param event the onInput event @@ -29,5 +150,30 @@ function algorithm(assignment) { let lines = assignment.trim().split(NEWLINE_CHARACTER); console.info("Linecount:" + lines.length); - // TODO: implement assignment + let rope = new Rope(10); + let visitedPositions = [rope.getTailPosition()]; + + for(let i=0; i 0) { + rope.step(direction); + let tailPosition = rope.getTailPosition(); + + if(!visitedPositions.includes(tailPosition) ) { // Add only unique tailpositions + visitedPositions.push(tailPosition); + } + + count--; + } + } + + console.log(visitedPositions); + return "Amount of positions for tail: " + visitedPositions.length; } \ No newline at end of file