1 Commits

Author SHA1 Message Date
7a3dd6bcde Assignment on my birthday 2022-12-06 17:26:38 +01:00
3 changed files with 28 additions and 130 deletions

View File

@@ -1,12 +1,5 @@
# Advent of Code 2022 - Assignment3 javascript solution # Advent of Code 2022 - Assignment6_javascript
This problem is all about searching for duplicates in strings. The solution is implemented using slice to split the string in half. This repository contains answers to the assignments of Advent of Coding 2022
The priority is retrieved using the ASCII charcode character for convienence. How to retrieve inputs differs between part1 and 2, therefore a checkbox is provided to toggle between different parsing methods.
## References ## References
- https://stackoverflow.com/questions/94037/convert-character-to-ascii-code-in-javascript - https://stackoverflow.com/questions/28207610/checking-if-the-characters-in-a-string-are-all-unique
- https://stackoverflow.com/questions/20474257/split-string-into-two-parts
- https://www.folkstalk.com/2022/10/find-common-characters-in-two-strings-javascript-with-code-examples.html
- https://stackoverflow.com/questions/351409/how-to-append-something-to-an-array
- https://stackoverflow.com/questions/9862761/how-to-check-if-character-is-a-letter-in-javascript
- https://stackoverflow.com/questions/1966476/how-can-i-process-each-letter-of-text-using-javascript
- https://www.w3schools.com/js/js_arrays.asp

View File

@@ -8,9 +8,9 @@
<body> <body>
<p>Assignment:</p> <p>Assignment:</p>
<textarea rows="15" cols="50" id="assignment"></textarea> <textarea rows="15" cols="50" id="assignment"></textarea>
<input type="checkbox" id="algorithm"/> <input type="checkbox" id="algorithm" />
<label for="algorithm">Solution by compartiment.</label> <label for="algorithm">Search for message marker?</label>
<p>Answer:</p> <p>Answer:</p>
<div id="answer">Provide input first</div> <div id="answer">Provide input first</div>
<script src="script.js"></script> <script src="script.js"></script>

139
script.js
View File

@@ -1,18 +1,16 @@
const ASSIGNMENT = 'assignment'; const ASSIGNMENT = 'assignment';
const ANSWER = 'answer'; const ANSWER = 'answer';
const ALGORITHM_CHECKBOX = 'algorithm'; const ALGORITHM_CHECKBOX = 'algorithm';
const CHARCODE_START=64; const MARKER_DISTINCT_CHARACTERS = 4;
const CHARCODE_UPPER_CORRECTION=6; const MESSAGE_DISTINCT_CHARACTERS = 14;
const ERROR_MESSAGE_INVALID_INPUT_SIZE = "Invalid input size, should be higher than 2 for: ";
const ERROR_MESSAGE_INVALID_ITEM_CHARACTER = "Invalid item character found: ";
const NEWLINE_CHARACTER = '\n'; const NEWLINE_CHARACTER = '\n';
/** /**
* Main function * Main function
*/ */
window.onload = function() { window.onload = function() {
document.getElementById(ASSIGNMENT).addEventListener("input", calculateAnswer); document.getElementById(ASSIGNMENT).addEventListener("input", calculateAnswer);
document.getElementById(ALGORITHM_CHECKBOX).addEventListener("click", calculateAnswer); document.getElementById(ALGORITHM_CHECKBOX).addEventListener("click", calculateAnswer);
} }
/** /**
@@ -22,8 +20,8 @@ window.onload = function() {
function calculateAnswer(event) { function calculateAnswer(event) {
console.info("Calculating answer for input..."); console.info("Calculating answer for input...");
let assignment = document.getElementById(ASSIGNMENT).value; let assignment = document.getElementById(ASSIGNMENT).value;
let byCompartiments = document.getElementById(ALGORITHM_CHECKBOX).checked; let distinctCharacters = (document.getElementById(ALGORITHM_CHECKBOX).checked)? MESSAGE_DISTINCT_CHARACTERS: MARKER_DISTINCT_CHARACTERS;
let answer = algorithm(assignment, byCompartiments); let answer = algorithm(assignment, distinctCharacters);
document.getElementById(ANSWER).innerText = answer; document.getElementById(ANSWER).innerText = answer;
} }
@@ -33,121 +31,28 @@ function calculateAnswer(event) {
* @param assignment the input from the assignment. * @param assignment the input from the assignment.
* @return string the answer * @return string the answer
*/ */
function algorithm(assignment, byCompartiments) { function algorithm(assignment, distinctCharacters) {
let priorityScoreSum = 0; let signal = assignment.trim();
let lines = assignment.trim().split(NEWLINE_CHARACTER); let marker = assignment.substring(0,distinctCharacters);
console.info("Linecount:" + lines.length);
let increment = (byCompartiments)? 1:3; for(let i=distinctCharacters; i<signal.length; i++) {
for(let i=0; i<lines.length; i+=increment) { if(containsDistinctCharacters(marker)) {
let inputs = []; console.debug("Found marker after:" + i + " characters");
let rucksack = lines[i].replace(/\s/g, ''); // Remove whitespace return "Marker found after processing: " + i + " characters.";
}
if(byCompartiments) { marker = marker.substring(1, distinctCharacters) + assignment[i];
let compartiment1 = rucksack.slice(0, rucksack.length/2);
let compartiment2 = rucksack.slice(rucksack.length/2);
inputs = [compartiment1, compartiment2];
} else {
inputs = [rucksack, lines[i+1].replace(/\s/g, ''), lines[i+2].replace(/\s/g, '')];
}
let duplicate = getDuplicateCharacter(inputs);
if(duplicate < 0) {
console.error(ERROR_MESSAGE_INVALID_INPUT_SIZE + inputs + " on line: " + i);
}
let priorityScore = getPriorityScore(duplicate);
if(priorityScore < 0) {
console.error(ERROR_MESSAGE_INVALID_ITEM_CHARACTER + duplicate + " on line: " + i);
continue;
}
priorityScoreSum += priorityScore;
} }
return "SUM priorityscore: " + priorityScoreSum; return "No marker found.";
} }
/** /**
* Calculate the answer to assignment. * Check if string only contains distinct characters.
* @param assignment the input from the assignment. * @param String string the string to check
* @return string the answer * @return true, if string contains only distinct characters
*/ */
function algorithm1(assignment) { function containsDistinctCharacters(string) {
let priorityScoreSum = 0; console.debug("Check marker: " + string);
let lines = assignment.trim().split(NEWLINE_CHARACTER); return new Set(string).size == string.length;
console.info("Linecount:" + lines.length);
for(let i=0; i<lines.length; i++) {
let rucksack = lines[i].replace(/\s/g, ''); // Remove whitespace
let compartiment1 = rucksack.slice(0, rucksack.length/2);
let compartiment2 = rucksack.slice(rucksack.length/2);
console.debug("Check rucksack" + i, ": " + rucksack + " \n with compartiment1: " + compartiment1 + "\n and compartiment2: " + compartiment2);
for(item of compartiment2) {
if(compartiment1.includes(item)) {
console.debug("Found duplicate: " + item + " in rucksack" + i);
let priorityScore = getPriorityScore(item);
if(priorityScore < 0) {
console.error(ERROR_MESSAGE_INVALID_ITEM_CHARACTER + item + " on line: " + i);
continue;
}
priorityScoreSum += priorityScore;
break;
}
}
}
return "SUM priorityscore: " + priorityScoreSum;
}
/**
* Find duplicate character in inputs.
* @param string[] inputs the inputs to find duplicates in.
* @return char the duplicate character
*/
function getDuplicateCharacter(inputs) {
console.debug("Checking inputs: " + inputs);
if(inputs.length < 2) {
return -1;
}
for(let item of inputs[0]) {
let duplicate = true
for(let j=1; j<inputs.length; j++) {
duplicate = duplicate && inputs[j].includes(item);
}
if(duplicate) {
console.debug("Found duplicate: " + item);
return item;
}
}
}
/**
* Returns priorityscore for given character.
* @param char character the character
* @return int the priorityscore for character or -1 if invalid
*/
function getPriorityScore(character) {
let result=0;
let uppercase = character.toUpperCase();
let lowercase = character.toLowerCase();
// validate character
if( uppercase == lowercase ) {
return -1;
}
if(character == uppercase) { // Switch results for upper and lowercase characters
result -= CHARCODE_UPPER_CORRECTION;
character = lowercase;
} else {
character = uppercase;
}
result += character.charCodeAt() - CHARCODE_START;
return result;
} }