initial commit
This commit is contained in:
commit
c1e8e3f1c3
|
@ -0,0 +1,2 @@
|
|||
*.in
|
||||
*.ex
|
|
@ -0,0 +1,19 @@
|
|||
import hashlib
|
||||
|
||||
def main():
|
||||
INPUT = b"yzbqklnj"
|
||||
DIFFICULTY = 5
|
||||
i = 0
|
||||
|
||||
END = "0" * DIFFICULTY
|
||||
|
||||
while True:
|
||||
message = INPUT + str(i).encode("ascii")
|
||||
digest = hashlib.md5(message).hexdigest()
|
||||
if digest[:DIFFICULTY] == END:
|
||||
print(i)
|
||||
break
|
||||
|
||||
i += 1
|
||||
|
||||
main()
|
|
@ -0,0 +1,22 @@
|
|||
import fileinput
|
||||
|
||||
part1 = 0
|
||||
part2 = 0
|
||||
|
||||
for line in fileinput.input():
|
||||
if (
|
||||
sum(1 for c in line if c in "aeiou") >= 3
|
||||
and any(line[i] == line[i + 1] for i in range(len(line) - 1))
|
||||
and not ("ab" in line or "cd" in line or "pq" in line or "xy" in line)
|
||||
):
|
||||
part1 += 1
|
||||
|
||||
if any(line[i] == line[i + 2] for i in range(len(line) - 2)) and any(
|
||||
line[i : i + 2] == line[j : j + 2]
|
||||
for i in range(len(line) - 4)
|
||||
for j in range(i + 2, len(line) - 2)
|
||||
):
|
||||
part2 += 1
|
||||
|
||||
|
||||
print(part1, part2)
|
|
@ -0,0 +1,83 @@
|
|||
identification division.
|
||||
program-id. day06.
|
||||
|
||||
data division.
|
||||
working-storage section.
|
||||
01 input-line pic x(100).
|
||||
|
||||
01 action pic x(10).
|
||||
01 coords pic x(100).
|
||||
01 start-coords pic x(100).
|
||||
01 end-coords pic x(100).
|
||||
|
||||
01 start-x pic 9(10).
|
||||
01 end-x pic 9(10).
|
||||
01 start-y pic 9(10).
|
||||
01 end-y pic 9(10).
|
||||
|
||||
01 x pic 9(10).
|
||||
01 y pic 9(10).
|
||||
|
||||
01 temp pic 9.
|
||||
01 matrix-table.
|
||||
05 occurs 1000 times.
|
||||
10 occurs 1000 times.
|
||||
15 matrix pic 9 value 0.
|
||||
|
||||
procedure division.
|
||||
accept input-line.
|
||||
perform input-loop-para until input-line = SPACE.
|
||||
|
||||
* Count the lit lights
|
||||
move 0 to x.
|
||||
inspect matrix-table tallying x for all '1'.
|
||||
display x.
|
||||
|
||||
stop run.
|
||||
|
||||
input-loop-para.
|
||||
display input-line.
|
||||
|
||||
if input-line(1:7) = "turn on" then
|
||||
move "turn on" to action
|
||||
move input-line(9:) to coords
|
||||
end-if.
|
||||
if input-line(1:8) = "turn off" then
|
||||
move "turn off" to action
|
||||
move input-line(10:) to coords
|
||||
end-if.
|
||||
if input-line(1:7) = "toggle" then
|
||||
move "toggle" to action
|
||||
move input-line(8:) to coords
|
||||
end-if.
|
||||
|
||||
unstring coords delimited by " through "
|
||||
into start-coords, end-coords.
|
||||
|
||||
unstring start-coords delimited by "," into start-x, start-y
|
||||
unstring end-coords delimited by "," into end-x, end-y
|
||||
|
||||
move start-y to y.
|
||||
perform outer-loop-para until y > end-y.
|
||||
|
||||
accept input-line.
|
||||
|
||||
outer-loop-para.
|
||||
move start-x to x.
|
||||
perform inner-loop-para until x > end-x.
|
||||
add 1 to y.
|
||||
|
||||
inner-loop-para.
|
||||
if action = "turn on" then
|
||||
move 1 to matrix(y + 1, x + 1).
|
||||
|
||||
if action = "turn off" then
|
||||
move 0 to matrix(y + 1, x + 1).
|
||||
|
||||
if action = "toggle" then
|
||||
move 1 to temp
|
||||
subtract matrix(y + 1, x + 1) from temp
|
||||
move temp to matrix(y + 1, x + 1)
|
||||
end-if.
|
||||
|
||||
add 1 to x.
|
|
@ -0,0 +1,85 @@
|
|||
identification division.
|
||||
program-id. day06.
|
||||
|
||||
data division.
|
||||
working-storage section.
|
||||
01 input-line pic x(40).
|
||||
|
||||
01 action pic x(8).
|
||||
01 coords pic x(30).
|
||||
01 start-coords pic x(7).
|
||||
01 end-coords pic x(7).
|
||||
|
||||
01 start-x pic 9(3) comp-x.
|
||||
01 end-x pic 9(3) comp-x.
|
||||
01 start-y pic 9(3) comp-x.
|
||||
01 end-y pic 9(3) comp-x.
|
||||
|
||||
01 x pic 9(4) comp-x.
|
||||
01 y pic 9(4) comp-x.
|
||||
|
||||
01 matrix-table.
|
||||
05 occurs 1000 times.
|
||||
10 occurs 1000 times.
|
||||
15 matrix pic 9(2) comp-x value 0.
|
||||
|
||||
01 brightness pic 9(9) comp-x.
|
||||
|
||||
procedure division.
|
||||
accept input-line.
|
||||
perform input-loop-para until input-line = SPACE.
|
||||
|
||||
move 1 to y.
|
||||
perform count-outer-para until y > 1000.
|
||||
display brightness.
|
||||
|
||||
stop run.
|
||||
|
||||
input-loop-para.
|
||||
if input-line(1:7) = "turn on" then
|
||||
move "turn on" to action
|
||||
move input-line(9:) to coords
|
||||
else if input-line(1:8) = "turn off" then
|
||||
move "turn off" to action
|
||||
move input-line(10:) to coords
|
||||
else if input-line(1:7) = "toggle" then
|
||||
move "toggle" to action
|
||||
move input-line(8:) to coords
|
||||
end-if.
|
||||
|
||||
unstring coords delimited by " through "
|
||||
into start-coords, end-coords.
|
||||
|
||||
unstring start-coords delimited by "," into start-x, start-y
|
||||
unstring end-coords delimited by "," into end-x, end-y
|
||||
|
||||
move start-y to y.
|
||||
perform outer-loop-para until y > end-y.
|
||||
|
||||
accept input-line.
|
||||
|
||||
outer-loop-para.
|
||||
add 1 to y.
|
||||
|
||||
move start-x to x.
|
||||
perform inner-loop-para until x > end-x.
|
||||
|
||||
inner-loop-para.
|
||||
add 1 to x.
|
||||
|
||||
if action = "turn on" then
|
||||
add 1 to matrix(y, x)
|
||||
else if action = "turn off" and matrix(y, x) > 0 then
|
||||
subtract 1 from matrix(y, x)
|
||||
else if action = "toggle" then
|
||||
add 2 to matrix(y, x)
|
||||
end-if.
|
||||
|
||||
count-outer-para.
|
||||
move 1 to x.
|
||||
perform count-inner-para until x > 1000.
|
||||
add 1 to y.
|
||||
|
||||
count-inner-para.
|
||||
add matrix(y, x) to brightness.
|
||||
add 1 to x.
|
|
@ -0,0 +1,48 @@
|
|||
import fileinput
|
||||
from collections import deque
|
||||
|
||||
|
||||
input = []
|
||||
for line in fileinput.input():
|
||||
expression, wire = line.strip().split(" -> ")
|
||||
input.append((expression.split(), wire))
|
||||
|
||||
|
||||
def simulate(wires):
|
||||
def get(signal):
|
||||
if signal.isdigit():
|
||||
return int(signal)
|
||||
else:
|
||||
return wires[signal]
|
||||
|
||||
queue = deque(input)
|
||||
while queue:
|
||||
expression, wire = queue.popleft()
|
||||
if wire in wires:
|
||||
continue
|
||||
|
||||
try:
|
||||
match expression:
|
||||
case [signal]:
|
||||
wires[wire] = get(signal)
|
||||
case ["NOT", signal]:
|
||||
wires[wire] = ~get(signal)
|
||||
case [left, "AND", right]:
|
||||
wires[wire] = get(left) & get(right)
|
||||
case [left, "OR", right]:
|
||||
wires[wire] = get(left) | get(right)
|
||||
case [left, "LSHIFT", right]:
|
||||
wires[wire] = get(left) << get(right)
|
||||
case [left, "RSHIFT", right]:
|
||||
wires[wire] = get(left) >> get(right)
|
||||
except KeyError:
|
||||
queue.append((expression, wire))
|
||||
|
||||
return wires["a"]
|
||||
|
||||
|
||||
part1 = simulate({})
|
||||
print("part 1:", part1)
|
||||
|
||||
part2 = simulate({"b": part1})
|
||||
print("part 2:", part2)
|
|
@ -0,0 +1,10 @@
|
|||
import fileinput
|
||||
|
||||
part1, part2 = 0, 0
|
||||
|
||||
for line in fileinput.input():
|
||||
line = line.strip()
|
||||
part1 += len(line) - len(eval(line))
|
||||
part2 += line.count("\\") + line.count('"') + 2
|
||||
|
||||
print(part1, part2)
|
|
@ -0,0 +1,23 @@
|
|||
import fileinput
|
||||
from itertools import permutations
|
||||
|
||||
|
||||
def main():
|
||||
graph = {}
|
||||
cities = set()
|
||||
|
||||
for line in fileinput.input():
|
||||
route, distance = line.split(" = ", 1)
|
||||
source, dest = route.split(" to ", 1)
|
||||
graph[(source, dest)] = graph[(dest, source)] = int(distance)
|
||||
cities.add(source)
|
||||
cities.add(dest)
|
||||
|
||||
lengths = [
|
||||
sum(graph[(route[i], route[i + 1])] for i in range(len(route) - 1))
|
||||
for route in permutations(cities)
|
||||
]
|
||||
|
||||
print(min(lengths), max(lengths))
|
||||
|
||||
main()
|
|
@ -0,0 +1,13 @@
|
|||
lines = ARGF.read.split "\n"
|
||||
graph = Hash.new { |h, k| h[k] = [] }
|
||||
|
||||
# parse input and build graph
|
||||
lines.each do |line|
|
||||
line.match /(\w+) to (\w+) = (\d+)/ do |m|
|
||||
graph[m[1]] << [m[2], m[3].to_i]
|
||||
end
|
||||
end
|
||||
|
||||
puts graph.inspect
|
||||
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
import fileinput
|
||||
|
||||
input = [int(i) for i in next(fileinput.input()).strip()]
|
||||
|
||||
def solve(n):
|
||||
global input
|
||||
|
||||
for _ in range(n):
|
||||
new_input = []
|
||||
current = input[0]
|
||||
count = 0
|
||||
|
||||
for c in input:
|
||||
if c == current:
|
||||
count += 1
|
||||
else:
|
||||
new_input.extend((count, current))
|
||||
current, count = c, 1
|
||||
|
||||
new_input.extend((count, current))
|
||||
input = new_input
|
||||
|
||||
print(len(input))
|
||||
|
||||
solve(40)
|
||||
solve(10)
|
||||
|
|
@ -0,0 +1,27 @@
|
|||
$input = ARGF.read.chomp.chars.map { |c| c.to_i }
|
||||
|
||||
def solve(n)
|
||||
n.times do
|
||||
new_input = []
|
||||
current = $input[0]
|
||||
count = 0
|
||||
|
||||
$input.each do |c|
|
||||
if c == current then
|
||||
count += 1
|
||||
else
|
||||
new_input << count << current
|
||||
current = c
|
||||
count = 1
|
||||
end
|
||||
end
|
||||
|
||||
new_input << count << current
|
||||
$input = new_input
|
||||
end
|
||||
|
||||
puts $input.size
|
||||
end
|
||||
|
||||
solve(40)
|
||||
solve(10)
|
|
@ -0,0 +1,44 @@
|
|||
input = "cqjxjnds"
|
||||
|
||||
pw = [ord(c) - ord("a") for c in input]
|
||||
pw[-1] += 1
|
||||
|
||||
part1, part2 = None, None
|
||||
|
||||
while not part2:
|
||||
# increment pw
|
||||
pw[-1] += 1
|
||||
for i in range(len(pw) - 1, 0, -1):
|
||||
if pw[i] >= 26:
|
||||
pw[i - 1] += 1
|
||||
pw[i] = 0
|
||||
else:
|
||||
break
|
||||
|
||||
if 8 in pw:
|
||||
pw[pw.index(8)] += 1
|
||||
if 11 in pw:
|
||||
pw[pw.index(11)] += 1
|
||||
if 14 in pw:
|
||||
pw[pw.index(14)] += 1
|
||||
|
||||
for i in range(len(pw) - 2):
|
||||
if pw[i] + 2 == pw[i + 1] + 1 == pw[i + 2]:
|
||||
break
|
||||
else:
|
||||
continue
|
||||
|
||||
pairs = 0
|
||||
for i in range(len(pw) - 1):
|
||||
c = pw[i]
|
||||
if c == pw[i + 1] and (i == 0 or c != pw[i - 1]):
|
||||
pairs += 1
|
||||
if pairs < 2:
|
||||
continue
|
||||
|
||||
if not part1:
|
||||
part1 = "".join(chr(c + ord("a")) for c in pw)
|
||||
else:
|
||||
part2 = "".join(chr(c + ord("a")) for c in pw)
|
||||
|
||||
print(part1, part2)
|
|
@ -0,0 +1,34 @@
|
|||
import sys
|
||||
import json
|
||||
from pprint import pprint
|
||||
import re
|
||||
from typing import Any
|
||||
|
||||
doc = json.load(sys.stdin)
|
||||
part1, part2 = 0, 0
|
||||
|
||||
def iter(x):
|
||||
if type(x) is list:
|
||||
return list, list(enumerate(x))
|
||||
else:
|
||||
return dict, list(x.items())
|
||||
|
||||
stack: Any = [(type(doc) is dict and "red" in doc.values(), doc)]
|
||||
while stack:
|
||||
red, x = stack.pop()
|
||||
|
||||
if type(x) is dict:
|
||||
red = red or "red" in x.values()
|
||||
for v in x.values():
|
||||
stack.append((red, v))
|
||||
elif type(x) is list:
|
||||
for v in x:
|
||||
stack.append((red, v))
|
||||
elif type(x) is int:
|
||||
part1 += x
|
||||
if not red:
|
||||
part2 += x
|
||||
|
||||
|
||||
|
||||
print(part1, part2)
|
Loading…
Reference in New Issue