reboot6675

joined 2 years ago
[โ€“] reboot6675@sopuli.xyz 1 points 1 year ago

Golang

Avoided recursion by having an array of "pending paths". Whenever I hit a splitter, I follow one of the paths straight away, and push the starting point and direction of the other path to the array.

First time I ran it, hit an infinite loop. Handled it by skipping "|" and "-" if they have been visited already.

Part 2 is the same code as part 1 but I just check all the possible starting points.

Code

package main

import (
	"bufio"
	"fmt"
	"os"
)

type Direction int

const (
	UP    Direction = 0
	DOWN  Direction = 1
	LEFT  Direction = 2
	RIGHT Direction = 3
)

type LightPoint struct {
	row int
	col int
	dir Direction
}

func solve(A [][]rune, start LightPoint) int {
	m := len(A)
	n := len(A[0])
	visited := make([]bool, m*n)
	points := []LightPoint{}
	points = append(points, start)

	for len(points) > 0 {
		current := points[0]
		points = points[1:]
		i := current.row
		j := current.col
		dir := current.dir

		for {
			if i < 0 || i >= m || j < 0 || j >= n {
				break
			}
			if visited[i*n+j] && (A[i][j] == '-' || A[i][j] == '|') {
				break
			}

			visited[i*n+j] = true

			if A[i][j] == '.' ||
				(A[i][j] == '-' && (dir == LEFT || dir == RIGHT)) ||
				(A[i][j] == '|' && (dir == UP || dir == DOWN)) {
				switch dir {
				case UP:
					i--
				case DOWN:
					i++
				case LEFT:
					j--
				case RIGHT:
					j++
				}
				continue
			}

			if A[i][j] == '\\' {
				switch dir {
				case UP:
					dir = LEFT
					j--
				case DOWN:
					dir = RIGHT
					j++
				case LEFT:
					dir = UP
					i--
				case RIGHT:
					dir = DOWN
					i++
				}
				continue
			}

			if A[i][j] == '/' {
				switch dir {
				case UP:
					dir = RIGHT
					j++
				case DOWN:
					dir = LEFT
					j--
				case LEFT:
					dir = DOWN
					i++
				case RIGHT:
					dir = UP
					i--
				}
				continue
			}

			if A[i][j] == '-' && (dir == UP || dir == DOWN) {
				points = append(points, LightPoint{row: i, col: j + 1, dir: RIGHT})
				dir = LEFT
				j--
				continue
			}

			if A[i][j] == '|' && (dir == LEFT || dir == RIGHT) {
				points = append(points, LightPoint{row: i + 1, col: j, dir: DOWN})
				dir = UP
				i--
			}
		}
	}

	energized := 0
	for _, v := range visited {
		if v {
			energized++
		}
	}
	return energized
}

func part1(A [][]rune) {
	start := LightPoint{row: 0, col: 0, dir: RIGHT}
	energized := solve(A, start)
	fmt.Println(energized)
}

func part2(A [][]rune) {
	m := len(A)
	n := len(A[0])
	max := -1

	for i := 0; i < m; i++ {
		start := LightPoint{row: i, col: 0, dir: RIGHT}
		energized := solve(A, start)
		if energized > max {
			max = energized
		}
		start = LightPoint{row: 0, col: n - 1, dir: LEFT}
		energized = solve(A, start)
		if energized > max {
			max = energized
		}
	}

	for j := 0; j < n; j++ {
		start := LightPoint{row: 0, col: j, dir: DOWN}
		energized := solve(A, start)
		if energized > max {
			max = energized
		}
		start = LightPoint{row: m - 1, col: j, dir: UP}
		energized = solve(A, start)
		if energized > max {
			max = energized
		}
	}

	fmt.Println(max)
}

func main() {
	// file, _ := os.Open("sample.txt")
	file, _ := os.Open("input.txt")
	defer file.Close()

	scanner := bufio.NewScanner(file)

	var lines []string
	for scanner.Scan() {
		lines = append(lines, scanner.Text())
	}

	var A [][]rune
	for _, line := range lines {
		A = append(A, []rune(line))
	}

	// part1(A)
	part2(A)
}

[โ€“] reboot6675@sopuli.xyz 3 points 1 year ago (1 children)

On Dream on (Aerosmith), I've always wondered if the couple "missing" notes from the arpeggio in 2:33 are intentional or a mistake.

[โ€“] reboot6675@sopuli.xyz 2 points 1 year ago

I crafted a simple counter-example (single letters for brevity). The way the sequence goes totally depends on the instructions, and we don't have any guarantees on that. It could be anything. Of course, looking at the input data we could find what the instructions are, but the assumption doesn't hold in general.

A = (B, X)
B = (C, X)
C = (X, Z)
Z = (A, C)
X = (X, X)

L L R L L L R R R -> A B C Z A B C Z C Z
L L R R R L L L R -> A B C Z C Z A B C Z

Here the distance of Z cycling back into itself could be 2 or 4, depending on what the instruction string is doing.

[โ€“] reboot6675@sopuli.xyz 8 points 1 year ago

Yeah I got annoyed too. Because this is not implied in the problem statement and it definitely doesn't hold up in general...

[โ€“] reboot6675@sopuli.xyz 7 points 1 year ago

JavaScript and TypeScript too

[โ€“] reboot6675@sopuli.xyz 20 points 1 year ago

Why would the joker remain unused? The problem clearly says joker acts as the card that makes the hand strongest, so in this case, 5 of a kind.

[โ€“] reboot6675@sopuli.xyz 2 points 1 year ago (1 children)

Golang

Pretty straightforward. The only optimization I did is that the pairs are symmetric (3ms hold and 4ms travel is the same as 4ms hold and 3ms travel).

Part 1

file, _ := os.Open("input.txt")
defer file.Close()
scanner := bufio.NewScanner(file)

scanner.Scan()
times := strings.Fields(strings.Split(scanner.Text(), ":")[1])
scanner.Scan()
distances := strings.Fields(strings.Split(scanner.Text(), ":")[1])
n := len(times)
countProduct := 1

for i := 0; i &lt; n; i++ {
	t, _ := strconv.Atoi(times[i])
	d, _ := strconv.Atoi(distances[i])
	count := 0
	for j := 0; j &lt;= t/2; j++ {
		if j*(t-j) > d {
			if t%2 == 0 &amp;&amp; j == t/2 {
				count++
			} else {
				count += 2
			}
		}
	}

	countProduct *= count
}

fmt.Println(countProduct)

Part 2

file, _ := os.Open("input.txt")
defer file.Close()
scanner := bufio.NewScanner(file)

scanner.Scan()
time := strings.ReplaceAll(strings.Split(scanner.Text(), ":")[1], " ", "")
scanner.Scan()
distance := strings.ReplaceAll(strings.Split(scanner.Text(), ":")[1], " ", "")

t, _ := strconv.Atoi(time)
d, _ := strconv.Atoi(distance)
count := 0

for j := 0; j &lt;= t/2; j++ {
	if j*(t-j) > d {
		if t%2 == 0 &amp;&amp; j == t/2 {
			count++
		} else {
			count += 2
		}
	}
}

fmt.Println(count)

[โ€“] reboot6675@sopuli.xyz 6 points 1 year ago

I've always had this question. When I login with Google, I know what data the website will get from my Google account. But what data can Google get from the website and my usage of it, if any? (besides, of course, that I have an account on said website).

[โ€“] reboot6675@sopuli.xyz 22 points 1 year ago

Just a little nitpicking, O(N+10) and O(2N) are not "effectively" the same as O(N). They are truly the same.

[โ€“] reboot6675@sopuli.xyz 3 points 1 year ago (2 children)

La Haine (1995), amazing movie. The lives of others (2006), very good too.

[โ€“] reboot6675@sopuli.xyz 2 points 1 year ago (1 children)

Oh man I hadn't seen a git checkout -b in years haha since they introduced switch and restore, never looked back

view more: โ€น prev next โ€บ