diff --git a/src/easy/3or5/solution.js b/src/easy/3or5/solution.js index e69de29..ba30f39 100644 --- a/src/easy/3or5/solution.js +++ b/src/easy/3or5/solution.js @@ -0,0 +1,8 @@ +var sum = 0 +for (var i = 1; i < 1000; i++){ + if (i % 3 === 0 || i % 5 === 0){ + sum += i; + } +} + +console.log("sum of all multiples of 3 or 5 below 1000 is : " + "" + sum ) \ No newline at end of file diff --git a/src/easy/digitCount/solution.js b/src/easy/digitCount/solution.js index e69de29..ee81e4b 100644 --- a/src/easy/digitCount/solution.js +++ b/src/easy/digitCount/solution.js @@ -0,0 +1,8 @@ +const Loza = ["3","4","5","6","8","9","0","10"] + +function countDigits(Loza){ + const numberAsString = Loza.toString(); + return numberAsString.length +} + +console.log(countDigits(Loza)) \ No newline at end of file diff --git a/src/easy/factorial/solution.js b/src/easy/factorial/solution.js index e69de29..b74da73 100644 --- a/src/easy/factorial/solution.js +++ b/src/easy/factorial/solution.js @@ -0,0 +1,13 @@ +function factorial(n) { + if (n === 0 || n === 1) { + return 1 + } else { + return n * factorial(n - 1) + } + } + + //`5! = 5 x 4 x 3 x 2 x 1 = 120` + const number = 5; + const result = factorial(number) + console.log(`${number}! = ${result}`) + \ No newline at end of file diff --git a/src/easy/makeSentence/solution.js b/src/easy/makeSentence/solution.js index e69de29..64bbd57 100644 --- a/src/easy/makeSentence/solution.js +++ b/src/easy/makeSentence/solution.js @@ -0,0 +1,24 @@ +function capitalizeAndAddPeriod(sentence) { + // Remove trailing whitespace + sentence = sentence.trim(); + + const lastChar = sentence.charAt(sentence.length - 1); + const punctuationRegex = /[.!?]/; + + + if (!punctuationRegex.test(lastChar)) { + sentence += '.'; + } + + // Capitalize the first letter + sentence = sentence.charAt(0).toUpperCase() + sentence.slice(1); + + return sentence; + } + + + //const inputSentence = "Given a sentence, capitalise the first letter and add a full stop to the end. However, if the sentence already ends with some form of puncutation, leave it as is."; + const inputSentence = "Loza is pretty" + const outputSentence = capitalizeAndAddPeriod(inputSentence); + console.log(outputSentence); + \ No newline at end of file diff --git a/src/easy/miles/solution.js b/src/easy/miles/solution.js index e69de29..a8992b2 100644 --- a/src/easy/miles/solution.js +++ b/src/easy/miles/solution.js @@ -0,0 +1,7 @@ +function kilometersToMiles(kilometers) { + const miles = kilometers / 1.6 // 1.6 kilometers in a mile + return Math.round(miles) + } + const kilometers = 25 + const miles = kilometersToMiles(kilometers) + console.log(`${kilometers} kilometers is approximately ${miles} miles.`) \ No newline at end of file diff --git a/src/easy/milesTravelled/solution.js b/src/easy/milesTravelled/solution.js index e69de29..9def636 100644 --- a/src/easy/milesTravelled/solution.js +++ b/src/easy/milesTravelled/solution.js @@ -0,0 +1,11 @@ +function calculateDistance(minutes, speed) { + const hours = minutes / 60 + const distance = speed * hours + const roundedDistance = Math.round(distance) + return roundedDistance + } + const travelDurationInMinutes = 100 + const speedInMph = 50 + const distance = calculateDistance(travelDurationInMinutes, speedInMph) + console.log(`Distance traveled: ${distance} miles.`) + \ No newline at end of file diff --git a/src/easy/multiples/solution.js b/src/easy/multiples/solution.js index e69de29..5aefec3 100644 --- a/src/easy/multiples/solution.js +++ b/src/easy/multiples/solution.js @@ -0,0 +1,11 @@ +function listMultiples(number, length) { + const multiples = [] + for (let i = 1; multiples.length < length; i++) { + multiples.push(number * i) + } + return multiples + } + console.log(listMultiples(7, 5)) // ➞ [7, 14, 21, 28, 35] + console.log(listMultiples(12, 10)) // ➞ [12, 24, 36, 48, 60, 72, 84, 96, 108, 120] + console.log(listMultiples(17, 6)) // ➞ [17, 34, 51, 68, 85, 102] + \ No newline at end of file diff --git a/src/easy/random/solution.js b/src/easy/random/solution.js index e69de29..409b1ac 100644 --- a/src/easy/random/solution.js +++ b/src/easy/random/solution.js @@ -0,0 +1,10 @@ +function getRandomNumber(min, max) { + const randomFraction = Math.random() + const randomInRange = min + randomFraction * (max - min) + return Math.round(randomInRange) + } + const min = 10 + const max = 20 + const randomValue = getRandomNumber(min, max) + console.log(randomValue) + \ No newline at end of file diff --git a/src/easy/range/solution.js b/src/easy/range/solution.js index e69de29..7ecc3e5 100644 --- a/src/easy/range/solution.js +++ b/src/easy/range/solution.js @@ -0,0 +1,12 @@ +function findDifference(numbers) { + if (numbers.length === 0) { + return 0 + } + const max = Math.max(...numbers) + const min = Math.min(...numbers) + return max - min + } + const numbers = [12, 5, 8, 24, 15, 3] + const difference = findDifference(numbers) + console.log(difference) // 21 + \ No newline at end of file diff --git a/src/easy/repeat/solution.js b/src/easy/repeat/solution.js index e69de29..eb5086c 100644 --- a/src/easy/repeat/solution.js +++ b/src/easy/repeat/solution.js @@ -0,0 +1,17 @@ +function doubleCharacters(inputString) { + let doubledString = "" + for (let i = 0; i < inputString.length; i++) { + doubledString += inputString[i] + inputString[i] + } + return doubledString + } + const input1 = "String" + const result1 = doubleCharacters(input1) + console.log(result1) + const input2 = "Hello World!" + const result2 = doubleCharacters(input2) + console.log(result2) + const input3 = "1234!_ " + const result3 = doubleCharacters(input3) + console.log(result3) + \ No newline at end of file diff --git a/src/easy/reverse/solution.js b/src/easy/reverse/solution.js index e69de29..3109bf8 100644 --- a/src/easy/reverse/solution.js +++ b/src/easy/reverse/solution.js @@ -0,0 +1,7 @@ +function reverseString(inputString) { + return inputString.split('').reverse().join('') + } + console.log(reverseString("String")) + console.log(reverseString("123")) + console.log(reverseString("#!@")) + \ No newline at end of file diff --git a/src/easy/scores/solution.js b/src/easy/scores/solution.js index d15e3db..bcb6691 100644 --- a/src/easy/scores/solution.js +++ b/src/easy/scores/solution.js @@ -1,6 +1,5 @@ const ratingsAdjuster = (ratings, minThreshold, maxThreshold) => { - const adjustedRatings = [...ratings]; - + const adjustedRatings = [...ratings] for( let i = 0; i < adjustedRatings.length; i++ ) { if ( ratings[i] < minThreshold) { adjustedRatings[i] = minThreshold @@ -8,11 +7,9 @@ const ratingsAdjuster = (ratings, minThreshold, maxThreshold) => { adjustedRatings[i] = maxThreshold } } - return adjustedRatings; + return adjustedRatings } - -const ratings = [1,3,5,7,9]; -const min = 3; -const max = 7; - -console.log(ratingsAdjuster(ratings, min, max)); +const ratings = [1,3,5,7,9] +const min = 3 +const max = 7 +console.log(ratingsAdjuster(ratings, min, max)) // 3 , 3 5 , 7 ,7 diff --git a/src/easy/secondsInHours/solution.js b/src/easy/secondsInHours/solution.js index e69de29..18c33a7 100644 --- a/src/easy/secondsInHours/solution.js +++ b/src/easy/secondsInHours/solution.js @@ -0,0 +1,7 @@ +function hoursToSeconds(hours) { + return hours * 3600// 1 hour = 3600 seconds + } + const hours = 15 + const seconds = hoursToSeconds(hours) + console.log(seconds) // Output: 18000 seconds (15 hours * 3600 seconds/hour) + \ No newline at end of file diff --git a/src/easy/sum/solution.js b/src/easy/sum/solution.js index e69de29..dbe5625 100644 --- a/src/easy/sum/solution.js +++ b/src/easy/sum/solution.js @@ -0,0 +1,10 @@ +function sumNumbersFrom1To100() { + let sum = 0 + for (let i = 1; i <= 100; i++) { + sum += i + } + return sum + } + const result = sumNumbersFrom1To100() + console.log(result) + \ No newline at end of file diff --git a/src/easy/sumOfCubes/solution.js b/src/easy/sumOfCubes/solution.js index e69de29..e3af997 100644 --- a/src/easy/sumOfCubes/solution.js +++ b/src/easy/sumOfCubes/solution.js @@ -0,0 +1,18 @@ +function sumOfCubes(numbers) { + let sum = 0 + + for (let i = 0; i < numbers.length; i++) { + const cube = Math.pow(numbers[i], 3) + sum += cube + } + return sum + } + const list1 = [1, 5, 9] + const list2 = [3, 4, 5] + const list3 = [2] + const list4 = [] + console.log(sumOfCubes(list1)) // Output: 855 + console.log(sumOfCubes(list2)) // Output: 216 + console.log(sumOfCubes(list3)) // Output: 8 + console.log(sumOfCubes(list4))// Output: 0 + \ No newline at end of file diff --git a/src/easy/timesTables/solution.js b/src/easy/timesTables/solution.js index e69de29..aaeb5bd 100644 --- a/src/easy/timesTables/solution.js +++ b/src/easy/timesTables/solution.js @@ -0,0 +1,23 @@ +function generateMultiplicationTables() { + const table = [] + + for (let i = 1; i <= 12; i++) { + const row = [] + + for (let j = 1; j <= 12; j++) { + row.push(i * j) + } + table.push(row) + } + return table + } + function displayMultiplicationTable(table) { + for (let i = 1; i <= 12; i++) { + const row = table[i - 1].join(' | ') + console.log(`\n${i} times table`) + console.log(`| ${row} |`) + } + } + const multiplicationTable = generateMultiplicationTables() + displayMultiplicationTable(multiplicationTable) + \ No newline at end of file diff --git a/src/hard/castles/solution.js b/src/hard/castles/solution.js index e69de29..3194312 100644 --- a/src/hard/castles/solution.js +++ b/src/hard/castles/solution.js @@ -0,0 +1,74 @@ +const totalCastles = 5 +const roomsPerCastle = 7 +const totalRooms = totalCastles * roomsPerCastle +const maxLives = 9 +const treasures = [] +const creatures = [] +const treasurePoints = [10, 20, 30, 40, 50] +const bluffSuccessRate = 0.3 + +for (let i = 0; i < totalRooms; i++) { + treasures.push(treasurePoints[Math.floor(Math.random() * treasurePoints.length)]) + creatures.push(Math.random()) +} + +let playerLives = maxLives +let playerScore = 0 +let currentRoom = 0 + +function bluff() { + return Math.random() < bluffSuccessRate +} + +function fight(creature) { + const fightSuccessRate = 1 - creature + return Math.random() < fightSuccessRate +} + +const readline = require('readline') + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout +}) + +function playGame() { + if (currentRoom < totalRooms && playerLives > 0) { + console.log(`You are in room ${currentRoom + 1} of ${totalRooms}.`) + console.log(`You have ${playerLives} lives and ${playerScore} points.`) + + rl.question("Do you want to (b)luff or (f)ight? ", (decision) => { + if (decision.toLowerCase() === "b") { + if (bluff()) { + console.log("Bluff successful! You capture the treasure.") + playerScore += treasures[currentRoom] + } else { + console.log("Bluff failed. The creature attacks!") + playerLives-- + } + } else if (decision.toLowerCase() === "f") { + if (fight(creatures[currentRoom])) { + console.log("You defeat the creature and capture the treasure.") + playerScore += treasures[currentRoom] + } else { + console.log("You lost the fight. The creature overpowers you.") + playerLives-- + } + } else { + console.log("Invalid input. Please enter 'b' for bluff or 'f' for fight.") + } + + currentRoom++ + playGame() + }) + } else { + rl.close() + if (playerLives === 0) { + console.log("Game over! You have run out of lives.") + } else { + console.log(`Congratulations! You collected ${playerScore} points.`) + } + } +} + +playGame() diff --git a/src/hard/disarium/solution.js b/src/hard/disarium/solution.js index e69de29..3194312 100644 --- a/src/hard/disarium/solution.js +++ b/src/hard/disarium/solution.js @@ -0,0 +1,74 @@ +const totalCastles = 5 +const roomsPerCastle = 7 +const totalRooms = totalCastles * roomsPerCastle +const maxLives = 9 +const treasures = [] +const creatures = [] +const treasurePoints = [10, 20, 30, 40, 50] +const bluffSuccessRate = 0.3 + +for (let i = 0; i < totalRooms; i++) { + treasures.push(treasurePoints[Math.floor(Math.random() * treasurePoints.length)]) + creatures.push(Math.random()) +} + +let playerLives = maxLives +let playerScore = 0 +let currentRoom = 0 + +function bluff() { + return Math.random() < bluffSuccessRate +} + +function fight(creature) { + const fightSuccessRate = 1 - creature + return Math.random() < fightSuccessRate +} + +const readline = require('readline') + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout +}) + +function playGame() { + if (currentRoom < totalRooms && playerLives > 0) { + console.log(`You are in room ${currentRoom + 1} of ${totalRooms}.`) + console.log(`You have ${playerLives} lives and ${playerScore} points.`) + + rl.question("Do you want to (b)luff or (f)ight? ", (decision) => { + if (decision.toLowerCase() === "b") { + if (bluff()) { + console.log("Bluff successful! You capture the treasure.") + playerScore += treasures[currentRoom] + } else { + console.log("Bluff failed. The creature attacks!") + playerLives-- + } + } else if (decision.toLowerCase() === "f") { + if (fight(creatures[currentRoom])) { + console.log("You defeat the creature and capture the treasure.") + playerScore += treasures[currentRoom] + } else { + console.log("You lost the fight. The creature overpowers you.") + playerLives-- + } + } else { + console.log("Invalid input. Please enter 'b' for bluff or 'f' for fight.") + } + + currentRoom++ + playGame() + }) + } else { + rl.close() + if (playerLives === 0) { + console.log("Game over! You have run out of lives.") + } else { + console.log(`Congratulations! You collected ${playerScore} points.`) + } + } +} + +playGame() diff --git a/src/hard/equations/solution.js b/src/hard/equations/solution.js index e69de29..3194312 100644 --- a/src/hard/equations/solution.js +++ b/src/hard/equations/solution.js @@ -0,0 +1,74 @@ +const totalCastles = 5 +const roomsPerCastle = 7 +const totalRooms = totalCastles * roomsPerCastle +const maxLives = 9 +const treasures = [] +const creatures = [] +const treasurePoints = [10, 20, 30, 40, 50] +const bluffSuccessRate = 0.3 + +for (let i = 0; i < totalRooms; i++) { + treasures.push(treasurePoints[Math.floor(Math.random() * treasurePoints.length)]) + creatures.push(Math.random()) +} + +let playerLives = maxLives +let playerScore = 0 +let currentRoom = 0 + +function bluff() { + return Math.random() < bluffSuccessRate +} + +function fight(creature) { + const fightSuccessRate = 1 - creature + return Math.random() < fightSuccessRate +} + +const readline = require('readline') + +const rl = readline.createInterface({ + input: process.stdin, + output: process.stdout +}) + +function playGame() { + if (currentRoom < totalRooms && playerLives > 0) { + console.log(`You are in room ${currentRoom + 1} of ${totalRooms}.`) + console.log(`You have ${playerLives} lives and ${playerScore} points.`) + + rl.question("Do you want to (b)luff or (f)ight? ", (decision) => { + if (decision.toLowerCase() === "b") { + if (bluff()) { + console.log("Bluff successful! You capture the treasure.") + playerScore += treasures[currentRoom] + } else { + console.log("Bluff failed. The creature attacks!") + playerLives-- + } + } else if (decision.toLowerCase() === "f") { + if (fight(creatures[currentRoom])) { + console.log("You defeat the creature and capture the treasure.") + playerScore += treasures[currentRoom] + } else { + console.log("You lost the fight. The creature overpowers you.") + playerLives-- + } + } else { + console.log("Invalid input. Please enter 'b' for bluff or 'f' for fight.") + } + + currentRoom++ + playGame() + }) + } else { + rl.close() + if (playerLives === 0) { + console.log("Game over! You have run out of lives.") + } else { + console.log(`Congratulations! You collected ${playerScore} points.`) + } + } +} + +playGame() diff --git a/src/hard/suDoku/solution.js b/src/hard/suDoku/solution.js index e69de29..7a534ad 100644 --- a/src/hard/suDoku/solution.js +++ b/src/hard/suDoku/solution.js @@ -0,0 +1,98 @@ +const fs = require('fs') + +function printGrid(grid) { + for (let row of grid) { + console.log(row.join(' ')) + } +} + +function isSafe(grid, row, col, num) { + return ( + !usedInRow(grid, row, num) && + !usedInColumn(grid, col, num) && + !usedInBox(grid, row - (row % 3), col - (col % 3), num) + ) +} + +function usedInRow(grid, row, num) { + return grid[row].includes(num) +} + +function usedInColumn(grid, col, num) { + for (let i = 0; i < 9; i++) { + if (grid[i][col] === num) { + return true + } + } + return false +} + +function usedInBox(grid, boxStartRow, boxStartCol, num) { + for (let i = 0; i < 3; i++) { + for (let j = 0; j < 3; j++) { + if (grid[i + boxStartRow][j + boxStartCol] === num) { + return true + } + } + } + return false +} + +function findEmptyLocation(grid, location) { + for (let row = 0; row < 9; row++) { + for (let col = 0; col < 9; col++) { + if (grid[row][col] === 0) { + location[0] = row + location[1] = col + return true + } + } + } + return false +} + +function solveSudoku(grid) { + const location = [0, 0] + if (!findEmptyLocation(grid, location)) { + return true // No empty location, puzzle solved + } + const [row, col] = location + + for (let num = 1; num <= 9; num++) { + if (isSafe(grid, row, col, num)) { + grid[row][col] = num + + if (solveSudoku(grid)) { + return true + } + + grid[row][col] = 0 + } + } + + return false +} + +function solveSudokuPuzzle(puzzle) { + const grid = puzzle.map((row) => row.split('').map(Number)) + if (solveSudoku(grid)) { + return grid.map((row) => row.join('')) + } + return null +} + +const puzzles = fs + .readFileSync('/js-problems/src/hard/suDoku/data/sudoku.txt', 'utf-8') + .split('\n') + .filter((line) => line.trim().length === 9) + +for (let i = 0; i < puzzles.length; i += 9) { + const puzzle = puzzles.slice(i, i + 9) + const solution = solveSudokuPuzzle(puzzle) + if (solution) { + console.log(`Sudoku Puzzle #${i / 9 + 1} Solution:`) + printGrid(solution) + } else { + console.log(`Sudoku Puzzle #${i / 9 + 1} has no solution.`) + } +}