initial upload
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
two1nine
|
||||
eightwothree
|
||||
abcone2threexyz
|
||||
xtwone3four
|
||||
4nineeightseven2
|
||||
zoneight234
|
||||
7pqrstsixteen
|
||||
@@ -0,0 +1,27 @@
|
||||
import fs from 'node:fs'
|
||||
const numberphiles = new Map([
|
||||
["one", 1],
|
||||
["two", 2],
|
||||
["three", 3],
|
||||
["four", 4],
|
||||
["five", 5],
|
||||
["six", 6],
|
||||
["seven", 7],
|
||||
["eight", 8],
|
||||
["nine", 9]
|
||||
])
|
||||
|
||||
fs.readFile('input.txt', ({ encoding: 'utf-8' }), (err, data) => {
|
||||
const regex1 = /(\d)/gm
|
||||
// let [first, last] = [matches[0], matches[matches.length-1]]
|
||||
const regex = /(?=(one|two|three|four|five|six|seven|eight|nine|\d))/gm
|
||||
let result = 0
|
||||
for (let line of data.split('\n')) {
|
||||
const matches = [...line.matchAll(regex)]
|
||||
let [first, last] = [matches[0][1], matches[matches.length - 1][1]]
|
||||
first = numberphiles.has(first) ? numberphiles.get(first) : first
|
||||
last = numberphiles.has(last) ? numberphiles.get(last) : last
|
||||
result += parseInt(`${first}${last} `)
|
||||
}
|
||||
console.log(result)
|
||||
})
|
||||
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,5 @@
|
||||
Game 1: 3 blue, 4 red; 1 red, 2 green, 6 blue; 2 green
|
||||
Game 2: 1 blue, 2 green; 3 green, 4 blue, 1 red; 1 green, 1 blue
|
||||
Game 3: 8 green, 6 blue, 20 red; 5 blue, 4 red, 13 green; 5 green, 1 red
|
||||
Game 4: 1 green, 3 red, 6 blue; 3 green, 6 red; 3 green, 15 blue, 14 red
|
||||
Game 5: 6 red, 1 blue, 3 green; 2 blue, 1 red, 2 green
|
||||
@@ -0,0 +1,70 @@
|
||||
import fs from 'node:fs'
|
||||
const numberphiles = new Map([
|
||||
["red", 12],
|
||||
["blue", 14],
|
||||
["green", 13],
|
||||
])
|
||||
|
||||
fs.readFile('input.txt', ({ encoding: 'utf-8' }), (err, data) => {
|
||||
let result = 0
|
||||
for (let line of data.split('\n')) {
|
||||
const game_id = parseInt(String(line.split(':')[0]).substring(5))
|
||||
const game = line.split(':')[1].split(',')
|
||||
result += isGamePossible(game) ? game_id : 0
|
||||
}
|
||||
console.log(`
|
||||
|
||||
Part 1 now....
|
||||
|
||||
`)
|
||||
console.log(result)
|
||||
|
||||
function isGamePossible(game) {
|
||||
let possible = true
|
||||
game.forEach(game => {
|
||||
const rounds = game.trim().split(";")
|
||||
//console.log(rounds)
|
||||
rounds.forEach(round => {
|
||||
const [number, color] = round.trim().split(" ")
|
||||
if (number > numberphiles.get(color)) possible = false
|
||||
})
|
||||
})
|
||||
return possible
|
||||
}
|
||||
})
|
||||
|
||||
// ---- part 2 -----
|
||||
|
||||
fs.readFile('input.txt', ({ encoding: 'utf-8' }), (err, data) => {
|
||||
let result = 0
|
||||
for (let line of data.split('\n')) {
|
||||
const game_id = parseInt(String(line.split(':')[0]).substring(5))
|
||||
const game = line.split(':')[1].split(',')
|
||||
result += ([...leastPossible(game).values()].reduce((cur, next) => cur * next))
|
||||
}
|
||||
console.log(`
|
||||
|
||||
Part 2 now....
|
||||
|
||||
`)
|
||||
console.log(result)
|
||||
|
||||
function leastPossible(game) {
|
||||
let possible = true
|
||||
let GameMap = new Map()
|
||||
game.forEach(game => {
|
||||
|
||||
const rounds = game.trim().split(";")
|
||||
//console.log(rounds)
|
||||
rounds.forEach(round => {
|
||||
const [number, color] = round.trim().split(" ")
|
||||
let leastNumber = parseInt(number)
|
||||
if (GameMap.has(color)) {
|
||||
leastNumber = GameMap.get(color) > number ? GameMap.get(color) : leastNumber
|
||||
}
|
||||
GameMap.set(color, leastNumber)
|
||||
})
|
||||
})
|
||||
return GameMap
|
||||
}
|
||||
})
|
||||
@@ -0,0 +1,100 @@
|
||||
Game 1: 4 red, 3 blue; 6 blue, 16 green; 9 blue, 13 green, 1 red; 10 green, 4 red, 6 blue
|
||||
Game 2: 2 green, 3 blue; 11 red; 2 green, 5 red, 1 blue
|
||||
Game 3: 19 green, 4 blue, 13 red; 1 green, 1 blue, 1 red; 17 red, 18 green
|
||||
Game 4: 4 green, 8 blue, 20 red; 19 red, 3 green, 14 blue; 15 red, 4 green, 1 blue; 18 blue, 14 red; 19 red, 10 blue; 3 green, 11 blue, 15 red
|
||||
Game 5: 1 red, 3 blue, 15 green; 13 green, 2 blue; 6 green; 6 green, 8 blue; 4 green, 9 blue, 1 red
|
||||
Game 6: 2 green, 10 red; 4 blue, 1 red, 2 green; 2 red, 2 blue, 1 green; 5 red, 3 green, 1 blue
|
||||
Game 7: 4 green, 2 blue, 10 red; 1 green, 12 red; 5 green, 12 red, 2 blue; 10 red, 1 blue, 5 green; 1 green, 1 blue, 11 red
|
||||
Game 8: 8 blue, 3 red, 1 green; 9 blue, 14 green, 6 red; 3 red, 15 blue, 16 green; 9 red, 4 green, 6 blue
|
||||
Game 9: 9 blue, 9 red, 5 green; 6 red, 1 green, 12 blue; 7 blue, 3 green; 4 red, 12 blue, 1 green; 5 red, 4 green, 1 blue
|
||||
Game 10: 1 blue, 2 red, 19 green; 7 green, 5 blue, 7 red; 2 blue, 1 red, 3 green; 2 blue, 9 red, 10 green
|
||||
Game 11: 2 red, 17 blue, 12 green; 5 green, 3 blue; 14 green, 2 red, 15 blue
|
||||
Game 12: 4 blue, 13 green, 1 red; 5 blue, 3 green, 4 red; 8 blue, 15 green; 12 blue, 5 red, 6 green; 2 green, 5 blue, 4 red; 11 blue, 18 green, 4 red
|
||||
Game 13: 8 blue, 11 red, 2 green; 18 red, 7 blue, 7 green; 6 green, 9 red; 7 green, 3 blue, 12 red; 1 green, 4 red, 4 blue
|
||||
Game 14: 3 green, 11 blue, 1 red; 3 green, 1 red, 13 blue; 5 green, 6 blue, 1 red; 1 red, 5 blue, 5 green; 10 blue, 2 green
|
||||
Game 15: 3 red, 8 green, 1 blue; 8 green, 10 red, 3 blue; 1 blue, 4 green, 2 red; 10 red, 10 green; 3 blue, 4 green, 3 red; 12 green, 7 red
|
||||
Game 16: 13 red, 9 blue; 2 green, 7 red, 7 blue; 9 blue, 7 red, 7 green; 13 blue, 10 red
|
||||
Game 17: 12 red, 19 green, 4 blue; 2 blue, 5 red, 11 green; 4 red, 7 green, 8 blue; 6 red, 10 green; 3 green, 7 red, 10 blue
|
||||
Game 18: 2 blue, 6 red; 5 red, 3 green; 12 red, 1 blue, 3 green; 1 green, 19 red, 5 blue; 3 green, 2 blue, 16 red
|
||||
Game 19: 10 red, 5 green; 10 red; 9 red, 7 blue; 1 blue, 8 red
|
||||
Game 20: 11 green, 5 red, 7 blue; 7 green, 12 red, 11 blue; 13 green, 3 blue, 5 red; 3 red, 3 blue, 1 green
|
||||
Game 21: 10 blue, 10 green, 2 red; 16 blue, 9 green, 1 red; 3 green, 1 blue, 2 red; 17 green, 5 blue, 2 red; 6 blue, 15 green, 2 red
|
||||
Game 22: 2 red, 1 blue, 5 green; 4 blue, 3 red, 6 green; 3 red, 4 blue; 4 blue, 1 green, 1 red; 3 blue, 3 red, 5 green
|
||||
Game 23: 3 red, 7 green; 17 green, 7 red, 5 blue; 4 blue, 4 red; 19 green, 3 red, 9 blue; 3 green, 3 blue, 6 red; 9 red, 7 green, 6 blue
|
||||
Game 24: 2 red, 14 green, 8 blue; 6 red, 12 blue, 15 green; 1 green, 10 red; 3 red, 7 blue, 15 green; 11 red, 13 blue; 1 green, 9 blue, 10 red
|
||||
Game 25: 12 blue, 7 red, 7 green; 2 red, 10 green, 9 blue; 11 blue, 6 green, 6 red; 6 blue, 6 green; 4 red, 8 blue, 2 green; 6 green, 4 blue, 3 red
|
||||
Game 26: 2 blue, 5 red; 9 red, 1 green; 16 red, 2 blue; 4 blue, 1 green, 5 red
|
||||
Game 27: 12 green, 12 red; 15 green, 11 red; 7 red, 19 green; 1 blue, 2 green, 3 red
|
||||
Game 28: 4 blue, 4 green, 7 red; 6 green, 9 red, 10 blue; 5 red, 4 blue, 9 green; 9 red, 6 blue, 2 green
|
||||
Game 29: 1 blue, 3 green, 9 red; 5 green; 3 green, 2 red
|
||||
Game 30: 1 blue, 5 green, 3 red; 2 green, 1 blue, 3 red; 12 green, 4 red; 5 green, 2 red; 8 green, 4 red, 1 blue; 6 green
|
||||
Game 31: 9 blue, 5 green; 3 red, 11 blue, 2 green; 1 green, 4 blue, 2 red; 1 green, 3 blue, 1 red; 11 blue, 5 green
|
||||
Game 32: 3 red, 1 blue, 16 green; 11 green, 4 blue; 2 blue, 4 green, 2 red
|
||||
Game 33: 4 blue, 15 green; 6 green, 11 blue; 5 blue, 1 red, 13 green; 14 green, 1 red, 5 blue; 1 red, 4 blue, 14 green
|
||||
Game 34: 2 green, 10 red, 2 blue; 8 red, 10 green; 3 green, 1 blue, 1 red
|
||||
Game 35: 3 blue, 7 green, 10 red; 4 red, 9 blue; 8 blue, 7 green, 4 red; 2 green, 7 red, 3 blue
|
||||
Game 36: 2 green, 4 red, 4 blue; 1 blue, 6 red; 7 green, 10 red; 10 red, 3 blue
|
||||
Game 37: 1 green, 1 red; 1 blue, 1 red, 9 green; 6 blue, 11 green, 10 red; 17 blue, 3 green; 2 green, 8 red, 6 blue
|
||||
Game 38: 6 blue, 7 green, 2 red; 12 green, 15 blue, 3 red; 7 blue, 3 red, 7 green; 6 blue, 10 green
|
||||
Game 39: 8 green, 4 red, 14 blue; 19 blue, 11 red, 5 green; 15 green, 12 blue, 13 red; 18 green, 5 red, 11 blue; 10 green, 8 blue, 10 red; 8 green, 2 red
|
||||
Game 40: 2 green, 5 red, 4 blue; 1 red, 2 green; 10 blue, 1 green; 8 blue, 8 red, 2 green; 2 red, 6 blue
|
||||
Game 41: 18 red, 2 blue; 17 red, 4 green, 3 blue; 5 blue, 7 red; 3 blue, 3 green, 8 red; 8 red, 2 blue
|
||||
Game 42: 2 blue, 6 green, 7 red; 2 red, 4 blue; 4 green, 4 blue, 10 red; 6 green, 5 red, 8 blue; 3 red, 3 blue
|
||||
Game 43: 1 green, 17 red, 1 blue; 16 red, 8 green; 7 blue, 15 red, 10 green; 1 green, 1 blue, 6 red; 13 green, 13 red; 11 green, 8 blue, 1 red
|
||||
Game 44: 9 blue, 9 green, 19 red; 7 red, 1 blue; 6 blue, 8 green, 9 red; 8 green, 2 blue, 13 red; 1 blue, 5 green, 19 red
|
||||
Game 45: 5 red, 3 green, 10 blue; 4 green, 17 red, 3 blue; 13 blue, 2 red, 10 green; 11 blue, 15 red, 13 green
|
||||
Game 46: 14 green, 1 blue, 6 red; 12 green, 18 red; 10 red, 1 blue, 3 green; 5 red, 8 green
|
||||
Game 47: 8 red, 5 blue, 2 green; 4 red, 4 blue; 3 blue, 9 red, 2 green; 2 red, 2 green, 4 blue; 14 red, 1 green, 2 blue
|
||||
Game 48: 11 red, 2 blue, 1 green; 2 green, 11 blue, 7 red; 2 red, 1 green, 12 blue; 1 green, 7 red, 2 blue
|
||||
Game 49: 7 blue, 8 red, 2 green; 10 red, 5 blue, 2 green; 10 red, 2 blue, 3 green
|
||||
Game 50: 18 red, 3 green; 8 red, 10 blue, 3 green; 11 red, 1 green; 8 red, 9 blue, 1 green; 7 blue, 3 red, 3 green
|
||||
Game 51: 6 green, 2 blue, 3 red; 1 green, 4 red; 1 red, 1 blue; 1 red, 5 green; 6 green, 2 red
|
||||
Game 52: 8 green, 6 blue; 2 blue, 1 red, 17 green; 8 red, 8 green; 2 green, 4 red, 2 blue
|
||||
Game 53: 6 red, 4 blue; 15 red, 4 green; 16 red, 3 green, 7 blue; 1 green, 18 red, 2 blue; 14 red, 8 blue, 1 green
|
||||
Game 54: 9 red, 11 green, 4 blue; 9 blue, 9 green, 14 red; 3 blue, 1 red, 9 green; 7 green, 16 red, 10 blue; 11 green, 3 blue, 11 red; 3 blue
|
||||
Game 55: 9 red; 1 blue, 10 red, 1 green; 15 red, 5 green; 2 blue, 1 green, 14 red; 1 blue, 2 green, 8 red; 6 red, 3 green, 2 blue
|
||||
Game 56: 16 blue, 13 green, 1 red; 7 green, 4 blue; 1 red, 11 blue, 16 green; 10 green, 2 red, 9 blue; 20 green, 1 blue, 1 red; 14 green, 2 blue
|
||||
Game 57: 13 red, 7 blue, 4 green; 19 red, 3 blue, 8 green; 9 red, 2 blue, 13 green
|
||||
Game 58: 5 green, 10 blue; 11 green, 9 blue; 6 green, 11 blue; 8 green, 2 blue; 1 red, 5 blue, 2 green; 6 green, 5 blue
|
||||
Game 59: 7 blue, 4 red; 1 green, 15 red, 7 blue; 6 blue, 15 red; 2 green, 13 red, 7 blue; 6 blue, 15 red
|
||||
Game 60: 6 green, 2 blue, 1 red; 6 green, 8 blue; 11 green, 2 red, 15 blue; 1 red, 4 blue, 9 green
|
||||
Game 61: 2 green, 4 blue; 8 red, 4 blue, 3 green; 4 green, 8 blue, 5 red
|
||||
Game 62: 1 blue, 11 green; 7 green, 3 blue; 7 green, 1 blue, 1 red
|
||||
Game 63: 14 red, 7 green, 1 blue; 2 red, 15 green; 3 green, 6 red; 20 red, 1 blue, 9 green; 11 red, 1 blue, 15 green
|
||||
Game 64: 9 red, 2 green; 9 green, 8 red, 2 blue; 2 red, 2 blue; 1 green; 7 red, 1 blue, 9 green; 12 green, 4 red
|
||||
Game 65: 4 blue, 1 red, 3 green; 7 green, 8 blue; 11 red, 3 green, 1 blue
|
||||
Game 66: 5 red, 2 blue; 2 green, 1 red; 2 green, 13 red, 4 blue; 15 red, 2 blue
|
||||
Game 67: 2 green, 1 blue, 15 red; 8 blue, 10 red, 1 green; 2 green, 6 blue, 18 red
|
||||
Game 68: 6 red, 2 green, 3 blue; 1 blue, 13 red, 5 green; 5 green, 2 blue, 7 red; 2 blue, 8 green, 2 red; 2 red, 1 blue; 8 green, 8 red
|
||||
Game 69: 2 blue, 3 red; 3 green, 1 red, 2 blue; 2 red, 1 green, 5 blue; 3 red, 3 green, 4 blue; 1 blue, 4 green, 7 red; 2 green, 4 blue
|
||||
Game 70: 2 red, 17 green; 8 red, 14 green; 1 blue, 18 green; 5 red, 4 green, 1 blue
|
||||
Game 71: 6 red; 3 green, 9 blue, 18 red; 19 blue, 14 red; 11 blue, 18 red, 5 green
|
||||
Game 72: 13 blue, 10 red, 4 green; 5 green, 13 blue, 13 red; 7 green, 7 red, 5 blue; 9 blue, 6 red; 4 blue, 6 green; 7 red, 2 blue, 4 green
|
||||
Game 73: 3 red, 6 blue; 8 red, 2 blue; 6 blue, 1 green, 4 red; 1 green, 5 red
|
||||
Game 74: 3 red, 3 green, 10 blue; 1 green, 1 red; 7 red, 3 green, 7 blue; 3 blue, 4 red
|
||||
Game 75: 1 green, 10 red, 8 blue; 13 red, 7 green, 9 blue; 18 red, 9 blue; 2 green, 1 blue, 5 red
|
||||
Game 76: 4 green, 4 red; 8 green, 3 red, 3 blue; 1 red, 2 green; 6 blue, 3 red, 3 green; 1 red, 1 green, 1 blue
|
||||
Game 77: 7 red, 8 blue, 7 green; 13 green, 7 blue, 8 red; 2 red, 10 green, 5 blue; 2 red, 5 blue, 3 green
|
||||
Game 78: 2 red, 7 blue; 5 blue, 6 green, 3 red; 16 green, 3 blue, 10 red; 13 green, 2 blue, 2 red
|
||||
Game 79: 1 blue, 8 red; 4 blue, 12 red, 5 green; 14 red, 10 blue; 2 green, 7 red, 2 blue; 14 red, 2 green
|
||||
Game 80: 7 blue, 5 green, 7 red; 2 green, 2 blue, 7 red; 4 red, 1 blue, 18 green; 2 green, 11 red, 3 blue; 4 blue, 9 red, 15 green
|
||||
Game 81: 3 green, 4 red, 14 blue; 11 blue, 4 green, 14 red; 6 blue, 8 red, 5 green
|
||||
Game 82: 2 green, 7 blue, 2 red; 15 blue, 2 green, 1 red; 3 blue, 2 green; 1 red; 2 red, 15 blue, 2 green
|
||||
Game 83: 5 blue, 1 green, 5 red; 12 red, 10 blue; 1 blue, 11 red
|
||||
Game 84: 4 red, 8 green, 14 blue; 1 green, 8 blue, 2 red; 1 red, 6 blue, 9 green; 8 green, 15 blue, 4 red; 4 blue, 4 red, 6 green
|
||||
Game 85: 8 green, 16 red, 5 blue; 10 red, 10 green; 18 green, 10 blue, 1 red; 3 red, 9 blue, 13 green
|
||||
Game 86: 2 blue, 10 green, 6 red; 8 blue, 6 green; 8 blue, 3 red; 8 green, 4 red, 3 blue
|
||||
Game 87: 8 blue, 4 red; 16 red, 20 blue, 4 green; 18 red, 1 green, 1 blue; 6 red, 1 green, 16 blue; 18 blue, 6 red
|
||||
Game 88: 13 green, 8 blue, 5 red; 13 red, 5 green, 9 blue; 10 red, 18 blue, 7 green; 14 green, 9 red, 13 blue
|
||||
Game 89: 14 red, 3 green, 5 blue; 10 blue, 5 red; 9 blue, 12 red, 3 green
|
||||
Game 90: 2 red, 2 blue; 1 blue, 1 green, 3 red; 2 green, 1 blue, 8 red; 4 red, 2 green, 2 blue; 2 blue, 9 red, 6 green
|
||||
Game 91: 1 green, 1 blue, 6 red; 3 blue, 2 red; 2 red, 10 green; 7 green, 2 blue, 4 red; 1 blue, 12 green, 8 red
|
||||
Game 92: 5 red, 6 blue, 14 green; 9 blue, 1 red, 10 green; 2 red, 7 green, 6 blue; 2 red, 10 blue, 4 green
|
||||
Game 93: 11 red, 5 blue, 2 green; 7 green, 8 red, 6 blue; 3 green, 5 blue, 10 red; 16 red, 8 blue, 6 green; 2 green; 1 green, 11 blue, 16 red
|
||||
Game 94: 4 blue, 2 red, 4 green; 5 blue, 1 red, 2 green; 12 blue, 3 red, 3 green
|
||||
Game 95: 1 red, 12 green, 4 blue; 1 blue, 9 green, 3 red; 1 blue, 13 green, 1 red; 3 red, 2 green, 1 blue; 4 blue, 3 red, 15 green
|
||||
Game 96: 1 red, 7 blue, 2 green; 5 green; 3 red, 5 green, 11 blue
|
||||
Game 97: 8 green, 6 red; 1 blue, 6 red, 10 green; 1 blue, 6 red
|
||||
Game 98: 2 green, 8 red, 1 blue; 9 green, 2 blue, 7 red; 1 blue, 2 red, 11 green; 8 red, 10 green, 2 blue
|
||||
Game 99: 3 blue, 2 red; 1 blue, 3 green, 3 red; 1 red, 3 green; 2 green, 2 red, 2 blue
|
||||
Game 100: 7 blue, 6 red, 5 green; 3 blue, 13 green, 11 red; 6 red, 13 green, 14 blue; 8 red, 10 blue, 15 green
|
||||
@@ -0,0 +1,6 @@
|
||||
3 4
|
||||
4 3
|
||||
2 5
|
||||
1 3
|
||||
3 9
|
||||
3 3
|
||||
@@ -0,0 +1,36 @@
|
||||
import fs from 'node:fs'
|
||||
|
||||
let all_deviation = 0
|
||||
|
||||
fs.readFile('input.txt', ({ encoding: 'utf-8' }), (err, data) => {
|
||||
let left_list = []
|
||||
let right_list = []
|
||||
for (let line of data.split('\n')) {
|
||||
//console.log(`${line}`)
|
||||
left_list.push(parseInt(line.split(' ')[0]))
|
||||
right_list.push(parseInt(line.split(' ')[1]))
|
||||
}
|
||||
left_list.sort()
|
||||
right_list.sort()
|
||||
|
||||
let difference = 0
|
||||
for (let i = 0; i < left_list.length; i++) {
|
||||
console.log(`left: ${left_list[i]} - right: ${right_list[i]}`)
|
||||
difference += Math.abs(left_list[i] - right_list[i])
|
||||
}
|
||||
let similarity = 0
|
||||
|
||||
|
||||
for (let i = 0; i < left_list.length; i++) {
|
||||
let found = right_list.filter(number => number === left_list[i])
|
||||
//console.log(found)
|
||||
if (found.length > 0) {
|
||||
|
||||
similarity += found.length * left_list[i]
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
console.log(`difference: ${difference}`)
|
||||
console.log(`similarity: ${similarity}`)
|
||||
})
|
||||
+1000
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"name": "y",
|
||||
"version": "1.0.0",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"description": ""
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
7 6 4 2 1
|
||||
1 2 7 8 9
|
||||
9 7 6 2 1
|
||||
1 3 2 4 5
|
||||
8 6 4 4 1
|
||||
1 3 6 7 9
|
||||
@@ -0,0 +1,54 @@
|
||||
import fs from 'node:fs'
|
||||
|
||||
const report = []
|
||||
|
||||
|
||||
fs.readFile('example.txt', ({ encoding: "utf-8" }), (err, data) => {
|
||||
//console.log(data)
|
||||
|
||||
// rows = reports
|
||||
const crit = 3
|
||||
let safe_reports = 0
|
||||
for (let line of data.split('\n')) {
|
||||
// line.split(' ') == levels
|
||||
|
||||
let levels = line.split(' ')
|
||||
let safe = true
|
||||
let safe_text = ""
|
||||
//let sho = (parseInt(levels[0]) > parseInt(levels[1])) ? true : false
|
||||
let shouldIncrease = (parseInt(levels[0]) < parseInt(levels[1])) ? true : false
|
||||
let safe_level = 0
|
||||
for (let i = 1; i < levels.length; i++) {
|
||||
let difference = Math.abs(parseInt(levels[i]) - parseInt(levels[i - 1]))
|
||||
let isIncreasing = parseInt(levels[i]) > parseInt(levels[i - 1]) ? true : false
|
||||
if (!shouldIncrease && isIncreasing) {
|
||||
safe = false
|
||||
safe_level += 1
|
||||
safe_text += " should decrease "
|
||||
}
|
||||
if (shouldIncrease && !isIncreasing) {
|
||||
safe = false
|
||||
safe_level += 1
|
||||
safe_text += " should increase "
|
||||
}
|
||||
if (difference > crit) {
|
||||
safe = false
|
||||
safe_level += 1
|
||||
safe_text += ` too much difference (${difference})`
|
||||
}
|
||||
if (difference < 1) {
|
||||
safe = false
|
||||
safe_level += 1
|
||||
safe_text += ` too little difference (${difference})`
|
||||
}
|
||||
}
|
||||
if (safe || safe_level === 1) { safe_reports += 1 }
|
||||
console.log(`safe reports so far: ${safe_reports} - ${shouldIncrease ? 'Increasing' : 'Decreasing'} - ${safe_level} - ${levels.join(" ")} - ${safe_text}`)
|
||||
|
||||
|
||||
// for (let i = 0; i < levels.length; i++) {
|
||||
|
||||
// }
|
||||
}
|
||||
|
||||
})
|
||||
+1000
File diff suppressed because it is too large
Load Diff
@@ -0,0 +1 @@
|
||||
xmul(2,4)&mul[3,7]!^don't()_mul(5,5)+mul(32,64](mul(11,8)undo()?mul(8,5))
|
||||
@@ -0,0 +1,28 @@
|
||||
import fs from 'node:fs'
|
||||
fs.readFile('input.txt', ({ encoding: "utf-8" }), (err, data) => {
|
||||
const mul_regex = /mul\((\d+),(\d+)\)/g
|
||||
const instruct_regex = /do(n't)?\(\)/g
|
||||
let do_instruction = true
|
||||
let result = 0
|
||||
let multiplications_done = 0
|
||||
const instructions = [...data.matchAll(instruct_regex)]
|
||||
const matches = [...data.matchAll(mul_regex)]
|
||||
for (let i = 0; i < instructions.length; i++) {
|
||||
const now = instructions[i]
|
||||
const then = (i + 1) in [...instructions.keys()] ? instructions[i + 1].index : data.length
|
||||
do_instruction = now[0] === "do()" ? true : false
|
||||
if (!do_instruction) { continue }
|
||||
matches.forEach(match => {
|
||||
if ((match.index > now.index && match.index < then && do_instruction) || (match.index < now.index && i == 0)) {
|
||||
let [full, x, y] = match
|
||||
result += parseInt(x) * parseInt(y) //mul(x, y)
|
||||
multiplications_done += 1
|
||||
}
|
||||
})
|
||||
}
|
||||
console.log(`total multiplications: ${matches.length}`)
|
||||
console.log(`multiplications done: ${multiplications_done}`)
|
||||
console.log(`multiplications ignored: ${matches.length - multiplications_done}`)
|
||||
console.log(`result: ${result}`)
|
||||
|
||||
})
|
||||
@@ -0,0 +1,6 @@
|
||||
!how()where()*mul(527,340)?why()^?mul(168,100)!^#mul(390,111)>'when()'select())((from()how()mul(412,526)/@what()from()when()-mul(500,980)#&[}]mul(887,503)%,$mul(699,805)what()select())>mul(292,305),'-{,@,how()who()mul(213,633)when()?@who()mul(652,4)*&'what()mul(177,237)&who()why()(@{+;why()<mul(23,321)what()when();from()-do()who() {&}-:(mul(844,162)~from()/mul(77,769)%,how()@%(?who()]<mul(694,833)^from()how()> &mul(193,679),)&mul(565,339)?}what()!who(){mul(705,313)mul(294,50)+mul(201,534) )~how()mul(659,49)!mul(871,788)select()where()from()mul(346,618) *&@'why()&}#mul(483,765)!#select()^*+[what()when()mul(448,525)]>:where()&^who()&mul(611,331):!)*/]}mul(37,42)>mul(538,106)when()why()mul(36,120)~where()-{+from()$'mul(950,456))mul(28,237)what()when(479,124)mul(697,976)):**/]&#how()#mul(424,841)why()'!;~mul(108,859)~%{?!mul(40,521)do()[^when()/%$+ [where()mul(187,953)who()where()select()(select()what()mul(984,77)<@)(/where()from()~;mul(163,398)/who()who()~mul(445,94))what()what()][how(),mul(115,245)--}/#how()what()!mul(366,981)'$why()do()what(565,96)who()mul(128,999):mul(858,772)[,,mul(796,864)why()what()^(mul(136,980)when()?!when()}mul(142,552)(mul(354,328)[(@how() (/~#mul(159,715)where()&mul(567,560)from()$^'$&&+!when()mul(582,489);where();select(),mul(306,841)? ,)how()mul(274,549)@~what()~?*mul(448,441);&<'select()when()when()#select()from()mul(404,209)^/ @who()who()'mul(400,15)';^&&when():{mul(199,543)[from()~+mul(452,787)([select()>/]$!/mul(840,165)when()>^why()~>when()(mul(830,125)from():mul(433,238);%why(){';$mul(494,781),-mul(139,401)&&&+who()>/^select()]do()mul(116,181)+$*[:who() do()how()<what()+mul(392,879)()what()don't()~)&?#*}mul(909,275)mul(695,234):],from()++^how()>;mul(514,117)$who()*)~%mul(859,857)}mul(837,844)>{@-what())-@@mul(574,73)]<[[why(608,495)how()who()when()mul(937,176)(%mul(471,325){'+)?:}mul(695,347)mul(56,888)where()##;#>who()+mul(157,650)mul(847,72):,[(how(144,703):mul(294,627)})>@mul(74,230)@)+what()mulhow()><<,$!(;why()mul(635,532)-select()mul(171,737)?select()[why()&^mul(587,686)$how()from())when()>;where()&mul(600,336)}@&{mul(651,690)from()?->&%mul(454,745)mul(387,378)mul(142,934)]mul(820,891)@#why()&how();;why()mul(337,723)&]from()when(894,39) ,>( mul/%(mul(271,558)#}']what()$-<^(mul(234 [what()when()select()($)+!don't()/ %<?%!]^mul(752,478)]how()mul(719,540)'when() why():(&'from(59,581)~mul(921,696)who()@,**%from(918,170))mul(224,391),where(104,159)do()from(339,837)}<<where()?{&how()mul(329,298)<who()what(937,474)&]@?mul(920,516);mul(438,991);{why()!]~'from()>mul(927,106)why()<%{{&~'<from()mul(950,746)'mul(240,649)?what(827,689)(mul(750,353)select(720,6)^mul(663,218)<,(why()<who()^>%why()mul(617?from()select()<what()mul(873,278)&^where(86,235)mul(170,108)!select()mul(66,5)@$^,~%from()mul(785,826): ~who(){mul(383,166):!![:~}+-'mul(554,291)@^)(^#when()when()why()mul(330,699)[:how(888,93)who()how(863,345)who()mul{how()-why()who()]$^mul(512,474)^@:mul(728,970)%mul(779,946)&& mul(216,667) where()^'%mul(788,642)how()>from()}$mul(915,977)& &mul(477,287){# mul(798,930)]mul(111select()*^@@/what()mul(518,86):('({&~{why()mul(991,855)*%^who()who()$/:{$mul(827,700)-'(mul(377,585)#&mul(171,537)when()@/>{< ,*:mul(349,478)!&^{-/mul(448,750)mul(868,546)mul(893,203)
|
||||
;?++how()$mul(218,402){mul(52,837)&{what()<who()[}<{don't()!mulwhen()!mul(323,214)$-]?'from(443,779)when()~how()mul(394,217)<who()do()# {+$#why()mul(873,360)mul(971,135)*^mul(131,811)/}@:mul(59,937)~select() #mul(657,749)[)mul(982,524)mul(602,483)?*mul(218,526)@{*where(){mul(164,992):what()why()]!*$mul(581,601)what()(#]%when()(how(){]mul(448,35)@^-mul(334,228):/$]<]&]:;mul(719,850)when()*!mul(724,214) from()select(264,396)mul(849,228))what()~;>#$% <mul(968,167);mul(603,611)mul(766,876)&why()mul(693,810)<)&!don't()/;what()+%%mul(666,136)mul(76,902)<how()}where()}select()select()<,mul(886,504)from()'{from()mul(398,932)%~,-)mul(948,141)<,!<*mul(51,426)?)/what()~why()++mul(775,745)from()+,(select())why()when()%%mul(987,730)![when()}!(how()do():%/(+mul(656,106):who()*&mul(599,486),(?*select(842,61)<^!mul(400,798) @[]*/@mul(808,934)]-,mul(542,49)mul(262,237)why()<what()how()$who()&?mul(151,471:from()*&%mul(252,481):select()-}mul(364,841)[~mul(656,650)@'^<^what();do();~from()(!;'mul(837,565) what()mul(695,312){-;^&<when()mul(562,683*/select()select()-%(#^mul(792,201)@@)mul(934,213),when(365,302)&}*'when()mul{>{>%when()mul(997,771)/select()!mul(88,621)when();mul(120,538)&what(592,500)#:*,how()#mul(745,304)$;:&*mul(276,817)/select()'how()'{when()mul(422,988)mul(386,816)what(87,832)-${mul(43,620)mul(271,338)+;why()why()-#*don't()where():],]what()-mul(4,311)' why()?don't()/~from()~select()<[why()mul(37,622)select()^]select()#where()<{mul(910,54,don't(),#^+{mul(153,137))[mul(348,234)::+{mul(710,502)'}'do()~where(722,741)why()!]mul(810,172)@[{from()where())why(230,249)<who()mul(734,174)$<when()what()?mul(729,870)$why()<who()-*>*^+mul(439,248)(?/#how():mul(559,154)!+from(26,260),)!'mul(67,900){>where()select()#~who()#%what()mul(194,100){<[,'(;-mul(421,329'what()@$$?when()<',mul(410,915)]who(672,22)-:*mul(722,311) select()how()~how()!*'mul(114,108)%($$#what(728,367)do()from(),*mul(159,172)>%]mul(358,684)who()&~]when()$mul(791,993)who()++$why()how()&$mul(913,73)-!mul(53,114))([{ select()@]from()(mul(89,340);^-$>?from() mul(184,541)+-%:(# mul(43,872)? # -[mul(984,77)&<+]when()(#;!mul(22,759)how()<how()/,;mul(156,529)-mul(377,400)%@select()^&mul(19,833)mul(68,933)mul:^;what()-@%,>{select()mul(264,832)>/$mul(78,759)]mul(645,838)select()<$& mul(665,217)mul(332,96)where()##mul(410,119)mul(614,640)}-%who()/why()what()mul(514,395)!<+{:%#how()+#mul(169,935)/+who()where()select()*mul(298,793)&@how()?!(who(191,903)when()?mul(492,499)) % $^{when(779,320)select()mul(631,153) ';[from()/^-+mul(669,90)what();^/[mul(275,626)why()&&where()mul(647,52)[ /(;[{[mul(522,127)-)mul(477,645)what(998,194)%:{when()[%%mul(32,779)/from()why();mul(665how()'mul(856,294)%how()*$how(372,599)when()<@ don't()mul(46,719)^where()>+: }(when()@mul:from(393,669)!+;how()[%)how()mul(317,228):!who()/mul(998,368); }mul(156,743)@;'^;$<#[mul(317,438)how()[{)#-why()(+?mul(230,66)!?{:@select()}/mul-:when()@$&mul(575,563)!what(){&$}^^%mul(821,423);@@select(815,842))/?>[mul(838,244)where()/[>mul(299,138){%(-mul(476,161)mul(286,551)~;from()%${mul(479,12)%&&;how()mul(867,436)];mul(742,138)select(205,272)where()from(628,468)mul(284,644)@when()<!how()why()don't()[;)$,mul(420,782)'$;select()why()^?']mul(124,908)#mul(256,912)mul(255,378):'from():who()$><~^mul(254,513)who()@where()-[! mul(458,892)how()'['{mul(875,437)(#^from()mul(431>/}<{#how()mul(453,206)
|
||||
where()]mul(385,96)^~){what()mul(879,45)/-){mul(115,393)!mul(257,133)&<;'mul(35,453);(mul(213,735)*+don't()~['select()?mul(761,741)]:)&from()?mul(648,940)+what()?mul(297,466);what()!mul(232,28)+/-who()%;where()?)mul(305,615)(*$^who()+&!select()mul(538,332)!@how() <${how(){?mul(357,604~when()what()why()~mul(543,859)when()do() mul(129,114),mul(182,648)#]/how()%$mul(974,606) #@)mul(841,177)how()[,from()-]^/mul(91,282)who()}where()+when()&$;why()mul*when()#mul(480,245):what()from()$~mul(885,960)@*what()]mul(656,115) select()select()how(737,324)~* ?mul(108,370);?$(!mul(428,835)+why()>/)mul(863,986)%&mul(840,769when(),{mul(463,323):?:mul(521,574)/when()(mul(362,622)~+'(-mul(904>$@]>?select()mul(511,354))mul(873,772),[,mul(492,786)^mul(113,58),(who()when()who()&</,mul(252,375)}+}what()select(384,157))&mul(257,777)(mul(934,832)how()-<~where()]who()>mul(949,323@when()@)~?mul(913,84)when()-}?<how()(>$+mul(82,683)where()how()->>who()]don't()!{mul(520,514)~+>mul(570,919);from()@!-*+]+where()mul(14,350)mul(577,453))/when()@?{select()%@mul(904,10)%&:>/,mul(632,748)&/#mul(919,899)@>don't()when()?<mul(923,825)-mul(773,944$~' $%:how(){don't() ~]-<]select();>]mul(183*how()select()~what()~+ #mul(301,159)from()(do()#@[who()>{(what(258,705)mul(844,738)mul(412,928)why()&how()}#-}~when()mul(949,165)mul(607,272)~who(931,656)do()&how();mul(594,752){~mul(695,972)<{}#mul(270,571)/,*from(447,32)'&>[mul(924,945),-!mul(539,419what()+<*what(885,804)<$~}~*mul(144,590)what()^<where(420,327){+mul(956,54)^+&'mul(799,92)$mul(939,70):how()select(){mul(414,359)'mul(649,366){+<how(140,173)what():#mul(503,754){*<who()}@*#what()mul(946,836)don't()','when()mul(460,355)where()select())mul(993,832)why() }'from()(~who()?mul(441{]select()?who():where()(mul(950,523) how()from(),::/^mul(382,457)how():what()~how()[:mul(104,980)~%why()what()*#mul(361,914)where()mul(310,662)@@from()from()%@>what()mul(989,595)who(),from(196,894)when(655,793)'*mul(375,733)how()-when()^*mul(272,881)why()mul(570,456)@@how()why())*mul(357&mul(844,880)<mul(348,758)?~{mul(454,846)what()why()'%}*mul(693,537)where()how()*-what()]{):mul(825,136)why()~/how()'mul(952,811)when():select();where()&&select()mul(846,735)mul(333,612)>mul(881,330)]select()~mul(236,135)'where(){why()+{mul(520,254)(:do()mul(645,835[&~from()why() what(){^select()]mul(892,641)@mul(814,94)& ,*how()who()why()&mul(61,560)@$%'mul(599,707)what(439,650)$-[():$!mul(73when()[#<mul(825,421)mul(426,176)@-^where()select()who()why()when()?mul(453,39),mul(724,707)]#@where();mul(925,260):($(;>don't()mul(538,792)<what()*when()~select(){~mul(326,892)@(;}do()when()?when()how()mul(100,121>> #from()why()/mul(460,218)mul(319,652))mul(290,239)%*how()why()(>@where()mul(591,728)@#select()when() )mul(184,663)!]<mul(34,388)%, -* mul(979,738)mul(178,487)))mul(429,189)]mul(820,475)<when()# what(),)where(),when()mul(245,395) mul(97,635)who()-}don't()<from()~:>%<mul(662,837)mul(460,812)mul(856,752):mul(324,499), *]/how(725,450)~when()what())mul(864,735)when()}$mul(49,227)what()where()#mul(576^!@:@+~mul(919,52)]/? how()^mul(383,37))#*mul(631,513)!'~@from()>}}mul(747,180)when()/~why()<,!select()mul(252,522)%*mul(690,254)+'!from()mul?(where()where()&)<!mul(801,852)%};{select(){ what()mul(42,685)<^;;*]!what()don't()>]when();mul(118,112)*?}where(544,721)#mul(721,220)@mul(190,918)+>how()#!/usr/bin/perl)where()]mul(548,120)where()mul(150,935)
|
||||
;?!where()'who()$select()why()&mul(55,883){:+mul(220,196)where()-('from()?select()who()mul(504,565))#mul(745,347)<where()when()mul%'from()#</?*mul(149,109))from()select()'&*%^,mul(986,752)><++/mul(635,120)]~mul(791,406)-mul(724,781),when(144,428) [[mul(718,565)who()why() %mul(328,251)who()+]&mul(707,742)!how()]{from()]'--(mul(96,818)@-(-$how()mul(767,105)^-mul(250,160):}where()mul(966,869)mul(878,876)!;),mul(874,72)why()+#who() )why()where()mul(896,845))?'#mul(585,579)$?~from()]!mulwho()%~select(757,508)'&^?mul(244,631)'how()$}mul(995,939)&why()@from())(+(do()^who()what()$mul(166,376)when(866,717)mul(419,53))]%>}{&{%select()do()from()&/*!'why(443,390))mul(397,885)when()how()who()what()mul(99,988)?,what()&mul(836,347)mul(692 mul(724,602)(mul(250,6)*how()how()'!how()mul(639,245)]mul(81,785)&+~mul(101,124)mul(984,435)what()[,}*mul(347,607)select()<mul^where(393,801)-,when()*$>;&where()mul(80,544){#~&mul(934,254):#+!who()<[mul(357,513)?:>what()~?when()({mul(937,208)]>?who()'when()select()'how()'mul(608,880)do();%:>select();]what();mul(978,885)!+select(195,899)~@*+mul(668when()'how(){>!#~}mul(449,440) !:]mul(908,330)mul(425,622)why()>[where()^**;,mul(373,419)from()%&'how()^,,^who()don't()@?&%select(491,38)mul(162+]*!:#^/ *+mul(390,994)select()#mul(244,23)@from()';where()mul (}when() )mul(16,801)/~^when()+)&-;when()mul(987,488)~@)mul(132,925)mul(959,924)@select(351,211)how()(-^}[mul(398,876)>,mul(492,208)how()what()?{who()where()'+mul(407,996)-)?where():mul(911,656);}/when()&mul(683,608)/why(574,363)mul(771,125)how()who()-~-#*?{&mul(832,987)mul(443*}+$mul(609,538)mul(949,408)how()mul(322,393)!$/&where()'mul(599,249)}#@ mul(858,751)why()+#what()>/-<from()mul(713,3)?why(482,825)&?&/*!*mul(256,486)select()<what()@mul(652,369)?{<select()why(),mul(836,865))<mul(454,939)%>:how()/how()?don't()when()when(){~/]mul(253,448)^^))mul(84>mul(85,415) ]})+why(40,365)}how()mul(11,381)how()%%who()where()why()mul(906,336)how()~where()-who():]where()select(239,576)why()mul(912,508)mul(24 ~^from(718,313)-@mul(517,16)@%mul(55,215) !what();*^/@mul(880,672)where(522,916)mul(804who()what()[(where(286,361)<select():(what()mul(155,258){!+!^mul(423,458)$how(615,130)'&select()don't()^{:$mul(326,138)^#(!mul(932,531)^?select()from()##who()how()who()mul+({<]#who()'{@mul(226,273)~/^why()<*why()mul(689,562)*mul(446,724)why()/when()when(869,266)do())why()mul(812,183)~from()%mul(971,441)when()%+?+^]mul(30,805))why()how()[from()mul(822,234),[?-%&](:$mul(440,835))when()&where()mul(12,352)])& ]-[{({mul(555,778)+mul(882,447)}:[!select()'mul(787,318)mul(539,118)$from()mul(511,100)+'~;+^^when()[mul(916,562)#+select()?]:~mul(506,622)]mul(778,105)(>@}^$:mul(51,378)({${,[from()}mul(543,793)}(}:[select()]mul(772,432)mul(253,865)(from()::?mul(150,306)<mul(62,389)who()#?when()~%/(!mul(146,73) -&#what()mul(114,144)<*&:{when()@how()from()]do(),>+< when()]when(78,385)]what()mul(681,911)}>what()mul(385,561)mul(97,729)$@mul(293,50):-@-mul(471,695)}where()-:^:}mul(566,792)&++[how()#mul(287,219)why()!mul(373,971)when()how()mul(154,605) ^mul(93,56)!@)@from()who(416,376)%$'[mul(472,481)^')select()when() {&mul(303,563)[;;@}~mul(167,624)mul(550,339{mul(626,174)'$;when()-[mul(11,151)how()select()&<when()!$where()<$mul(485,546)who()/(+,,who()#??mul(760,654)'when()why())when()%^do()?>-select())when()mul(951,26)mul(988[[/select()what(195,189)-mul(991,661)([}from()~:[why()^!mul(558,565)select()+*}mul(525,81)
|
||||
?select()mul(457,497)from()who()[how()who()select(){:(>mul(273,631):)' )mul(433,659)/select()$ ??mul(996,214);'&>:(#!don't();<mul(720,546)when(827,349)<#<mul(143,489)mul(674,877)+&!what()'#mul(44})'from()+&where(){!~select(840,430)mul(212,347)why()@@~who()mul(969,631)why()where()select(887,765)%why()~/}}mul(519,309)'@}mulselect(606,267)~don't()'mul(216,53);^who()mul(71,582)[why()select())from()]%>from()mul(806,472)$;why()<who()&:){~mul}{ )! mul(143,398)mul(447,376)](> what()^,?don't()+-#what(220,900)]-from()mul(672,653)where()why()select(){why()*mul(394,630)mul(214,535)}(from()'from()!mul(304,752)who()'{from()from()%;@from(471,425)from()mul(431,414)?from(536,612)*don't()[<mul(679,373)]when()^mul(959,511)where()<[%mul(505,852)from()$!#do()++>mul(494,757),{@mul(864,136)why()%$ mul(901,770)(?how()! !mul(389,250)>:mul(107,240)how()+how(),mul(402,117)^:#,why(432,943)~mul(764,768)</-why()when()],why()$mul(300,720)->%/) mul(486,61)[from()% ~^}how(){mul(436,252))'mul(314,683)what()$@&)mul^what()(how()mul(356,528)+?] %)#mul(945,995);when(336,103)mul(904,121)'),mulwhy()why();why()@<*%+mul(173,177)mul(552,612);,select()%@mul(824,863)@from()mul(151,472)select()when()^}mul(381,33)mul(987,66)mul)+from()]]'mul(484,944),<how()~where()mul(904,715)mul(254,934)from())?!&^$,~mul(95,795)mul(317,265)~why()$;mul(964,988)##@mul(602,81)~from(){,mul(927,985</[+##mul(544,556)~(/how()~mul(816,799)when()[from()why()],mul(357,945)?%,(mul(513,777)from(104,28);>} mul(79,219)mul(645,343)+#select()#what()#>#mul(962,402)^,mul(170,849)+$/[],{ how()*mul!select()#how()do() ~[!{mul(132,291)from()when()^{mul(876,121);@&>?mul(14,405)select()}'why()^!mul(701,908)^]+what()how()%when(),{mul(163,570)why(),where(802,334)from()^mul(203,784)^select()who()^*@when()~/)mul(457,821)how()*!how()%#>[mul(911,205)*}];/]*!select()mul(209,380)why():*@*where()what()]who()mul(158,681)select()from()mul(913,623)select()?,>mul(692,963)>}mul(641,525)why()mul(107,645)from()(+mul(948,423)mul(497,166)from()%'mul(972,376)when()where()[[don't()~}/what()$*what()mul(205,460)</:#@*how()mul(541,537)]mul(974,76)[{)^ {(mul(985,506)(#@why()mul(105,151)from()how():{select()mul(726,399))#(how()mul(166,283);+([~-!,don't()-how()mul(814,281),who(244,221)<^:%:^)how()mul(46,257), @mul(620,932)>,-%:-mul(212,248)when()select()mul(511,961)who()who(694,88)>mul(725,998(<]mul(881,682)select()select()mul(392,740)$>)mul(794,79),;$mul/:};#(>/)mul(60,633)['!~how())who(){$mul(757,172)%how()what()how(),mul(19,116)-'?who();where()when()who():mul(201!]how()-'{#where()<+what()mul(848,314)->from()mul(366,508;^[%why(10,776){~mul(403,696)(~{))why()/mul(61,507),+ }mul(771,565)-}@)mul(726,28)*;when()-$!:,[&mul(672,226)}?]*do()when()[mul(749,250)(mul(514,431)~*when()%what()'how(204,98)how()where()mul(529[]}~mul(204,564)what()++<]}&select()mul(459,244)what()mul(687,827)?when()<~,]<?~<mul(448,423)%mul(660,452)what()mul(111,31),/mul(485,116)select();*>%$+<<*mul(403,7)how()what()^mul(433,321)}%do()where(436,974)^/,+what()who() mul(338,162):(mul(876,575)%why()!+;/^why()mul(588,29)(how()select(350,689)+'^-:-&mul(694,2)what()mul(997,566)from()!]%'?;<-why()mul(540,192)^from()*<):~do()what()from()/{/mul(236,520)#>when()*#)(mul(243,137)mul(483,202)('who()do()when(){>$$what()&)']mul(763,83)>who(744,412)*^who()*) don't()mul(948,448)(:mul(867,155)^^***,+}-^mul(510,656),,;:[^[!mul(37,392where()[mul(67,386)'(^!,~mul+~(+ how(321,247)}$*mul(632,944)
|
||||
{how()mul,how()when()+when()}what()mul(900,270)^:,where()mul(489,842){!what()when()#!mul(243,646)!where()*when();who()mul(67,231)select()*select()do()how()$(**,+how();mul(472,391)select()@'how(630,875)who()>mul(83,172);+$where()+~~mul(163,367)<mul(788,607)from()?&]what() mul(780,691)/@when()((who()+~?mul(323,888)mul(67,878),,):>mul(10,776) ({select()select()~*[mul(216,443)-)select()::(-?@select()mul(938,86)mul(238,475)where() }<(don't() +>;mul(491,189)~[/#;mul(687,66)$+]'-don't()+when()&+$;-]mul(605,671)?;mul(8,465)when()<~:^(what(549,164)[mul(253,71)([?where()from()why()?when()$mul(885,722)~~>what()select()]@%>mul(12,734)(/)[where()select(649,213)from(945,849)(*%mul(948/when()mul(490,837)(@where()'what()}what()why()mul(906,59)when()how()#select(),:}do():#mulwhat(918,618);mul(290,290)mul(894,51)?mul(230,518)*,;select()mul(366,247)[]from(946,647)&!^where()where()how(),mul(94,114)mul(275,889)when(){$#[<?<$when()mul(172,248)$)where()what()mul(292,19)<why()/@@[$@mul(715,134))why()~}'how()~mul(405,534)mul(827,178)when()-mul(349,293){},${[;from()(what()mul(851,954)mul(384,35)$#/mul?+%&,mul(334,901)why()~~(&from()[]mul(497,387)select()!{)]select()when():!mul(57,56)~$**}^how()mul(952,706)~+!what()#$@}]don't()]mul(884,597)+[&(^{what()where()~mul(617,23)what(806,100)where(660,881);)}!don't()$<}mul(630,77))*+mul(366,51,%%:*^+mul(128,254)why()-what()!'where()+%mul(356,640)('(mul(366,919),,how()!why()when()who()%]mul(414,493)&from()?[mul(810,596)>mul(892,356)&[-mul(303,485)*select()how()''mul(738,220)!@mul(371,794)where()mul(380,261)mul(210,796): *{$]why()how()?mul(615,74)select()from()do()from()*how()/'mul(507,36)what()when()#]?#{-mul(398,229)select()}mul(844,299)!<;#^%]+,when()mul(4,527)#when()##!%]when()(mul(708,803)}/when()why(514,182)({mul(336,134);,[}/:mul(899,874)select()how()]#mul(548,253)>^~mul(294,767)#^* mul(444,302)where()how()]{]select()!where()!mul(906,663)mul(656,596){[ & ;^+%-mul(108,609)who()+(why()/how()(@don't()'{-from() mul(364,848),^$ ?] +:mul(889,175)mul(660,583)*!@mul(423,213)mul(311,390)%how()?!{mul(738,520)mul(97,84)?mul(423,763)<'?mul(15,141)mul(300,197)>select()%when()mul(640,732)^}mul(919,588)(}<!select()&}select()select()mul(655,724)),mul(271,552)don't()from()mul(364,12)(%[why(): ]when()mul(106,517)((select()mul(800,445)@when()']mul(325,316)>how(),-]how(),<don't()/+who()<,select(){mul(292,951)mul(966,75)@@?}{+~from();mul(472,867) :*&?/mul(408,687)!+[][[!?$mul(211,912)who()<}mul(826,742)/mul(362,601))mul(823,393)when()~select()!what()mul(144,414)~mul(743,461)*~who()]select()mul(579,413)why(),,?mul(690,917)]<)where()@]%%mul(774,571){!*@don't()^from()how();@~$mul(317,142)select(161,55)mul(636,392)}mul(538,552) when()'#$#mul(580,654){when(46,367)'}]select())mul(775,934)who()%%>select()!select()what()from()mul(231,907)where(799,691)-,:)@]mul(336,972)<what()~* {#-:;mul(500,188)$$%]&!$mul(938,24)*^?)mul(576,582),($how()/when() !mul(701,946)~#^<don't())mul(982,103)?how()* ^from(507,869)'who()select()mul(107,848)why() ')when()when()select(903,770)#who()mul(367,164)}how()mul(869,254)mul(993,910);;mul(969,393)who()<select() :select()?&'[mul(273,219)who());%%^!!-mul(464,515)&;{why()<<)'*mul(73,753)],-/mul(263,676)what()
|
||||
@@ -0,0 +1,10 @@
|
||||
MMMSXXMASM
|
||||
MSAMXMSMSA
|
||||
AMXSXMAAMM
|
||||
MSAMASMSMX
|
||||
XMASAMXAMM
|
||||
XXAMMXXAMA
|
||||
SMSMSASXSS
|
||||
SAXAMASAAA
|
||||
MAMMMXMMMM
|
||||
MXMXAXMASX
|
||||
@@ -0,0 +1,51 @@
|
||||
import fs from 'node:fs'
|
||||
fs.readFile('example.txt', ({ encoding: "utf-8" }), (err, data) => {
|
||||
const letters = ["X", "M", "A", "S"]
|
||||
|
||||
const rows = [...data.split('\n')]
|
||||
|
||||
// directions, straight first: east,south,west,north,southeast,southwest,northwest,northeast
|
||||
const dirs = [[1, 0], [0, 1], [-1, 0], [0, -1], [1, 1], [-1, 1], [-1, -1], [-1, 1]]
|
||||
|
||||
let found_words = 0
|
||||
let found_letters = []
|
||||
const width = rows[0].length
|
||||
const height = rows.length
|
||||
// letters.forEach(letter => {
|
||||
// for (i = 0; i < rows.length; i++) {
|
||||
|
||||
|
||||
// }
|
||||
// })
|
||||
for (let letter = 0; letter < letters.length; letter++) {
|
||||
let letter_positions = []
|
||||
for (let x = 1; x <= width; x++) {
|
||||
for (let y = 1; y <= height; y++) {
|
||||
if (rows[y - 1][x - 1] === letters[letter]) {
|
||||
letter_positions.push([x, y])
|
||||
|
||||
// check if there is a next letter
|
||||
dirs.forEach(direction => {
|
||||
let [new_x, new_y] = direction
|
||||
if (x + new_x in [...rows[y - 1]] && y + new_y in [...rows.keys()] && letter + 1 in [...letters.keys()]) {
|
||||
//console.log(`I'm at ${x},${y} with ${letters[letter]}. Looking for letter at ${x + new_x},${y + new_y}`)
|
||||
if (letters[letter + 1] === rows[y - 1 + new_y][x - 1 + new_x]) {
|
||||
console.log(`I am at ${x},${y} with $ ${letters[letter]}. Found ${letters[letter + 1]}.`)
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
found_letters[letter] = letter_positions
|
||||
}
|
||||
|
||||
console.log(found_letters)
|
||||
console.log(`width: ${width}`)
|
||||
console.log(`height: ${height}`)
|
||||
})
|
||||
|
||||
function findFirstLetter(letter) {
|
||||
const [row, col] = Array
|
||||
return [row, col]
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
190: 10 19
|
||||
3267: 81 40 27
|
||||
83: 17 5
|
||||
156: 15 6
|
||||
7290: 6 8 6 15
|
||||
161011: 16 10 13
|
||||
192: 17 8 14
|
||||
21037: 9 7 18 13
|
||||
292: 11 6 16 20
|
||||
@@ -0,0 +1,35 @@
|
||||
import fs from 'node:fs'
|
||||
function add(a, b) {
|
||||
return a + b
|
||||
}
|
||||
function mul(numbers) {
|
||||
const res = numbers.reduce((acc, next) => { console.log(acc, next); return acc * next }, 0)
|
||||
//console.log(res)
|
||||
return 0
|
||||
}
|
||||
|
||||
function testMathOperations(product, numbers) {
|
||||
let result = 0
|
||||
const operations = numbers.length - 1
|
||||
|
||||
|
||||
//let res = mul(numbers)
|
||||
//let res = product == numbers.reduce((acc, next) => { acc * next }, 0) ? result : 0
|
||||
|
||||
if (product === result) return product
|
||||
return 0
|
||||
}
|
||||
|
||||
fs.readFile('example.txt', ({ encoding: 'utf-8' }), (err, data) => {
|
||||
const regex = /^(\d+): ([0-9 ]+)/g
|
||||
let result = 0
|
||||
for (let line of data.split('\n')) {
|
||||
const test = line.matchAll(regex).next().value
|
||||
const product = test[1]
|
||||
const numbers = test[2].split(' ')
|
||||
result += testMathOperations(product, numbers)
|
||||
console.log(product, numbers, result)
|
||||
//console.log(`something should happen to ${numbers} for becoming ${result}`)
|
||||
}
|
||||
console.log(result)
|
||||
})
|
||||
@@ -0,0 +1,26 @@
|
||||
let disk_map = "2333133121414131402"
|
||||
// 0..111....22222
|
||||
|
||||
//let fileArray = Array.from(file)
|
||||
|
||||
output = ""
|
||||
hints = ""
|
||||
//output += "".padStart(disk_map[0], 0)
|
||||
let id = -1
|
||||
let is_file = false
|
||||
for (let idx = 0; idx < disk_map.length; idx++) {
|
||||
let length = disk_map[idx]
|
||||
is_file = !is_file
|
||||
id = is_file ? id + 1 : id
|
||||
output += "".padStart(length, (is_file ? id : '.'))
|
||||
new_disk_map =
|
||||
}
|
||||
|
||||
function frag() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
console.log(disk_map)
|
||||
//console.log(hints)
|
||||
console.log(output)
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"name": "09",
|
||||
"version": "1.0.0",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"description": ""
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"name": "10",
|
||||
"version": "1.0.0",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"description": ""
|
||||
}
|
||||
@@ -0,0 +1,134 @@
|
||||
/*
|
||||
If the stone is engraved with the number 0, it is replaced by a stone engraved with the number 1.
|
||||
If the stone is engraved with a number that has an even number of digits, it is replaced by two stones. The left half of the digits are engraved on the new left stone, and the right half of the digits are engraved on the new right stone. (The new numbers don't keep extra leading zeroes: 1000 would become stones 10 and 0.)
|
||||
If none of the other rules apply, the stone is replaced by a new stone; the old stone's number multiplied by 2024 is engraved on the new stone.
|
||||
*/
|
||||
|
||||
let initial_stones = "17639 47 3858 0 470624 9467423 5 188" //"1 2 4 6921 7 823 2219 31 0 4500 22 111 0 9213 44 1 23 1";
|
||||
//let initial_stones = "125 17"
|
||||
|
||||
const cache = []//new Map()
|
||||
|
||||
const Bisect = (input => {
|
||||
let text = String(input)
|
||||
let len = text.length
|
||||
let left = text.slice(0, len / 2)
|
||||
let right = text.slice(len / 2, len)
|
||||
return [parseInt(left), parseInt(right)]
|
||||
})
|
||||
const Blink = ((stone, numberOfTimes) => {
|
||||
//console.log(`----------${numberOfTimes}----------`)
|
||||
if (numberOfTimes === 0) return 1
|
||||
if (cache[`${stone}.${numberOfTimes}`]) {
|
||||
console.log(`Found cached value for ${stone}: ${cache[`${stone}.${numberOfTimes}`]}`)
|
||||
return cache[`${stone}.${numberOfTimes}`]
|
||||
}
|
||||
if (stone === 0) {
|
||||
//console.log(`Stone with value 0 turned to 1`)
|
||||
cache[`${stone}.${numberOfTimes}`] = Blink(1, numberOfTimes - 1)
|
||||
return cache[`${stone}.${numberOfTimes}`]
|
||||
}
|
||||
if (String(stone).length % 2 === 0) {
|
||||
let stones = Bisect(stone)
|
||||
let left = stones[0]
|
||||
let right = stones[1]
|
||||
cache[`${left}.${numberOfTimes}`] = Blink(left, numberOfTimes - 1)
|
||||
cache[`${right}.${numberOfTimes}`] = Blink(right, numberOfTimes - 1)
|
||||
//console.log(`Found left value: ${left}, right value: ${right}`)
|
||||
return cache[`${left}.${numberOfTimes}`], cache[`${right}.${numberOfTimes}`]
|
||||
}
|
||||
cache[`${stone}.${numberOfTimes}`] = Blink(stone * 2024, numberOfTimes - 1)
|
||||
return cache[`${stone}.${numberOfTimes}`]
|
||||
})
|
||||
function startBlinking(stone, numberOfTimes) {
|
||||
if (numberOfTimes === 0) return 1
|
||||
|
||||
const key = `${stone}:${numberOfTimes}`
|
||||
if (key in cache) return cache[key]
|
||||
if (typeof stone == 'object') { }
|
||||
if (stone === 0) { cache[key] = 1; startBlinking(stone, numberOfTimes - 1) }
|
||||
if (String(stone).length % 2 === 0) {
|
||||
[left, right] = [...Bisect(stones)]
|
||||
cache[key] = [left, right]
|
||||
return Blink([left, right], numberOfTimes - 1)
|
||||
}
|
||||
cache[key] = startBlinking(stone * 2024, numberOfTimes - 1)
|
||||
return startBlinking(stone, numberOfTimes)
|
||||
}
|
||||
|
||||
function transform(stone) {
|
||||
if (stone === 0) {
|
||||
return [1]
|
||||
}
|
||||
|
||||
if (stone.toString().length % 2 === 0) {
|
||||
const str = stone.toString()
|
||||
const midIndex = Math.ceil(str.length / 2)
|
||||
const [left, right] = Bisect(stone.toString())
|
||||
//const left = str.slice(0, midIndex)
|
||||
//const right = str.slice(midIndex)
|
||||
|
||||
return [Number(left), Number(right)]
|
||||
}
|
||||
|
||||
return [stone * 2024]
|
||||
}
|
||||
|
||||
function simulation(stone, ticks) {
|
||||
const key = `${ticks}-${stone}`
|
||||
|
||||
if (cache[key]) return cache[key]
|
||||
if (ticks === 0) return 1
|
||||
|
||||
const nextStones = transform(stone)
|
||||
console.log(`stone ${stone}, received ${nextStones}`)
|
||||
const result = nextStones.reduce(
|
||||
(acc, nextStone) => acc + simulation(nextStone, ticks - 1),
|
||||
0
|
||||
)
|
||||
|
||||
cache[key] = result
|
||||
|
||||
return result
|
||||
}
|
||||
//let num = "125 7 0 91".split(' ').forEach(stone => { num += simulation(stone, 25) })
|
||||
let num = 0
|
||||
for (stone of "17639 47 3858 0 470624 9467423 5 188".split(' ')) {
|
||||
num += simulation(stone, 75)
|
||||
}
|
||||
console.log(num)
|
||||
//console.log(cache)
|
||||
//let num = Blink("125 17", 5)
|
||||
//console.log(num)
|
||||
// function blink(stones) {
|
||||
// let new_stones = []
|
||||
// stones.split(' ').forEach(element => {
|
||||
// let changed = false
|
||||
// let new_element = 0
|
||||
// if (element == 0) {
|
||||
// // switch place with a 1
|
||||
// //console.log(`${element} is a 0, turn into 1`)
|
||||
// new_element = 1
|
||||
// changed = true
|
||||
// }
|
||||
// if (element.length % 2 === 0) {
|
||||
// let right = parseInt(element.slice(element.length / 2, element.length))
|
||||
// let left = parseInt(element.slice(0, element.length / 2))
|
||||
// new_stones.push(left)
|
||||
// new_element = right
|
||||
// changed = true
|
||||
// }
|
||||
// if (!changed) new_element = element * 2024
|
||||
// new_stones.push(parseInt(new_element))
|
||||
// });
|
||||
// return new_stones.join(" ");
|
||||
// console.log(`${i + 1}: ${new_stones.join(" ")}`)
|
||||
// }
|
||||
|
||||
//for (let i = 0; i < 75; i++) {
|
||||
// console.log(`------------------------`)
|
||||
// initial_stones = blink(initial_stones)
|
||||
// console.log(`${i + 1}: ${initial_stones.split(' ').length}`)
|
||||
//console.log(`${initial_stones}`)
|
||||
//}
|
||||
|
||||
@@ -0,0 +1,123 @@
|
||||
/*
|
||||
If the stone is engraved with the number 0, it is replaced by a stone engraved with the number 1.
|
||||
If the stone is engraved with a number that has an even number of digits, it is replaced by two stones. The left half of the digits are engraved on the new left stone, and the right half of the digits are engraved on the new right stone. (The new numbers don't keep extra leading zeroes: 1000 would become stones 10 and 0.)
|
||||
If none of the other rules apply, the stone is replaced by a new stone; the old stone's number multiplied by 2024 is engraved on the new stone.
|
||||
*/
|
||||
|
||||
let initial_stones = "17639 47 3858 0 470624 9467423 5 188" //"1 2 4 6921 7 823 2219 31 0 4500 22 111 0 9213 44 1 23 1";
|
||||
//let initial_stones = "125 17"
|
||||
|
||||
const cache = []//new Map()
|
||||
|
||||
const Bisect = (input => {
|
||||
let text = String(input)
|
||||
let len = text.length
|
||||
let left = text.slice(0, len / 2)
|
||||
let right = text.slice(len / 2, len)
|
||||
return [parseInt(left), parseInt(right)]
|
||||
})
|
||||
const Blink = ((stone, numberOfTimes) => {
|
||||
//console.log(`----------${numberOfTimes}----------`)
|
||||
if (numberOfTimes === 0) return 1
|
||||
if (cache[`${stone}.${numberOfTimes}`]) {
|
||||
console.log(`Found cached value for ${stone}: ${cache[`${stone}.${numberOfTimes}`]}`)
|
||||
return cache[`${stone}.${numberOfTimes}`]
|
||||
}
|
||||
if (stone === 0) {
|
||||
//console.log(`Stone with value 0 turned to 1`)
|
||||
cache[`${stone}.${numberOfTimes}`] = Blink(1, numberOfTimes - 1)
|
||||
return cache[`${stone}.${numberOfTimes}`]
|
||||
}
|
||||
if (String(stone).length % 2 === 0) {
|
||||
let stones = Bisect(stone)
|
||||
let left = stones[0]
|
||||
let right = stones[1]
|
||||
cache[`${left}.${numberOfTimes}`] = Blink(left, numberOfTimes - 1)
|
||||
cache[`${right}.${numberOfTimes}`] = Blink(right, numberOfTimes - 1)
|
||||
//console.log(`Found left value: ${left}, right value: ${right}`)
|
||||
return cache[`${left}.${numberOfTimes}`], cache[`${right}.${numberOfTimes}`]
|
||||
}
|
||||
cache[`${stone}.${numberOfTimes}`] = Blink(stone * 2024, numberOfTimes - 1)
|
||||
return cache[`${stone}.${numberOfTimes}`]
|
||||
})
|
||||
|
||||
|
||||
function transform(stone) {
|
||||
if (stone === 0) {
|
||||
return [1]
|
||||
}
|
||||
|
||||
if (stone.toString().length % 2 === 0) {
|
||||
const str = stone.toString()
|
||||
const midIndex = Math.ceil(str.length / 2)
|
||||
const left = str.slice(0, midIndex)
|
||||
const right = str.slice(midIndex)
|
||||
|
||||
return [Number(left), Number(right)]
|
||||
}
|
||||
|
||||
return [stone * 2024]
|
||||
}
|
||||
|
||||
function simulation(stone, ticks) {
|
||||
const key = `${ticks}-${stone}`
|
||||
|
||||
if (cache[key]) return cache[key]
|
||||
if (ticks === 0) return 1
|
||||
|
||||
const nextStones = transform(stone)
|
||||
console.log(`stone ${stone}, received ${nextStones}`)
|
||||
const result = nextStones.reduce(
|
||||
(acc, nextStone) => acc + simulation(nextStone, ticks - 1),
|
||||
0
|
||||
)
|
||||
|
||||
cache[key] = result
|
||||
|
||||
return result
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
let num = "125 7 0 91".split(' ').forEach(stone => { num += simulation(stone, 25) })
|
||||
//let num = 0
|
||||
//for (stone of "17639 47 3858 0 470624 9467423 5 188".split(' ')) {
|
||||
// num += simulation(stone, 25)
|
||||
//}
|
||||
console.log(num)
|
||||
//console.log(cache)
|
||||
//let num = Blink("125 17", 5)
|
||||
//console.log(num)
|
||||
// function blink(stones) {
|
||||
// let new_stones = []
|
||||
// stones.split(' ').forEach(element => {
|
||||
// let changed = false
|
||||
// let new_element = 0
|
||||
// if (element == 0) {
|
||||
// // switch place with a 1
|
||||
// //console.log(`${element} is a 0, turn into 1`)
|
||||
// new_element = 1
|
||||
// changed = true
|
||||
// }
|
||||
// if (element.length % 2 === 0) {
|
||||
// let right = parseInt(element.slice(element.length / 2, element.length))
|
||||
// let left = parseInt(element.slice(0, element.length / 2))
|
||||
// new_stones.push(left)
|
||||
// new_element = right
|
||||
// changed = true
|
||||
// }
|
||||
// if (!changed) new_element = element * 2024
|
||||
// new_stones.push(parseInt(new_element))
|
||||
// });
|
||||
// return new_stones.join(" ");
|
||||
// console.log(`${i + 1}: ${new_stones.join(" ")}`)
|
||||
// }
|
||||
|
||||
//for (let i = 0; i < 75; i++) {
|
||||
// console.log(`------------------------`)
|
||||
// initial_stones = blink(initial_stones)
|
||||
// console.log(`${i + 1}: ${initial_stones.split(' ').length}`)
|
||||
//console.log(`${initial_stones}`)
|
||||
//}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
{
|
||||
"name": "day-11",
|
||||
"version": "1.0.0",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"description": ""
|
||||
}
|
||||
Reference in New Issue
Block a user