initial commit
This commit is contained in:
commit
26416fffb9
8 changed files with 250 additions and 0 deletions
2
.gitignore
vendored
Normal file
2
.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
*.in
|
||||
.metals/
|
10
README.md
Normal file
10
README.md
Normal file
|
@ -0,0 +1,10 @@
|
|||
# Advent of Code 2021
|
||||
|
||||
| Day | Chicken Scheme | Scala | Python | Nim | |
|
||||
|-----|----------------|--------|--------|-----|---|
|
||||
| 1 | | | | | |
|
||||
| 2 | | | | | |
|
||||
| 3 | part 1 | part 1 | ✅ | | |
|
||||
| 4 | | | ✅ | | |
|
||||
| 5 | | | ✅ | | |
|
||||
| 6 | | | | ✅ | |
|
42
day03.py
Normal file
42
day03.py
Normal file
|
@ -0,0 +1,42 @@
|
|||
#!/usr/bin/env python3
|
||||
import fileinput
|
||||
from copy import deepcopy
|
||||
|
||||
numbers = [[int(i) for i in line.strip()] for line in fileinput.input()]
|
||||
bit_count = len(numbers[0])
|
||||
|
||||
occurrences = [0] * bit_count
|
||||
for number in numbers:
|
||||
for i, bit in enumerate(number):
|
||||
occurrences[i] += bit
|
||||
|
||||
gamma, epsilon = 0, 0
|
||||
for i, freq in enumerate(occurrences):
|
||||
shifted = 1 << (len(occurrences) - 1) >> i
|
||||
if freq > len(numbers) // 2:
|
||||
gamma |= shifted
|
||||
else:
|
||||
epsilon |= shifted
|
||||
|
||||
print("part 1:", gamma * epsilon)
|
||||
|
||||
most_common = deepcopy(numbers)
|
||||
least_common = deepcopy(numbers)
|
||||
|
||||
for i in range(bit_count):
|
||||
ones = sum(number[i] for number in most_common)
|
||||
lc = int(ones * 2 >= len(most_common))
|
||||
most_common = [number for number in most_common if number[i] == lc]
|
||||
if len(most_common) == 1:
|
||||
break
|
||||
|
||||
for i in range(bit_count):
|
||||
zeros = sum(not number[i] for number in least_common)
|
||||
lc = int(zeros * 2 > len(least_common))
|
||||
least_common = [number for number in least_common if number[i] == lc]
|
||||
if len(least_common) == 1:
|
||||
break
|
||||
|
||||
mc = int("".join(str(x) for x in most_common[0]), 2)
|
||||
lc = int("".join(str(x) for x in least_common[0]), 2)
|
||||
print("part 2:", mc * lc)
|
27
day03.scala
Normal file
27
day03.scala
Normal file
|
@ -0,0 +1,27 @@
|
|||
object day03 {
|
||||
def main(args: Array[String]): Unit = {
|
||||
val numbers = io.Source.stdin
|
||||
.getLines()
|
||||
.map(ln => ln.chars.map(_ - '0').toArray)
|
||||
.toArray
|
||||
|
||||
var occurences = Array.fill(numbers(0).length)(0)
|
||||
for (number <- numbers) {
|
||||
for ((bit, i) <- number.zipWithIndex)
|
||||
occurences(i) += bit
|
||||
}
|
||||
|
||||
var gamma = 0
|
||||
var epsilon = 0
|
||||
for ((freq, i) <- occurences.zipWithIndex) {
|
||||
val shifted = 1 << occurences.length - 1 >> i
|
||||
if (freq > (numbers.length / 2))
|
||||
gamma |= shifted
|
||||
else
|
||||
epsilon |= shifted
|
||||
}
|
||||
|
||||
val part1 = gamma * epsilon
|
||||
println(s"part1: $part1")
|
||||
}
|
||||
}
|
17
day03.scm
Normal file
17
day03.scm
Normal file
|
@ -0,0 +1,17 @@
|
|||
(import (chicken string))
|
||||
(import (chicken format))
|
||||
(import (chicken io))
|
||||
(import srfi-14)
|
||||
(import srfi-60)
|
||||
|
||||
(define (add-lines l r)
|
||||
(map (lambda (l r) (+ l (- (char->integer r) 48))) l r))
|
||||
|
||||
(define lines (map string->list (read-lines)))
|
||||
(define counts (foldl add-lines (map (lambda (_) 0) (car lines)) lines))
|
||||
|
||||
(define hl (/ (length lines) 2))
|
||||
(define gamma (list->integer (map (lambda (x) (> x hl)) counts)))
|
||||
(define epsilon (list->integer (map (lambda (x) (< x hl)) counts)))
|
||||
|
||||
(format #t "part 1: ~A~%" (* gamma epsilon))
|
86
day04.py
Normal file
86
day04.py
Normal file
|
@ -0,0 +1,86 @@
|
|||
import fileinput
|
||||
from typing import List, Tuple, Set
|
||||
|
||||
numbers = [int(x) for x in input().split(",")]
|
||||
input()
|
||||
|
||||
Board = List[List[int]]
|
||||
|
||||
boards: List[Board] = []
|
||||
board: Board = []
|
||||
|
||||
while True:
|
||||
try:
|
||||
line = input().strip()
|
||||
except EOFError:
|
||||
break
|
||||
|
||||
if line:
|
||||
board.append([int(x) for x in line.split()])
|
||||
else:
|
||||
boards.append(board)
|
||||
board = []
|
||||
|
||||
if board:
|
||||
boards.append(board)
|
||||
|
||||
|
||||
def find_bingo(drawn: Set[int], wins: Set[int]) -> Tuple[int, int]:
|
||||
for n in numbers:
|
||||
drawn.add(n)
|
||||
|
||||
for b, board in enumerate(boards):
|
||||
for row in board:
|
||||
for col in row:
|
||||
if col not in drawn:
|
||||
break
|
||||
else:
|
||||
if b not in wins:
|
||||
wins.add(b)
|
||||
return b, n
|
||||
|
||||
for x in range(len(board[0])):
|
||||
for y in range(len(board)):
|
||||
if board[y][x] not in drawn:
|
||||
break
|
||||
else:
|
||||
if b not in wins:
|
||||
wins.add(b)
|
||||
return b, n
|
||||
|
||||
raise RuntimeError("no bingo found")
|
||||
|
||||
|
||||
def print_board(board, drawn=frozenset()):
|
||||
for r in board:
|
||||
for c in r:
|
||||
if c in drawn:
|
||||
print("\033[91m", end="")
|
||||
print(str(c).rjust(4), end="\033[0m")
|
||||
print()
|
||||
print()
|
||||
|
||||
|
||||
print(", ".join(str(n) for n in numbers))
|
||||
print()
|
||||
for b in boards:
|
||||
print_board(b)
|
||||
|
||||
print("===")
|
||||
|
||||
drawn = set()
|
||||
wins = set()
|
||||
|
||||
b, last_drawn = find_bingo(drawn, wins)
|
||||
undrawn = sum(number for row in boards[b] for number in row if number not in drawn)
|
||||
part1 = last_drawn * undrawn
|
||||
|
||||
while len(wins) < len(boards):
|
||||
b, last_drawn = find_bingo(drawn, wins)
|
||||
print_board(boards[b], drawn)
|
||||
|
||||
undrawn = sum(number for row in boards[b] for number in row if number not in drawn)
|
||||
part2 = last_drawn * undrawn
|
||||
|
||||
print("part1:", part1)
|
||||
print("part2:", part2)
|
50
day05.py
Executable file
50
day05.py
Executable file
|
@ -0,0 +1,50 @@
|
|||
#!/usr/bin/env python3
|
||||
import fileinput
|
||||
|
||||
N = 1000
|
||||
|
||||
|
||||
def main():
|
||||
diag = [[0] * N for _ in range(N)]
|
||||
|
||||
vents = [
|
||||
[
|
||||
tuple(int(coord) for coord in coords.split(","))
|
||||
for coords in str(line).split(" -> ")
|
||||
]
|
||||
for line in fileinput.input()
|
||||
]
|
||||
|
||||
for (x1, y1), (x2, y2) in vents:
|
||||
xsign = -1 if x2 < x1 else 1
|
||||
ysign = -1 if y2 < y1 else 1
|
||||
|
||||
if x1 == x2:
|
||||
# vertical line
|
||||
for y in range(y1, y2 + ysign, ysign):
|
||||
diag[y][x1] += 1
|
||||
elif y1 == y2:
|
||||
# horizontal line
|
||||
for x in range(x1, x2 + xsign, xsign):
|
||||
diag[y1][x] += 1
|
||||
|
||||
part1 = sum(point >= 2 for row in diag for point in row)
|
||||
print("part 1:", part1)
|
||||
|
||||
for (x1, y1), (x2, y2) in vents:
|
||||
xsign = -1 if x2 < x1 else 1
|
||||
ysign = -1 if y2 < y1 else 1
|
||||
|
||||
if x1 != x2 and y1 != y2:
|
||||
# diagonal line
|
||||
y = y1
|
||||
for x in range(x1, x2 + xsign, xsign):
|
||||
diag[y][x] += 1
|
||||
y += ysign
|
||||
|
||||
part2 = sum(point >= 2 for row in diag for point in row)
|
||||
print("part 2:", part2)
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
main()
|
16
day06.nim
Normal file
16
day06.nim
Normal file
|
@ -0,0 +1,16 @@
|
|||
from std/strutils import split, parseInt
|
||||
from std/sequtils import map, foldl
|
||||
|
||||
let numbers = readLine(stdin).split(',').map(parseInt)
|
||||
var buckets: array[9, int]
|
||||
|
||||
for number in numbers:
|
||||
buckets[number] += 1
|
||||
|
||||
for i in 0..<256:
|
||||
buckets[(i + 7) mod 9] += buckets[i mod 9]
|
||||
|
||||
if i == 79:
|
||||
echo("part 1: ", buckets.foldl(a + b))
|
||||
|
||||
echo("part 2: ", buckets.foldl(a + b))
|
Loading…
Reference in a new issue