Unfortunately I’ve struggled with this myself :/ (moving to a new country didn’t help either)
I’d say go for it if you get the chance. Playing with other people is a game changer in your music journey. Then it’s not only focusing on your playing but also on what the others are playing, following the tempo, the dynamics…
Related question, what CalDAV server are you using? Been looking for something lightweight
Wasn’t Spotify Swedish tho? But yeah
Agree with Zero Mission. Second would be Dread and then Super. Haven’t played Fusion tho, long overdue…
Usually artists go on tour after releasing a new album, to promote said album. So of course they’re going to play new stuff.
The ideal for me is a good balance. Some new songs mixed with the classics.
Using a map to store u|v relations. Part 2 sorting with a custom compare function worked very nicely
func main() {
file, _ := os.Open("input.txt")
defer file.Close()
scanner := bufio.NewScanner(file)
mapPages := make(map[string][]string)
rulesSection := true
middleSumOk := 0
middleSumNotOk := 0
for scanner.Scan() {
line := scanner.Text()
if line == "" {
rulesSection = false
continue
}
if rulesSection {
parts := strings.Split(line, "|")
u, v := parts[0], parts[1]
mapPages[u] = append(mapPages[u], v)
} else {
update := strings.Split(line, ",")
isOk := true
for i := 1; i < len(update); i++ {
u, v := update[i-1], update[i]
if !slices.Contains(mapPages[u], v) {
isOk = false
break
}
}
middlePos := len(update) / 2
if isOk {
middlePage, _ := strconv.Atoi(update[middlePos])
middleSumOk += middlePage
} else {
slices.SortFunc(update, func(u, v string) int {
if slices.Contains(mapPages[u], v) {
return -1
} else if slices.Contains(mapPages[v], u) {
return 1
}
return 0
})
middlePage, _ := strconv.Atoi(update[middlePos])
middleSumNotOk += middlePage
}
}
}
fmt.Println("Part 1:", middleSumOk)
fmt.Println("Part 2:", middleSumNotOk)
}
Same, I initially also thought a|b and a|c implies a|c. However when I drew the graph of the example on paper, I suspected that all relations will be given, and coded it with that assumption, that turned out to be correct
I thought of Ernest & Celestine
Agree, I filled like half notebook with this game
Just a bunch of ifs and bounds checking. Part 2 was actually simpler.
func part1(W [][]rune) {
m := len(W)
n := len(W[0])
xmasCount := 0
for i := 0; i < m; i++ {
for j := 0; j < n; j++ {
if W[i][j] != 'X' {
continue
}
if j < n-3 && W[i][j+1] == 'M' && W[i][j+2] == 'A' && W[i][j+3] == 'S' {
// Horizontal left to right
xmasCount++
}
if j >= 3 && W[i][j-1] == 'M' && W[i][j-2] == 'A' && W[i][j-3] == 'S' {
// Horizontal right to left
xmasCount++
}
if i < m-3 && W[i+1][j] == 'M' && W[i+2][j] == 'A' && W[i+3][j] == 'S' {
// Vertical up to down
xmasCount++
}
if i >= 3 && W[i-1][j] == 'M' && W[i-2][j] == 'A' && W[i-3][j] == 'S' {
// Vertical down to up
xmasCount++
}
if j < n-3 && i < m-3 && W[i+1][j+1] == 'M' && W[i+2][j+2] == 'A' && W[i+3][j+3] == 'S' {
// Diagonal left to right and up to down
xmasCount++
}
if j >= 3 && i < m-3 && W[i+1][j-1] == 'M' && W[i+2][j-2] == 'A' && W[i+3][j-3] == 'S' {
// Diagonal right to left and up to down
xmasCount++
}
if j < n-3 && i >= 3 && W[i-1][j+1] == 'M' && W[i-2][j+2] == 'A' && W[i-3][j+3] == 'S' {
// Diagonal left to right and down to up
xmasCount++
}
if j >= 3 && i >= 3 && W[i-1][j-1] == 'M' && W[i-2][j-2] == 'A' && W[i-3][j-3] == 'S' {
// Diagonal right to left and down to up
xmasCount++
}
}
}
fmt.Println(xmasCount)
}
func part2(W [][]rune) {
m := len(W)
n := len(W[0])
xmasCount := 0
for i := 0; i <= m-3; i++ {
for j := 0; j <= n-3; j++ {
if W[i+1][j+1] != 'A' {
continue
}
if W[i][j] == 'M' && W[i][j+2] == 'M' && W[i+2][j] == 'S' && W[i+2][j+2] == 'S' {
xmasCount++
} else if W[i][j] == 'M' && W[i][j+2] == 'S' && W[i+2][j] == 'M' && W[i+2][j+2] == 'S' {
xmasCount++
} else if W[i][j] == 'S' && W[i][j+2] == 'S' && W[i+2][j] == 'M' && W[i+2][j+2] == 'M' {
xmasCount++
} else if W[i][j] == 'S' && W[i][j+2] == 'M' && W[i+2][j] == 'S' && W[i+2][j+2] == 'M' {
xmasCount++
}
}
}
fmt.Println(xmasCount)
}
func main() {
file, _ := os.Open("input.txt")
defer file.Close()
scanner := bufio.NewScanner(file)
var W [][]rune
for scanner.Scan() {
line := scanner.Text()
W = append(W, []rune(line))
}
part1(W)
part2(W)
}
Part 1, just find the regex groups, parse to int, and done.
func part1() {
file, _ := os.Open("input.txt")
defer file.Close()
scanner := bufio.NewScanner(file)
re := regexp.MustCompile(`mul\(([0-9]{1,3}),([0-9]{1,3})\)`)
product := 0
for scanner.Scan() {
line := scanner.Text()
submatches := re.FindAllStringSubmatch(line, -1)
for _, s := range submatches {
a, _ := strconv.Atoi(s[1])
b, _ := strconv.Atoi(s[2])
product += (a * b)
}
}
fmt.Println(product)
}
Part 2, not so simple. Ended up doing some weird hack with a map to check if the multiplication was enabled or not. Also instead of finding regex groups I had to find the indices, and then interpret what those mean… Not very readable code I’m afraid
func part2() {
file, _ := os.Open("input.txt")
defer file.Close()
scanner := bufio.NewScanner(file)
mulRE := regexp.MustCompile(`mul\(([0-9]{1,3}),([0-9]{1,3})\)`)
doRE := regexp.MustCompile(`do\(\)`)
dontRE := regexp.MustCompile(`don't\(\)`)
product := 0
enabled := true
for scanner.Scan() {
line := scanner.Text()
doIndices := doRE.FindAllStringIndex(line, -1)
dontIndices := dontRE.FindAllStringIndex(line, -1)
mulSubIndices := mulRE.FindAllStringSubmatchIndex(line, -1)
mapIndices := make(map[int]string)
for _, do := range doIndices {
mapIndices[do[0]] = "do"
}
for _, dont := range dontIndices {
mapIndices[dont[0]] = "dont"
}
for _, mul := range mulSubIndices {
mapIndices[mul[0]] = "mul"
}
nextMatch := 0
for i := 0; i < len(line); i++ {
val, ok := mapIndices[i]
if ok && val == "do" {
enabled = true
} else if ok && val == "dont" {
enabled = false
} else if ok && val == "mul" {
if enabled {
match := mulSubIndices[nextMatch]
a, _ := strconv.Atoi(string(line[match[2]:match[3]]))
b, _ := strconv.Atoi(string(line[match[4]:match[5]]))
product += (a * b)
}
nextMatch++
}
}
}
fmt.Println(product)
}
Really cool trick. I did a bunch of regex matching that I’m sure I won’t remember how it works few weeks from now, this is so much readable
Go. I actually I haven’t written a single line of Go since last year’s AoC so it’s a good excuse to go again (pun intended).
I liked Digital Minimalism by Cal Newport. I found myself reaching for my phone more often than I would few years back, and doomscrolling at nights, and I got some good tips from this book.
I wouldn’t say it solved all of my issues and I will be taking a look at the other books recommended here. But it did help me reduce screen time and focus more on tasks without feeling that I have to look at my phone every 5 minutes.
Dragon Ball characters, named Bibidi, Babidi and Boo, respectively.
(Ok the last one is called Majin Boo but he’s referred as Boo too)
Tbh these don’t even look that bad. Even many times you peel one of these and they are totally fine on the inside
Cosmo and Wanda don’t fool anyone nowadays
Mario Party Jamboree also pretty cool for party game