Compare commits

..

19 Commits

Author SHA1 Message Date
85b64b3ef6 2022 day 12 2022-12-13 00:13:15 +00:00
762f9b0700 2022 day 11 2022-12-11 14:59:39 +00:00
47a16a9b6a 2022 day 10 2022-12-10 08:12:17 +00:00
c474e4b25e 2022 day 9 2022-12-09 23:39:01 +00:00
4de4e05050 2022 day 8 2022-12-08 21:44:04 +00:00
afcbbaea49 2022 day 7 2022-12-07 10:23:41 +00:00
83a09fb74b Attention to detail 2022-12-06 23:48:12 +00:00
e2515cc93a Update README.md 2022-12-06 23:45:24 +00:00
9a84104dbe 2022 day 6 2022-12-06 21:11:48 +00:00
dae686df17 2022 day 5 2022-12-05 11:33:45 +00:00
35b065f882 2022 day 4 2022-12-04 18:03:18 +00:00
4678f22963 2022 day 3 2022-12-03 09:10:39 +00:00
3ccc8b3ebf 2022 day 2 2022-12-02 18:52:42 +00:00
2c9c2248ab 2022 day 1 2022-12-01 17:41:05 +00:00
e0dabfc0a1 2021: day3p1 2022-01-09 19:41:47 +00:00
ac039d70e3 Remove an unneeded variable 2022-01-09 18:41:19 +00:00
e29c8b94eb 2021 day 2 2022-01-09 18:36:33 +00:00
d7416215e7 2021 day 1 2022-01-09 17:50:50 +00:00
bf5c0da352 Initial README 2022-01-09 17:18:44 +00:00
45 changed files with 14937 additions and 0 deletions

2000
2021/01/input Normal file

File diff suppressed because it is too large Load Diff

14
2021/01/part1 Executable file
View File

@@ -0,0 +1,14 @@
#!/usr/bin/env python
last_depth = -1
count = 0
with open('input') as f:
for line in f:
depth = int(line)
if last_depth > 0 and last_depth < depth:
count = count +1
last_depth = depth
print(count)

25
2021/01/part2 Executable file
View File

@@ -0,0 +1,25 @@
#!/usr/bin/env python
last = -1
count = 0
with open('input') as f:
window = []
for line in f:
depth = int(line)
window.append(depth)
if len(window) < 3:
continue
if len(window) > 3:
window.pop(0)
cur = sum(window)
if last > 0 and last < cur:
count = count +1
last = cur
print(count)

1000
2021/02/input Normal file

File diff suppressed because it is too large Load Diff

24
2021/02/part1 Executable file
View File

@@ -0,0 +1,24 @@
#!/usr/bin/env python
depth = 0
hPos = 0
with open('input') as f:
for line in f:
cmd, numStr = line.split(" ", 2)
num = int(numStr)
# match...case is python 3.10+
if cmd == "forward":
hPos = hPos + num
elif cmd == "backward":
hPos = hPos - num
elif cmd == "up":
depth = depth - num
elif cmd == "down":
depth = depth + num
else:
raise "unknown command: "+cmd
print(depth * hPos)

26
2021/02/part2 Executable file
View File

@@ -0,0 +1,26 @@
#!/usr/bin/env python
depth = 0
hPos = 0
aim = 0
with open('input') as f:
for line in f:
cmd, numStr = line.split(" ", 2)
num = int(numStr)
# match...case is python 3.10+
if cmd == "forward":
hPos = hPos + num
depth = depth + (aim*num)
elif cmd == "backward":
hPos = hPos - num
elif cmd == "up":
aim = aim - num
elif cmd == "down":
aim = aim + num
else:
raise "unknown command: "+cmd
print(depth * hPos)

1000
2021/03/input Normal file

File diff suppressed because it is too large Load Diff

28
2021/03/part1 Executable file
View File

@@ -0,0 +1,28 @@
#!/usr/bin/env python
gamma = 0
epsilon = 0
with open('input') as f:
total = 0
g_counts = [0,0,0,0,0,0,0,0,0,0,0,0]
e_counts = [0,0,0,0,0,0,0,0,0,0,0,0]
for line in f:
total += 1
for idx, chr in enumerate(line[0:12]):
if chr == '1':
g_counts[idx]+=1
else:
e_counts[idx]+=1
target = total / 2
for idx, val in enumerate(g_counts):
if val > target:
gamma += (1 << (11-idx))
for idx, val in enumerate(e_counts):
if val > target:
epsilon += (1 << (11-idx))
print(gamma * epsilon)

2267
2022/01/input Normal file

File diff suppressed because it is too large Load Diff

23
2022/01/part1 Executable file
View File

@@ -0,0 +1,23 @@
#!/usr/bin/env python
elves = []
with open('input') as f:
elf = []
for line in f:
if line == "\n":
elves.append(elf)
elf = []
else:
calories = int(line)
elf.append(calories)
most = 0
for elf in elves:
calories = sum(elf)
if calories > most:
most = calories
print(most)

15
2022/01/part2 Executable file
View File

@@ -0,0 +1,15 @@
#!/usr/bin/env python
elves = []
with open('input') as f:
elf = []
for line in f:
if line == "\n":
elves.append(elf)
elf = []
else:
calories = int(line)
elf.append(calories)
print(sum(sorted(map(sum, elves), reverse=True)[0:3]))

2500
2022/02/input Normal file

File diff suppressed because it is too large Load Diff

33
2022/02/part1 Executable file
View File

@@ -0,0 +1,33 @@
#!/usr/bin/env python
# lose: 0
# draw: 3
# win: 6
outcomes = {
'A': { # rock: 1
'X': 1 + 3, # rock
'Y': 2 + 6, # paper
'Z': 3 + 0 # scissors
},
'B': { # paper: 2
'X': 1 + 0, # rock
'Y': 2 + 3, # paper
'Z': 3 + 6 # scissors
},
'C': { # scissors: 3
'X': 1 + 6, # rock
'Y': 2 + 0, # paper
'Z': 3 + 3 # scissors
}
}
score = 0
with open('input') as f:
for line in f:
moves = line.rstrip().split(" ")
score = score + outcomes[moves[0]][moves[1]]
print(score)

66
2022/02/part2 Executable file
View File

@@ -0,0 +1,66 @@
#!/usr/bin/env python
# lose: 0
# draw: 3
# win: 6
# x: need to lose
# y: need to draw
# z: need to win
ROCK = 'A'
PAPER = 'B'
SCISSORS = 'C'
LOSE = 'X'
DRAW = 'Y'
WIN = 'Z'
outcomes = {
ROCK: { # rock: 1
ROCK: 1 + 3, # rock
PAPER: 2 + 6, # paper
SCISSORS: 3 + 0 # scissors
},
PAPER: { # paper: 2
ROCK: 1 + 0, # rock
PAPER: 2 + 3, # paper
SCISSORS: 3 + 6 # scissors
},
SCISSORS: { # scissors: 3
ROCK: 1 + 6, # rock
PAPER: 2 + 0, # paper
SCISSORS: 3 + 3 # scissors
}
}
strategies = {
ROCK: {
LOSE: SCISSORS,
DRAW: ROCK,
WIN: PAPER
},
PAPER: {
LOSE: ROCK,
DRAW: PAPER,
WIN: SCISSORS
},
SCISSORS: {
LOSE: PAPER,
DRAW: SCISSORS,
WIN: ROCK
}
}
score = 0
with open('input') as f:
for line in f:
parts = line.rstrip().split(" ")
oppo_move = parts[0]
our_move = strategies[oppo_move][parts[1]]
score = score + outcomes[oppo_move][our_move]
print(score)

300
2022/03/input Normal file
View File

@@ -0,0 +1,300 @@
fzmmmfwDWFzlQQqjCQjDGnqq
tJHJvLJVVttNsvTtTvgHHSVwCsQRQQZCZZMqQMQBnqBMQs
LgThNJhNSgTJVgvgtghPhbpfWzfbwfPmpprb
lDLnSnLZRjmWrlhrFF
PffQJNqJbPZbpmjrrCVNFmCh
qzbcbqfMfZMTfQTqqzzTPPLMHgBBBtHRStvgHRDBnSRL
WPZfJlZZCMwwZPWCwWzVHQhsshVSsfNQHdvQNN
FLGDGGnGdVjQQQDQ
ccFFbggLnRcLFRtFBmnJzdZZzZBMpwJlZMppMp
RZsnCZssCnDccJCnfcQfHTdzMzhdLdMTqdRqpRLwqq
tNrGNrrvGhTThQqw
rrFStPgrFWWgvmPgQjtmNtmJcfJcsJsZblDZfbfHDFHnfl
RdTfgbbPbJWDDqRvsDsmVG
NSQZLQZHpFGLqnLszrJm
ZMSNMHhNZMMSQwhQJWPBJCbhbcgtgfcJ
qZfqPvLnnZGpGpCJlvsMsMlHJJHB
mTWFFFTTtVSJMzzjWgSH
RbVdtdFtcrmbRQDDVHDQTbDNwLPLfnqZnhZhQnNwfNqnnn
nhHfSGHGThhZjnhrrSnsSczdzlfzzdQQVzRNFNcFdl
JJvCDvmCbtvpvbMmDvLbCJpmqdVVVcMcNGzRcNFcRRzRclQd
vwDCwtLmwLBDJmCHHjHHWGZHBnsnnj
QWTMqZhThbTbLwtGBrQfQQNr
jdzSSccVPPcgcLrDBtDVwCfNNC
vcBgcmssccplTnnTqsMhWW
FlcwZhBhGZhFJnGtZZFwlGsWRLHdWqMzPjWRLTLJHHjdWq
vfmrmbpfpMfzjHjfdM
VCSmVpmrNDMZhSMcsFnh
nHqQVtVZGGwwwnSF
fMBBBWCsCfMMbWfbsGmGzFjQGQFCPhFQhF
fbcsWpJRsWlcNVLtqtLLQcZQ
rgNJdfNJpgpJVMMVfmfVJgCtCTqqqzwTqrBsTswcCCss
lFLHGWLvHQFhnQFhbFnbHWWPBtwqzBPTcsPTswZCPBGCTC
QQtbRtLhtjgdfMRMDV
jTRhJpGhQPfPLsDhWh
wVVMbqbHwVwwMplHWfsfNmWcSLqcLmSs
lVCZlHnwHdRpRGvZTBGJ
csppppDDbGLbSqndFHHNdHsH
lVTlgWgjzCzfgvfggZWWlnHPPBHrSCqBmrSBrHHBnF
QFgvFfjTvZjzlvVTWljvTtMbLcccbRRMbwLMMLQLbw
tjhLjLJzpJpwjsqqfQqNrNfRnsRR
WvwGBPwWZZrnbBNrNnnC
PDvGVTgvTMGvZTGTPvWDZVJjljtLzhtmLlJjwJVJLm
WbzpSNswNWszwSLgSNMcrrBfPJJcfsHMrvMv
CFllhlGFDVFRCmhQDlDTBBcvgBCTcHPHrfrHTJ
qGRgVFhDDZmDnDqhgQFGqzwtzSjddwZbzwpLNzjpdS
FlpZrQSJJmQpSpqlQgbbRZCgGCZdDdbNdd
WswHfjfnhWPFDsFRDcbBbR
WjHvjjWTfTvHFjzvPnPtttVTTJVLtJSpmtlltp
tnjrnnnnhNlPBtbbcWpZScpjbZSz
wmsFqfqqqGHTLbzpLLbgzMcH
FGJqsmQGRVFwwQJschPdhPrBndBhtPhrQQ
dRdJRfTnCRNlJjPBDmBJsbBDzm
wSFWSgGVSLwpFhpLhQjzgPzbtDPDbPBsztrP
WMGvVMLLBCclNHHRlM
gfSffQBDBtZvwwpWDHcbwb
JnCmmJCRmztsVPJRFjFchcGGWFWcGcHFvGLvHF
VCPzJnsPVCjtPjdMsMdmVmMBfgTZBTMfSfZSSlfNNgSSfg
lwHJSVZHWWVwJQwbbVVtwWVVdpdPfRfgDLPZLTZLDLgRDTZL
hhBrBqRcnhsFFfddmdmmCmmppn
MNNBBRRshNHbtVMzQJMM
NBsSNtLNTtNsvlTBBRLgFSCbFmbHFCFhgcghSm
WJWWDdVzDZJjDJQcCDHmmhCnmHmHFm
zQVdQZQwqVQHjqzWWWdHpzMwGMBlGLLtTvRvRNsMwwNN
ZCztttSjGSqRZgRPDNQQNr
hLvmHshLmLcFwwhhwLqMVRRRJQQVNnRJMVRDNNRr
HFhTpFqqLcssmqmFftblBSjCjStjbGWBfj
crffjHDfrQfnfpLPgbgP
TmFvFCmFTFFCtNsmMsRvlRTpPbLGMnGSngPppShGpbdgGJ
vmslmwTNmtstzFsCvRFrHBrDZzcQnWqcDDHqQB
LQLPVLGdGrRPRhHgwMhllhhs
ZbSZTNqSZfNqNCtSSmTttbpSWMlzWlslpWHsWgJWhwJzBMlz
bqjqqFFjHqTTTZTmSNbfmdrFQnDdcvVDGQDvvVnQnr
mQdcdsSThlccSWhMgDnQnFtjQPtnjPNvtR
zzsGwzrrHGBfZJGrJpDtNHFjvNvDvVRvNRtV
wZBCGrbrszTbThcTcLcb
gJDDDDcPQgQfNFPhhZGDDcZZSLVtlCqzsMlzqpszlsVtFSql
bBrdwHTrHWTrTtzLlSMCCCprCq
dnBwRvmnbmBvTpbnbWbTjZPQJhhchmJcmcQPfmGNcJ
sjMGBLWGZjsLjJTBCCbvNrBCHC
mpcRfDSSdqDdlRqdwRvFrHFbrHJFJVvDVrTb
qvlgqwpcSQSfLjjhzgnMzsnP
VgmLHHNRNVLNhsNgRHLltjjbCWnCWZbldntW
GGMFPJqPwJGTvvCCdqdqlqCj
rGwGrMQzJQBjJwTVHgDQDHcsfhVhVg
pblwGBlFlWwwlgCSFwbLvQZFvzvZhzvmQTLLzJ
HfqccHzVDNqLmmPmPPQZ
MNtrVdDjHtrzGBdbGWCblw
NNhnnLdnnfhdhVjvThvqVvCj
tHtHBzBGWHBWGtPBSvvpGZVbSsTFjSqqVbscgjCjqqSC
HBtzJHzzpDZpzMWpGPtWHvZwQmNLlmQnmNdfMmNRmwmlwd
QzGqGwmbfTdPBgRRcgmMPC
NtNZhljrNjrSrtltWlCJCJJfcVVRcJcRgPjf
NlWSZZWsHhWWlprSSvZWHrWfQLLQbLGfQpQzzTFQbwzQdd
gcwcSnccnwLRRSzcBQRvZZdvtNtvRbQJQv
CqrCrrPsVstvbfDfbb
TPlPVhWFFMGMnMjbcT
gjjHGvcHgsgbSRQbRFWbjC
ttnBTNSSfwBLzplWPPdlLlMPlMCQ
TBZpDtmnnZNvhJDHggqqgS
zfqzzGwMbllcJFqm
NpHgpRZrRpSrSZLghlTjchNlNbhFmchb
RHLWHgLBggZpHpgHRZrLgZLQCMzCfDWGMCzMQQGvPmvvfC
bBWWlFFBBFdVMLfvsfjrtBvTrr
qZsgNZzcwfjZrfPf
gcnNNcDncsDGzggDnNRJnzHhmlMVSSbhVVVmMbbhVmMlGl
dNNRQszqRhPNfddWltvDltMMNlnncv
ZjZbpgpSpjpJgpCCpbFlTnSDTlzclDnMvnnMlT
GCJpjbgzJCpwZwrHZrgHsRBwBVRRsqdqPhLBQqsP
mnnVCcwGwnsVJntmfnBtBhTDzpzzpDWbDbsLLzpWDz
FcHQdZSRHbhZZWWhrW
dNljMlPPHdMPvRlHMRdjRRNBnwJfCVqwqqffCfCwtcBV
ZGtGzBBGjvdZvLWLcrPVcZcsNVNmVpcH
MnlgngCJMgJbhfDbCDPrHHVcNNrVpbVpVmmcVq
lSPhlClftSSBvdGS
jFhGqVCcPMMdGFqczBltzrtglrsrjBgB
wWgwvfDZvnpmnHwHTfNpDbtRWbzltRlSrRlbBSbbzt
fHJvJvvTwwJPhCccgQCM
BrrrBVgNppDVBbTgDvqWdWZqWqwNmNNHvH
sHsHnHlcJjFwMMFFvGdPvv
HllCQCJQJsnjgtVTbBgpQrSr
JgLPLwbhBrCbLBCJPFFlPFZRTNTZFRqlRq
pmffSWvDcfSfGmvsNHZsTRsWllssbT
vDddMmScdStfzGcpzzwhJwJwnCbLwwLLCwht
sWSSvmsZsdZPWdLPRRsmSrrnlnvJjfnggfrgtfjnjr
VWWWBhhHBBHtljMMfJHrrt
WWqpWVqQqLNGRNZP
QHjjGVBQpffpjqppQsSsQHWJcVVgJFWcFTWgNLggFPNc
bzzmbzzZnZztFTNJWRqmqcgJ
zDZlqMtbwhCBBfppvHDGvf
BNTdfWJmzHNHHzzTdLCfCfCswQjRjljVsh
FbGnrFnrPGSSvGPFZFFPGClLQpjQRwLjLplQhRlsrQ
GbnvvgvPFwbwcnZMMGSFvFHdNHmTBNJNmmmDTJDBmWcT
rBhRPrjJrRtTHtWHWcjc
SDdGqmhdFSqblLGlHHfHWl
DSSmFqhsFqFdzqFgwsVnvBQPPQPQVrnRsJMR
NZcgQdmSwZgdPFPVNFPqqVVF
hlhhjMhGjLhLDGDhCBJDCrRFRrqqpLPfpfPRVPprPm
MlhjlMDDJTCmZddQQSTcTT
zRddrwzwNhrzrtCLtLfsLrqflC
MbSDZvVwGZpJwvHvBVfsqtjqlsPPfsqsfclb
vJpvJvZTVgTdTgwdTn
SZMsTTScDMqwtDDJ
VWrbzFvnrvFQQtnhzdPFmfwGfqmGPfDwmfPJ
rrLbrnVrLvVQpLHSHjsTBBjZBt
bSrpbWpPpfzPRWrWvhJgddrcccgFnFss
ljGNTCtMNLGQjNMjQMGtZJDDggcldcFcvhdFddnhhF
vNCmQMjmvGzpRPPzzmfw
BrbdcqcdSZRLQltNDqFpCpHH
jnTzWsWjWjwTQnzMvFlCzNDhNhDCFGpHpH
wmmvjVQMvwmsQMMwnsTPgVfgJcLcgfSbbBdBbJSdbSBS
bJFbMdcmgFSFgmggJFcGwjRdzPWZWGDDGGRwGD
hrttffCVVCTVlrttQwzRzwWTqRGDGwjTvG
rfLChHhlpHrfHlnWlpWCpQVcMSmMmSJMmggbmMSMLFNSSs
JRMBJfMJQJTcNNdD
LHsLmspghmmpdwwwcwRCpPTT
ttLLlRSlqjrMqFtZ
VjtHVHtvVqttCdnGpHtplcshglNgprrlMhrcNghw
WTWRvRWFZQLWDvDWzwscNfcflcshlshFlw
WQmBQWPTVGnJPnvn
cpRwjcQwVfQzQPQl
BZgGDBZBsgWBDDJzlhfhJVmzVfmThm
FqWDDGrGDFNqFrDZFnplNHnSwtnSRwRplN
VMLVRhRLRfhfgGdfVdZWRdTHNqHCDTrSJNBBBgJNQgND
swlcpsFPcPwzpSlTTDrNrQPQqQBBrH
zsppFscsscmbzsFsbsZbMfRZdVdVMbVSWhLG
NjcjHFjrHHFpjGtVtGWVZW
fwPlsJqdndPnwJfQdfllwNtWGdtWMMbtbmbGWbMWGN
CPlwnCwnwqClTJThTDzzFcHNSShrRh
llqlsNsPNTpDNTDNNf
cnvcWFjSrMSFnvWHTzTggHCcllzLpg
wjJSSrFrrMMJGrFFFGjGvJnFswsRwRdmBdZbbqqsPtQqPZls
jlclpqjcRqpjzjnVPgTmBmjCrC
vGvsFNGGMZNvdGshQNJvJgbVMrnbrHVBgBTTbBBPBT
SvJNGhvvvFdfQvFshSpqPqLzRRPctRcLWwlf
LWSSqLVBbNqqLrWHLSHzWbbqQfFgZtmtJCQZzgtCFCQCCnJQ
PlldGDGdjGsMPhssjPmQZFJQQZQghChZQJgv
jwMcMpsPRRdsRjPwNpTWBLSBqVqTNJWT
hWnMWgTffWFbMLfHnFMNfHgjtBSNRzjBBSzSBBcStdzBtz
VGrVCGcVJswvPqJQjtQppBzpSwdjpt
ZqqsCrmmsfmWcHhngg
vnNnssMcZnlnlMFMsnFcZMGqJCbLbNLNqgLbgLNTCpLgwC
hmjzBzHmRSfBfmqgQwpQQJbQJmwT
WVVtthRtRdsdqtddZd
LhZBLfZpmcsFpFzm
vTRRwTRRPnCTwlFgmsczzLmgLvFs
HVVVNCPPHTTtClRVNSnwLTHSQHBMMHrHWBhrQbJhWMMbZbJZ
WPTnnDPjvPlChhJPcgCC
DRQdBqsDQHQLHsBSmVLBcbwgCClbgCGlJghgmhgw
dHMHQDVVRBsMWTNfWfzWzf
PlgFPFFJGgJhhMGZwGbpBtQjjjStBttptlSb
TTcDzmHvdvnDDzdTVnTDmSspWspQLpWmSsmqppsWtb
CHVdcHvdbrwJCMPRGJwP
BtBfcPfBhBGDhwHMlCmrNSCM
dQdzLFTQnRnQVvgLnNlrCCpFrJCNrHJrwm
zRVLZQRRvQGbwtWfbGZb
PPcWcwMmCwwgnphCCLpjHp
TtZsJTzzJSSSZJsdJtTrpblhRlHHHMngpLnnjHps
ZDrvdFZtJqtStrZfMcGDVwfwffmWmP
wCwSzzsHChhMVMhCPsSVLFWcdcWGPccRdjFdJjDR
wBTTlBfgTlfpQQltmfgGGctRdGJJJFDJDDWdDt
TppwnmlnQQqnlpqlmmwqlpphHqrVrZZSzshzShqzsrZVqs
CCqCTgmdMCCCMMsWgqqnTCmJDGJcGGJfrGNGrSrrQpwFFSwG
vZbDZvhDbzHzwNzwNGFNpNGc
ZjBRVHPRtRLjLMWsCDlmgMdBmW
MMsstRChwbChqRBqDrJNpNDsHdlNlJdr
vLmPLfGGGGcTmFfTSgvPCvpZQlHHZpdrFJplQdZHQdHH
GgPLmvGVSPfmfcfgBtjwCRwwjBbtVWbh
LPPgFPccLPRswfsHfJgDsH
bpbpTnCCrnmCtjBnTfDshHDwQVTwsDhQ
BbrjnjnWCbBWZbPWzLDzDWdNlMWS
pnncvLbcppBHgBRpddGd
MtJfjVMtMmFJDjWSjVWzGdGgNQRBzBGNBMCGNB
ZdDdsJFdDmtJmLTbwcvcbcnwZv
FGsfFdNdhfbDdbhbLMhbNNTPJVCCZTLJnCRVJLPCRTVR
qHjsczptHpmgHZBBVVTrrPzrBP
lmpSlcglQtqWtcWjpQQfWsGDMhGFwdbGGNWhDv
hNNNjMFMwthjFfvZBjFFvNSdnzSGGdGmHzHgGWSfHWSR
ppJpcCVslpQJpJJDWHCHmRHHWWGSDn
QbsrJQTQJVJNMNnZTZNZvZ
NmRNLtGNmfcRrtDtrJCnWHJD
blSzzSBssgfslWCCCJWFWHrsZF
zTzbPBhMlTVSzMlMldlgMvvvvMLGcQRmqLLfvRwQ
nnZsfsPLLfZfHLWdsZWZHdmcSpTcGmNScJTRGsTJmNcF
gqVqDMgBlDbwwCqVbQFpTNFcTRSJNSrqqTSm
jlMVMjljQBjMwhLfWWzhhfhZtmLH
bfHwMvzwFBNpRjfZ
nddcVJpGVpGqPVBBFBmhBhmsNRJs
DWcPgPcPgnqCPlWWVWGMwbzwvQSSLbvgLpHHMz
NMVqtdPVHgVlrfVrpnjCwNjjpCpNNpCb
zhSvfWWzRfRLfvSpQjwbmmmvQvwwCD
LBRRTRcLJSgqqMJlVVft
GpgNzzSMGpGTrgzgMzJTrPgzjRwBdBlBbLRBjdBwVbLRVbSR
sQWCfQcflhtQQcWCmsmlsbLnRdwqqBmmbBVbLVLwnB
fCtQWFWDZFCQhCctFDsftNpzPPzZJpgJJNTgNlPZgH
DqLtMSDLLttjdDSRdjZtdpdqVWFslFWrqWPqhwhfFwwCFw
CvTbNvvTJNGHnVJwPfwFFFwsrh
cQBzGBHnTQGgcNtdMMBpDBtCdtLL
QsNDfdDNQsSTtrQZQtJJZC
lLvRWMVMLzWbRjvVgVVGvmTtCrZBrTFFbmJCmsBCrr
lljvlgpMGgRpsjsRlGGsMdqDdpDqNqfhqqSdncpqdP
sVSJVmmtmsCCwschrbNMbcBs
ZgLLfqvzzqgfdqHQLnTLfQQFhFMrhbNGBwgGbMlNcFclwN
LTzqZrHHQvjLHnHdQTdTQvZQJjCpCJDPmCRRtCpStRRmVtmm
ccQVcVHwnnDqNqSWNnVvqwcgJblgRslgmdGlssmGbQdddb
rpFtPrzrMFZvZTLPpglhdssFshssJhsggG
pTtLtBMjZLfHvNWqcBHf
PZnSjnnsVfjfLLff
crvccpglrtHfNbzbHLzmGN
lptTLFFpdgvttFWltTclplDvhJMSMPhJPhChShPBZBMJhPMT
mPSPdnhznPdhSmPGchJdFDtBhghgFgWpFBQhTBMg
rHNNvbqHHHwZwMGMWtgtQMZQFQ
wRqqRffvvNHwrHqrNqLvCrqvmPnzdsGJsSsSdSsLPVVPnjsn
CzlngWpClJlzRJpDnpmzCndrhBcrhwcsBcLsNcsmLdQQ
qqSjqFGTFbPFSPTVjcBcBsDdQrwBVLrNcc
PtDDtZTvGDvFCMzZlRJCfWfJ
vtQDpvpvVvvcSFrrljZZsVjFrV
RqcTTRddRrlsjZrwrT
zmbdRdMmMgbPDcGhGmnDpcQn
gZqJRZRZdltFVGZQDZwV
MCMSRHCMRHBBVtVCGwDCFGtD
jcHsTMBNSSrBMjmMrcTMpRqpJggllnprqzRPzdlP
mWSWHdmHWZWjBnGs
TvchwtTfcTvhzwVGNtdrbjnnBnsnNr
JTdwghvMzwfdcMVJqPmQFRPpCDJRJFFC
DsHDCrszvvhHsshvsrrsgwdPpdLFgWLpbRpWFfMjWjWF
BVJPJmPmGZVnfbVfMWpdLMWb
cNGtnttqmJHNvNzDPPHN
gpjmMQMrfmMntCSCNmSNCm
vDRqphDhzHSdtqdCNH
LFLLcbJRJLppFQlpMFfF
SnSdvchzZZczndNvwcwnQrGfqrTTfhhTDgRGGLQQ
lVWHWMmWmttsFBMLLqLTRRRqqDBGTf
bsFPbFFssmFjWRmjVFjHbczvpZCwvwZccndpvzpzCP
jzngbHrlHQllcbcTCtHGWtftGCHqWC
JJgmsJRwFqChLGtqGs
SmJmSmDdSPRwSMppJdPPwVvvzNQvjrNMNjMZZrQgZNgQ
PvPlPcZPZFllzNzCDdhhdHjrpHNjHBHB
VmgWtJWrqbQmqGDBdGQjjhBGdG
tmbgggbgnMWnStttgnfnTzrCfPvFnccnPclT
RQQbdSRdpprQSNVqqqfrffjvnjnJnhnVvHhBhVjJtjJz
WGgGgLmLgGZMPDBhDJDHjMBFnD
WPPwPGwlLgZwmWlslCLRNbrsTrfRrNNQqsspBT
dNNpHpchLppdccTNtZZTRRPSSnwPPSbSnhhrhnSJ
qfqsFsqffgQMznJrPznbMrrB
vglfqQCgDgFjglCDCjLZpTHNPHttdcZVVN
FWtDHDStZwrFCDwrgWPFDsWQJZzlMdpZzlNpNjdjjQzNzj
BqnVGVcbTmGfHLGVzvpQpvJvQlflMdJp
ThRRchnHqLTGbFCCCrrSSFhFCs
wJrwdZPnJwqPbJPCnjFZdvHtMvsLsTsDtHsHDDqvpH
RWzNRWjRfgjNMMLvcMcLNt
WGGRQzzRmRmVQSgwrwJjjCbJhnbShJ
cjngcvcwbMwWnbMWjbgvnsjPftsqfthqsBtsJJJJBt
HrGFmDDzpmLTHpDsPfsBNBPfzZNPqN
DDVmDplDrpGSVSTTHGlpLnPwCRnWcvWCdPbbMvcVdW
BVRlBfPBffWswVWQsfwBNNPMFMmmGFZGnWZGtztrzMZMnz
HqSJchHTHbTgHhGhvmRzFmnFtzRF
RJqHTpgDLJDSqLJJPNVjsfPwBVsVLlfN
NDrBlSmrFBlbbJllmtHHwhNNhZztqHVRzQ
CMTCGLcvvtfCdCcCvCnMTMcTzjHwVZVRLjRRjQjRHRwzwjVH
dfGdgGMGPggnvfvgbtDtlSJPDSFJPslJ

25
2022/03/part1 Executable file
View File

@@ -0,0 +1,25 @@
#!/usr/bin/env python
VALS = {}
for i in range(ord('a'), ord('z')+1):
VALS[chr(i)] = i - ord('a') + 1
for i in range(ord('A'), ord('Z')+1):
VALS[chr(i)] = i - ord('A') + 27
score = 0
with open('input') as f:
for line in f:
line = line.rstrip()
half = len(line)//2
compA = line[0:half]
compB = line[half:len(line)]
common = set(compA) & set(compB)
score = score + VALS[common.pop()]
print(score)

26
2022/03/part2 Executable file
View File

@@ -0,0 +1,26 @@
#!/usr/bin/env python
import itertools
VALS = {}
for i in range(ord('a'), ord('z')+1):
VALS[chr(i)] = i - ord('a') + 1
for i in range(ord('A'), ord('Z')+1):
VALS[chr(i)] = i - ord('A') + 27
score = 0
with open('input') as f:
for elfA,elfB,elfC in itertools.zip_longest(*[f]*3):
elfA = elfA.rstrip()
elfB = elfB.rstrip()
elfC = elfC.rstrip()
common = set(elfA) & set(elfB) & set(elfC)
score = score + VALS[common.pop()]
print(score)

1000
2022/04/input Normal file

File diff suppressed because it is too large Load Diff

20
2022/04/part1 Executable file
View File

@@ -0,0 +1,20 @@
#!/usr/bin/env python
def build_range(text):
first, last = text.split("-")
return range(int(first), int(last)+1)
count = 0
with open('input') as f:
for line in f:
aS, bS = line.rstrip().split(",")
a = build_range(aS)
b = build_range(bS)
if (a[0] in b and a[-1] in b) or (b[0] in a and b[-1] in a):
count = count + 1
print(count)

20
2022/04/part2 Executable file
View File

@@ -0,0 +1,20 @@
#!/usr/bin/env python
def build_range(text):
first, last = text.split("-")
return range(int(first), int(last)+1)
count = 0
with open('input') as f:
for line in f:
aS, bS = line.rstrip().split(",")
a = build_range(aS)
b = build_range(bS)
if (a[0] in b or a[-1] in b) or (b[0] in a or b[-1] in a):
count = count + 1
print(count)

513
2022/05/input Normal file
View File

@@ -0,0 +1,513 @@
[N] [C] [Z]
[Q] [G] [V] [S] [V]
[L] [C] [M] [T] [W] [L]
[S] [H] [L] [C] [D] [H] [S]
[C] [V] [F] [D] [D] [B] [Q] [F]
[Z] [T] [Z] [T] [C] [J] [G] [S] [Q]
[P] [P] [C] [W] [W] [F] [W] [J] [C]
[T] [L] [D] [G] [P] [P] [V] [N] [R]
1 2 3 4 5 6 7 8 9
move 6 from 2 to 1
move 4 from 6 to 3
move 1 from 6 to 5
move 8 from 3 to 8
move 13 from 8 to 2
move 2 from 7 to 6
move 10 from 1 to 6
move 3 from 2 to 8
move 5 from 4 to 2
move 15 from 6 to 5
move 1 from 1 to 4
move 2 from 7 to 3
move 2 from 4 to 2
move 12 from 5 to 1
move 4 from 8 to 9
move 15 from 1 to 3
move 10 from 9 to 7
move 1 from 5 to 1
move 1 from 4 to 8
move 3 from 7 to 6
move 8 from 2 to 6
move 1 from 9 to 8
move 5 from 2 to 3
move 1 from 4 to 1
move 16 from 3 to 1
move 2 from 2 to 7
move 13 from 1 to 6
move 1 from 2 to 4
move 2 from 2 to 9
move 1 from 4 to 7
move 2 from 8 to 2
move 2 from 2 to 9
move 1 from 6 to 8
move 2 from 3 to 8
move 2 from 1 to 9
move 1 from 3 to 9
move 1 from 3 to 2
move 5 from 5 to 1
move 2 from 9 to 3
move 1 from 2 to 3
move 2 from 1 to 3
move 3 from 3 to 2
move 1 from 5 to 7
move 2 from 7 to 6
move 2 from 8 to 3
move 1 from 8 to 9
move 6 from 3 to 4
move 3 from 9 to 6
move 8 from 6 to 4
move 1 from 2 to 3
move 1 from 2 to 6
move 1 from 2 to 9
move 1 from 3 to 9
move 5 from 9 to 5
move 7 from 7 to 4
move 14 from 4 to 6
move 1 from 5 to 3
move 5 from 1 to 9
move 4 from 5 to 4
move 1 from 1 to 7
move 1 from 3 to 8
move 1 from 8 to 4
move 4 from 9 to 7
move 6 from 6 to 5
move 10 from 4 to 6
move 1 from 9 to 6
move 1 from 4 to 3
move 1 from 3 to 6
move 1 from 4 to 2
move 35 from 6 to 3
move 1 from 2 to 3
move 4 from 5 to 8
move 2 from 5 to 4
move 3 from 8 to 2
move 2 from 4 to 8
move 26 from 3 to 8
move 3 from 2 to 9
move 6 from 3 to 5
move 3 from 5 to 7
move 3 from 7 to 4
move 3 from 4 to 5
move 1 from 9 to 5
move 6 from 5 to 1
move 2 from 8 to 6
move 11 from 8 to 5
move 9 from 5 to 4
move 1 from 9 to 7
move 2 from 7 to 9
move 3 from 1 to 4
move 1 from 5 to 7
move 8 from 6 to 1
move 5 from 7 to 9
move 7 from 9 to 2
move 3 from 2 to 9
move 3 from 7 to 1
move 4 from 9 to 8
move 2 from 5 to 6
move 2 from 2 to 8
move 2 from 6 to 9
move 13 from 8 to 1
move 1 from 2 to 8
move 3 from 3 to 5
move 1 from 9 to 8
move 3 from 5 to 4
move 1 from 9 to 3
move 1 from 2 to 3
move 4 from 8 to 2
move 3 from 2 to 4
move 19 from 1 to 2
move 8 from 1 to 8
move 1 from 4 to 3
move 1 from 4 to 1
move 7 from 2 to 1
move 1 from 3 to 1
move 2 from 3 to 1
move 15 from 4 to 5
move 1 from 1 to 7
move 11 from 2 to 8
move 2 from 2 to 9
move 1 from 3 to 5
move 2 from 9 to 4
move 12 from 8 to 3
move 16 from 5 to 1
move 3 from 4 to 3
move 1 from 7 to 5
move 2 from 8 to 6
move 1 from 5 to 4
move 1 from 4 to 9
move 18 from 1 to 9
move 8 from 3 to 8
move 9 from 8 to 2
move 4 from 9 to 2
move 8 from 1 to 2
move 2 from 6 to 4
move 17 from 2 to 1
move 1 from 4 to 5
move 3 from 2 to 6
move 1 from 2 to 9
move 2 from 6 to 1
move 3 from 3 to 6
move 1 from 4 to 6
move 2 from 3 to 2
move 16 from 9 to 5
move 14 from 5 to 4
move 3 from 5 to 8
move 1 from 2 to 4
move 4 from 8 to 6
move 1 from 2 to 8
move 1 from 3 to 9
move 1 from 3 to 9
move 2 from 9 to 1
move 10 from 8 to 7
move 7 from 6 to 9
move 16 from 1 to 5
move 7 from 4 to 3
move 1 from 8 to 4
move 5 from 4 to 2
move 1 from 5 to 9
move 5 from 9 to 1
move 5 from 1 to 2
move 2 from 9 to 7
move 1 from 1 to 7
move 1 from 6 to 8
move 4 from 4 to 5
move 1 from 6 to 9
move 9 from 2 to 1
move 11 from 5 to 6
move 2 from 9 to 2
move 4 from 3 to 4
move 4 from 4 to 6
move 1 from 3 to 4
move 11 from 7 to 4
move 9 from 4 to 7
move 11 from 7 to 2
move 2 from 3 to 5
move 2 from 4 to 8
move 7 from 5 to 2
move 1 from 8 to 3
move 1 from 5 to 1
move 1 from 3 to 7
move 6 from 2 to 9
move 1 from 8 to 9
move 6 from 9 to 2
move 15 from 6 to 2
move 1 from 7 to 2
move 31 from 2 to 7
move 22 from 7 to 3
move 2 from 5 to 1
move 3 from 7 to 4
move 1 from 4 to 9
move 3 from 4 to 3
move 1 from 8 to 6
move 1 from 9 to 6
move 15 from 1 to 5
move 1 from 9 to 5
move 1 from 1 to 8
move 2 from 6 to 8
move 1 from 8 to 4
move 1 from 4 to 6
move 1 from 6 to 9
move 10 from 3 to 1
move 1 from 9 to 7
move 2 from 7 to 8
move 10 from 5 to 1
move 12 from 1 to 4
move 1 from 3 to 8
move 11 from 4 to 8
move 1 from 8 to 3
move 5 from 5 to 8
move 1 from 5 to 8
move 6 from 8 to 6
move 3 from 2 to 1
move 1 from 6 to 2
move 5 from 1 to 6
move 3 from 1 to 4
move 3 from 2 to 8
move 1 from 2 to 9
move 8 from 3 to 5
move 2 from 1 to 3
move 3 from 7 to 5
move 2 from 3 to 5
move 3 from 5 to 2
move 1 from 7 to 9
move 2 from 9 to 1
move 1 from 6 to 9
move 2 from 4 to 8
move 5 from 6 to 5
move 1 from 6 to 7
move 1 from 9 to 8
move 3 from 6 to 5
move 7 from 8 to 9
move 5 from 9 to 1
move 2 from 4 to 8
move 11 from 5 to 9
move 3 from 2 to 3
move 2 from 5 to 8
move 4 from 3 to 7
move 11 from 9 to 5
move 3 from 7 to 5
move 1 from 3 to 5
move 8 from 1 to 4
move 5 from 3 to 9
move 15 from 5 to 4
move 8 from 4 to 1
move 12 from 8 to 1
move 4 from 5 to 8
move 12 from 4 to 5
move 3 from 7 to 2
move 11 from 5 to 7
move 8 from 8 to 7
move 7 from 9 to 8
move 2 from 5 to 7
move 4 from 7 to 8
move 9 from 8 to 4
move 11 from 4 to 5
move 6 from 7 to 8
move 9 from 8 to 7
move 18 from 7 to 5
move 1 from 8 to 1
move 4 from 1 to 5
move 1 from 7 to 2
move 6 from 1 to 9
move 1 from 2 to 4
move 1 from 4 to 3
move 3 from 1 to 7
move 1 from 4 to 2
move 3 from 2 to 5
move 2 from 9 to 5
move 1 from 2 to 6
move 4 from 7 to 8
move 1 from 6 to 2
move 1 from 2 to 4
move 4 from 8 to 5
move 3 from 9 to 7
move 1 from 9 to 5
move 1 from 4 to 3
move 2 from 3 to 8
move 2 from 7 to 4
move 28 from 5 to 8
move 1 from 8 to 9
move 1 from 9 to 3
move 6 from 5 to 6
move 5 from 5 to 2
move 1 from 3 to 4
move 1 from 7 to 4
move 1 from 5 to 6
move 16 from 8 to 3
move 7 from 1 to 8
move 4 from 4 to 9
move 1 from 2 to 4
move 3 from 2 to 3
move 6 from 6 to 8
move 10 from 3 to 8
move 1 from 2 to 7
move 1 from 6 to 7
move 11 from 8 to 5
move 2 from 7 to 8
move 1 from 1 to 9
move 5 from 9 to 5
move 4 from 3 to 2
move 1 from 4 to 2
move 1 from 3 to 8
move 3 from 8 to 2
move 19 from 8 to 7
move 6 from 7 to 6
move 4 from 5 to 2
move 9 from 7 to 5
move 1 from 7 to 1
move 5 from 6 to 9
move 1 from 7 to 4
move 1 from 6 to 7
move 1 from 4 to 7
move 1 from 1 to 2
move 2 from 7 to 3
move 6 from 5 to 9
move 9 from 9 to 1
move 17 from 5 to 4
move 2 from 3 to 1
move 13 from 4 to 7
move 3 from 3 to 5
move 7 from 1 to 4
move 1 from 5 to 8
move 2 from 5 to 2
move 6 from 7 to 3
move 1 from 5 to 7
move 1 from 9 to 1
move 2 from 3 to 2
move 1 from 9 to 3
move 9 from 7 to 3
move 10 from 3 to 5
move 8 from 4 to 2
move 1 from 4 to 1
move 13 from 2 to 4
move 5 from 4 to 3
move 1 from 5 to 9
move 1 from 7 to 2
move 6 from 4 to 2
move 4 from 1 to 8
move 3 from 4 to 6
move 9 from 8 to 9
move 17 from 2 to 3
move 2 from 8 to 6
move 1 from 4 to 3
move 2 from 6 to 3
move 2 from 1 to 3
move 13 from 3 to 4
move 8 from 9 to 8
move 7 from 4 to 6
move 3 from 5 to 6
move 5 from 8 to 2
move 9 from 6 to 1
move 7 from 2 to 4
move 2 from 6 to 9
move 1 from 1 to 5
move 18 from 3 to 8
move 5 from 1 to 3
move 1 from 6 to 1
move 9 from 4 to 7
move 11 from 8 to 7
move 5 from 7 to 5
move 2 from 4 to 5
move 1 from 6 to 2
move 13 from 7 to 8
move 1 from 4 to 9
move 1 from 9 to 6
move 4 from 1 to 5
move 1 from 7 to 6
move 9 from 5 to 7
move 8 from 5 to 6
move 10 from 7 to 2
move 1 from 5 to 7
move 1 from 7 to 1
move 17 from 8 to 2
move 9 from 6 to 7
move 6 from 7 to 1
move 2 from 7 to 2
move 1 from 4 to 2
move 12 from 2 to 8
move 7 from 1 to 2
move 6 from 8 to 6
move 3 from 8 to 2
move 1 from 7 to 2
move 2 from 3 to 4
move 1 from 4 to 9
move 2 from 3 to 5
move 2 from 3 to 7
move 1 from 4 to 6
move 2 from 7 to 1
move 7 from 2 to 7
move 6 from 7 to 1
move 1 from 5 to 2
move 6 from 8 to 4
move 4 from 9 to 7
move 1 from 5 to 2
move 3 from 8 to 1
move 1 from 9 to 4
move 1 from 7 to 8
move 1 from 8 to 1
move 4 from 7 to 8
move 1 from 4 to 2
move 3 from 6 to 9
move 2 from 9 to 7
move 1 from 9 to 3
move 2 from 4 to 3
move 2 from 8 to 3
move 5 from 3 to 4
move 4 from 6 to 2
move 8 from 2 to 9
move 1 from 6 to 5
move 10 from 2 to 3
move 2 from 8 to 3
move 8 from 9 to 3
move 9 from 2 to 5
move 1 from 2 to 4
move 1 from 2 to 3
move 7 from 5 to 6
move 1 from 5 to 7
move 13 from 3 to 4
move 2 from 7 to 8
move 5 from 3 to 1
move 1 from 5 to 3
move 1 from 8 to 5
move 1 from 2 to 8
move 1 from 7 to 9
move 1 from 4 to 2
move 15 from 4 to 8
move 6 from 4 to 7
move 6 from 7 to 8
move 1 from 6 to 5
move 1 from 4 to 6
move 1 from 9 to 6
move 2 from 5 to 2
move 6 from 6 to 4
move 6 from 1 to 8
move 6 from 4 to 9
move 2 from 6 to 1
move 1 from 2 to 9
move 26 from 8 to 1
move 4 from 3 to 7
move 2 from 2 to 5
move 16 from 1 to 4
move 3 from 9 to 8
move 3 from 8 to 7
move 3 from 5 to 1
move 2 from 9 to 2
move 1 from 9 to 7
move 1 from 9 to 1
move 8 from 4 to 1
move 4 from 4 to 9
move 1 from 2 to 3
move 1 from 3 to 7
move 2 from 8 to 2
move 3 from 4 to 2
move 1 from 4 to 7
move 9 from 7 to 5
move 1 from 9 to 8
move 2 from 9 to 8
move 5 from 5 to 7
move 1 from 9 to 5
move 6 from 2 to 6
move 1 from 8 to 2
move 5 from 6 to 5
move 1 from 7 to 4
move 3 from 8 to 9
move 3 from 9 to 7
move 1 from 6 to 4
move 2 from 4 to 1
move 2 from 5 to 8
move 1 from 2 to 9
move 2 from 8 to 9
move 3 from 9 to 3
move 8 from 7 to 3
move 4 from 5 to 8
move 1 from 3 to 9
move 3 from 5 to 8
move 1 from 5 to 3
move 6 from 8 to 6
move 3 from 3 to 9
move 5 from 3 to 2
move 5 from 6 to 4
move 14 from 1 to 5
move 8 from 5 to 6
move 2 from 3 to 2
move 4 from 9 to 1
move 1 from 8 to 7
move 7 from 2 to 3
move 6 from 3 to 7
move 3 from 5 to 3
move 1 from 3 to 9
move 12 from 1 to 5
move 1 from 9 to 7
move 2 from 3 to 1
move 1 from 7 to 8
move 1 from 8 to 7
move 2 from 3 to 6
move 2 from 1 to 9
move 2 from 5 to 6
move 2 from 9 to 7
move 9 from 7 to 3
move 7 from 1 to 5
move 5 from 5 to 2
move 8 from 6 to 8
move 5 from 8 to 9

48
2022/05/part1 Executable file
View File

@@ -0,0 +1,48 @@
#!/usr/bin/env python
import re
crates = []
def process_crates(spec):
for i in range(0, len(spec), 4):
pos = i // 4
if len(crates) < pos + 1:
crates.append([])
if spec[i] != '[':
continue
crates[pos].append(spec[i+1])
def process_instruction(spec):
m = re.search('^move (\d+) from (\d+) to (\d+)$', spec)
count = int(m.group(1))
src = int(m.group(2)) - 1
dst = int(m.group(3)) - 1
for i in range(0, count):
crates[dst].append(crates[src].pop())
with open('input') as f:
# Read the diagram + separating line
for line in f:
if line[0] == ' ':
continue
if line == "\n":
break
process_crates(line.rstrip())
# We filled the lines upside down, so flip them
for pos in crates:
pos.reverse()
for line in f:
process_instruction(line.rstrip())
out = ""
for pos in crates:
out = out + pos[-1]
print(out)

51
2022/05/part2 Executable file
View File

@@ -0,0 +1,51 @@
#!/usr/bin/env python
import re
crates = []
def process_crates(spec):
for i in range(0, len(spec), 4):
pos = i // 4
if len(crates) < pos + 1:
crates.append([])
if spec[i] != '[':
continue
crates[pos].append(spec[i+1])
def process_instruction(spec):
m = re.search('^move (\d+) from (\d+) to (\d+)$', spec)
count = int(m.group(1))
src = int(m.group(2)) - 1
dst = int(m.group(3)) - 1
items = []
for i in range(0, count):
items.append(crates[src].pop())
items.reverse()
crates[dst] = crates[dst] + items
with open('input') as f:
# Read the diagram + separating line
for line in f:
if line[0] == ' ':
continue
if line == "\n":
break
process_crates(line.rstrip())
# We filled the lines upside down, so flip them
for pos in crates:
pos.reverse()
for line in f:
process_instruction(line.rstrip())
out = ""
for pos in crates:
out = out + pos[-1]
print(out)

1
2022/06/input Normal file
View File

@@ -0,0 +1 @@
srlsrsnnwhwwmddwfddgldlglppcnpptftzzchzhbhmmvwmvwvvjsjnjbbvbmvmnmqmfmjfjjmllzddrvrrnsncnznndwwqrqjjsfsjsjsvsvzvtvfvrvhhbwwltttbhhvphhtqqnffsppdqqrmmfrmfrrwvrvrsvrsrzssrqqrfqrfrttqntnpttvrrcncnfftjfjwwfwjwpwwltlwwwvnvcnvvdgvddqlddnllrggqvgvzzjddfgdfdgfffsbfsffjmffprrmgmtmqqgzzlwldlbbgjjnfjnnvlnnlbbnjnzngglmggwtgwttnvtnvndndmnmdmcddzbdbbspbpwbpplvpvnnmtmqqwnwgglhghdhbhqbhhqrqhqcqmmmrwwlvvfnvfnnpddbfbgfgqglgddrggbgbqqfwfjfdjfflzldlbbsbbtftccgqggzgdglglzljjzbzfbzffgftfvtfvvvjmjzjmjfjqqccpcjppzfpzzsvvzjvvfgfmgffzhhdphdpdwdwmdwwlqljjzffzvfzfwzfzcztctssdpssndssvbbtbstbtnngjjspplttpffjggbbqsqnqcncscpcmccbmbdbtbcbbgqgwgwqgwgwsszqznzvvntvvmlvlvqqvgvwgwlldbblclqcqggtqqlsqlsqlqcczzqgghmgmrgmrggljlbjbsbsmmnlmmdppnpfnnvhnnzggchgggbwwvtvpptgpplsljjshhnphhblbnbpbgppfllhsllbtlbtllrprqrvvfgvgpgcpcdddjjplpssjrjqjggncnzccqdqfqpffvddhlhdllgzzrtrztrztzptztwwbjbnjnsjsfsbfbdbccnhnmhnhrhwhfhbbtzbtztzrttrzrfrcrtctqqrlrsshphwphwpwwcmczzpqzqztqqvzzshhddrvdrrztrrqcqbcqbbhnnpfnpfnnmcnmnccnmmhccjjwzwcwbwcwnngtnngrngnsnzzcvvvtnvvtpvtpvtvvhffbsfsnsdsmmzbbrqbqpbpcpdppzmzbmmtdmttvgvrvlrvvhddjgdjdbbthtjhjdjhdjjmssdldjllwppvbvnbnlbbbszbblpbpfbpblbzzszvssbcbgcghgbbcpbbqrrdjdnnjcjddjcdjjcqqhggflftftfhttvlttgdtdrttwppwvvrzzbggrjjmssrjsjmssdtttdbdvddpllpgllthhvfvhvddrhhnznwznwzzpbblvvpmvpmpddjvdvcddvsshfhrrghgnhghmhhmhffrsfrflrfrjrddzgzsggchcfhhsbbsrszzgjggnrrgfffhthdthtnhtntllsjjjwqqsbsttbtzbttlfttczzbfbwfwvvhllltjjsqsdqqspqsszqzhhdrrhccgbcgggcbggnvgvmmwcmmpqmqccshsnnnwrwfrrwrllvhvlvmlvljjgrgvrvddfqfwqfqlfqqqppvmvrmrfrvrwrqrjqrrvmrvmrrvffmtffsfdfdrdwrwjrrcgcwwcdwdrdnrnzztqzzzgdzgdgldltdtvtnnhllrtltbtrbbttgssdhsssrmsscnssmtmqqtssmzzjqzqddfrdrtdrdpdzzppwggsrrfvfnvvmgvgmmdnnbwnntlnntncchcmcjmmvzzzngznnbgbnbnvbvzzfqqmtmrmcmqmvmbmbmcmscsjcsshswsjsvswshwwlnnsslmslmmzgmgsmssrwwmjwmwllvbvppplmmwgmgzgzdgzdgzztrtzzchcssbppdbbmvmqmmzhztzdtzdznnqhhmcmnnncbnngjnjmjnmmqqsnqsnslnlqlppvbvwwvtwtfwtfmzsbdjfvhzcflstpbtprpzmwcwwgzshfssnjdgflcsfglhbvvdctfrccfmwgfvjtvqfqpzzmqtlbvrjqwlwclfzhfzcmwsvprdhzcrghdscprrnqgdgmhhwbcfcfzrcgrwvbstpwbcvcnpmftwwthnsjznzslfdfqhtpsgmjsddmhlhtlzfsnhlcbgnqpqbzppnbcgtzvwdpmgftgsmrwjqwsdnjrrmwrmlcvlqgwldnvmsgnwccwzmdzwdhpmpqffgbnrrrvzqhtlnvqfhgwbbwsghwbrjzjcjmjmsspcmnfbbpmwffbdqffqfwsvtcrghbnldspdhjhjvtdhgmvrzqqlhvnwbdhfprwqdtzswfdzdwhzvfzsfqlzcflhbsvjhnjnthrdrgmjrrbftflpvrmrvvsgnjhrhjffvznmbjtshwgjmcqbfqjlptsrcgzvrhctwsdclrstmsbsbpqpjcvftmvmsmpwmmphlwmljhvllhrmfcncdprrwfmqrlllmsrvrwtbsqddbmblhvqqlcbbtjbslggrshflrddsphbvzhprcvbpmfldnmwtchddbdwhwpgbmjqptsbdzhrbqfwgfltchsggjlbqbhmzbjdncnvsqjvftpwrpdcjzsrvrlzwqfptwzssqpltjhdmtmmgvjzzqswwrsqrqfpdllgzsdlvhfdnzlrmlqdclwhqqbtwdqcrlfdjphjvcfzpwwgphmrldnwjpnmsjnqpwtwglcbthmcbnvpmjbdhmjglgccsmrmbvbqphdlbrrgnbljlhqvgqbctmthvmsfzflwvctwmdgmrlhnmwnsjtzndlwfttcvtslppjwsgbzhztlpzhmjlrbtzfnblwwlddzwqvzbjmffbflvmvnsgjlqwjqvrcrtwbhfzbzzmtwsndqmtnbjbsqjpnwhzqgwwltwgrqfbhjtpzrqvvhgjsbzqmfdsmzjdnplvblvqlrtzsbjgdptdhgvvrblbjppnnhhnvqtmjgwqzwtmjglrjlwsrfdjfmzlsszzzpbwvjbwpcwlplhcmhgpclztjcrmcntnqbnlrmcnhcnhnmjggtqbtvcfmcbdpqhdrvspbrgcwhgjhggwpvjbplhdsnnvgbzhmcrjqvqlwsdvrrnntmwdgdqdvzznjflctlfmfzsdfbpftsscnbtnqcsvtltvnsqpghzcwtjctvwqqnvnddlzbftwrdqzltpczrbmvsmlpfjzphtpnngzdfrjqrtbppbvztsddblspbltsnrtdftmwbblgdqvmscjqpwfvdzphwqgrbpdfcvtvmddgjjpswrqnwjfghtzwzbhtjnwjsrnwhjwcwnrtwrmbmqjhrbmbsslnvtsqnlbzlfdjvmnlhccpzmvpmrnttnshdjsswjlbtpwdwgmzqcthbczngwnfpzbmmrdffqsbrmsgzrtpsstfmdgbclwthflfbzvtptdfpzznvdwncqzvjwsmczwcnwgjpffcbhrtmtnbtjgcvtwdjtrftjwgvzmlfvgdjjjgsftzctplmjjmqfdzzwrtfmwqhwzglwbvsdvtgphsmngvppvlfdjdrzhhzsrvqgfwjbqdqlrwbgdmrglzrchvgwlhhwbvhfszntbrhshvqdznfvngdmhctjnlfhsmchqbqhdtmlntsnpvdzrvwjcjflfqgnprcpscfcmlgbwzmbnfdfnbwngrrbpnvbcdfgcpgtwmtbzptsdvjhwnzpsffglnqlczgsrdzshrfpqtqbmsrgzwwjvqhzjfzldcggvfhtcvzsgfspnlgtjfglwcnbprvssdfbtzqbblzjzmtftfcfprlwsvswjvtpzcpfphvmdnbczzjbjjrpwrncdszrtqjvznvgzcwdvpfvfcqlsdmhsswpnfsvtffnjhstcznwghlpmmqbnhqtddbjdrpvfhgdwjcnfgggmwnqhmsvgzsssbfcfrmbwpfqhrmtdvhbpwzggdvfjnlrgmvjjbqhjmbvszfzdcwrcjhfdczbhmcrwngmrgrldvbjjdgddhbbvqvwztfstfzqnqwvmmdzhzqtrmnqfrhmtdfhrgfqclpqdwthrbgsprccwcsvdbnclglgflhtqstvpwrmnsvflpplrgftlvjwttmdcqwjnbttjqqlwsntplmfrncqzplwgrjpzljtmnwsqfqnzgnrbtscbfzqwnqttnghcgl

14
2022/06/part1 Executable file
View File

@@ -0,0 +1,14 @@
#!/usr/bin/env python
from collections import deque
with open('input') as f:
offset = 0
buf = deque([], 4)
while True:
buf.append(f.read(1))
offset += 1
if len(set(buf)) == 4:
print(offset)
break

14
2022/06/part2 Executable file
View File

@@ -0,0 +1,14 @@
#!/usr/bin/env python
from collections import deque
with open('input') as f:
offset = 0
buf = deque([], 14)
while True:
buf.append(f.read(1))
offset += 1
if len(set(buf)) == 14:
print(offset)
break

899
2022/07/input Normal file
View File

@@ -0,0 +1,899 @@
$ cd /
$ ls
dir ctd
80649 mwcj.pmh
212527 nbb.ztq
dir pgqmwn
152170 scr.smr
17637 snqcgbs.nhv
dir tmw
dir vtm
$ cd ctd
$ ls
dir bblsqnwl
dir gzcjrs
dir pgqmwn
dir qzgjp
dir shmvmqv
$ cd bblsqnwl
$ ls
dir rng
$ cd rng
$ ls
dir jncpmzcs
dir pttvmghm
293353 qcjbfggw.tjj
dir sgm
$ cd jncpmzcs
$ ls
36126 tstwmrbr.bmr
$ cd ..
$ cd pttvmghm
$ ls
38802 ctttjn.nzr
$ cd ..
$ cd sgm
$ ls
dir djcbdbgr
dir gqrr
$ cd djcbdbgr
$ ls
254050 nbb.ztq
$ cd ..
$ cd gqrr
$ ls
168685 jgsqvf.tql
302004 shmvmqv
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd gzcjrs
$ ls
319972 bwnjnmmh.wwd
25495 fzthlhcp.nst
291270 ghjc.nvf
244664 jrlfb.fvz
$ cd ..
$ cd pgqmwn
$ ls
dir zpvthlgp
$ cd zpvthlgp
$ ls
128092 dqvcqs.zpb
140511 nvqsqtjw
$ cd ..
$ cd ..
$ cd qzgjp
$ ls
23062 jgsqvf.tql
254685 nbb.ztq
dir pgqmwn
320683 shmvmqv
105368 shmvmqv.hmg
60805 snqcgbs
$ cd pgqmwn
$ ls
47287 gffvwmr.pbd
$ cd ..
$ cd ..
$ cd shmvmqv
$ ls
80751 crtwwqb
dir dbfm
dir dhhghph
dir pgqmwn
195177 qnm
dir qpbn
dir rwmsqdw
dir shmvmqv
16133 shmvmqv.vwq
187938 tmw
$ cd dbfm
$ ls
dir gbpnjrt
265813 glzz.mjv
108147 nbb.ztq
229253 nvqsqtjw
85743 pgqmwn
261375 qnm
$ cd gbpnjrt
$ ls
179812 mtp.lnf
234550 shmvmqv.qvq
$ cd ..
$ cd ..
$ cd dhhghph
$ ls
dir ghmpb
70514 zqv.ssn
$ cd ghmpb
$ ls
132693 shmvmqv.csb
$ cd ..
$ cd ..
$ cd pgqmwn
$ ls
dir hcbtbr
200292 pgqmwn
67530 sgm
15442 snqcgbs
$ cd hcbtbr
$ ls
249252 dqvcqs.zpb
$ cd ..
$ cd ..
$ cd qpbn
$ ls
dir pmbw
261142 qnm
dir rsfh
239788 sgm
dir wfwl
$ cd pmbw
$ ls
dir gwwdtzp
dir jszzc
32725 rnggjs.cbv
dir sldv
dir tptrlz
$ cd gwwdtzp
$ ls
dir dlvbdn
63066 dslb.mrp
dir shmvmqv
dir tzssf
$ cd dlvbdn
$ ls
190731 nqv.csc
$ cd ..
$ cd shmvmqv
$ ls
223667 nbb.ztq
$ cd ..
$ cd tzssf
$ ls
27296 rlgswwzq.dgj
dir tfdq
206881 wrdqg.pfj
$ cd tfdq
$ ls
26512 wsgh
$ cd ..
$ cd ..
$ cd ..
$ cd jszzc
$ ls
218701 qpz.hdm
$ cd ..
$ cd sldv
$ ls
dir hsbzqtml
3895 jgsqvf.tql
181815 nbb.ztq
294048 shmvmqv.fcm
dir snqcgbs
dir tmw
203484 zfpjq.pvn
dir zlpwdp
$ cd hsbzqtml
$ ls
dir shmvmqv
$ cd shmvmqv
$ ls
103536 nbb.ztq
32635 wmc
$ cd ..
$ cd ..
$ cd snqcgbs
$ ls
95112 dch
$ cd ..
$ cd tmw
$ ls
dir dplm
275451 hsr.zhn
9766 qnm
177383 ztbmqjqb.hwj
$ cd dplm
$ ls
277671 dqvcqs.zpb
$ cd ..
$ cd ..
$ cd zlpwdp
$ ls
315030 snqcgbs.mlz
$ cd ..
$ cd ..
$ cd tptrlz
$ ls
dir jfflz
154685 qbbpstff.fcs
dir sjjgljg
dir zsssqcsb
$ cd jfflz
$ ls
1330 fvldwzn.dbb
227153 nbb.ztq
$ cd ..
$ cd sjjgljg
$ ls
295745 frjnfsgt.fmq
105131 jtbltpv.vhm
174279 pgqmwn
104317 sgm
$ cd ..
$ cd zsssqcsb
$ ls
246361 bnzsv.dqf
dir ggcvqf
dir htqpwzw
249833 jgsqvf.tql
dir lbtjth
dir lcfwb
306768 mmd.gjw
121112 pgqmwn
dir sgm
dir shmvmqv
dir snqcgbs
55055 tmw.rqm
$ cd ggcvqf
$ ls
46573 fcwznd
$ cd ..
$ cd htqpwzw
$ ls
dir bmzvdzsv
193713 fpp.vwd
39898 mfjcnl.szn
65370 msljctr
10685 ppgzbc.trg
94843 shmvmqv.hqn
dir thfdg
$ cd bmzvdzsv
$ ls
74898 pgqmwn.wwh
$ cd ..
$ cd thfdg
$ ls
dir cpsgcll
$ cd cpsgcll
$ ls
244683 gdfw
17203 tmw
$ cd ..
$ cd ..
$ cd ..
$ cd lbtjth
$ ls
dir snqcgbs
$ cd snqcgbs
$ ls
122394 grhbhpw.fsl
55324 jgsqvf.tql
$ cd ..
$ cd ..
$ cd lcfwb
$ ls
138053 nvqsqtjw
$ cd ..
$ cd sgm
$ ls
314313 dqvcqs.zpb
146274 fftqvs.ltt
225372 jtq.rzq
85697 rctzgq.rsr
dir sgm
262221 tqpng
$ cd sgm
$ ls
dir cmvvd
277366 mhs.tpn
77975 nbb.ztq
160966 qrwbvbd.ghf
55949 snqcgbs.qzc
$ cd cmvvd
$ ls
28054 lfsvfsl
165671 tmw.zwh
$ cd ..
$ cd ..
$ cd ..
$ cd shmvmqv
$ ls
51884 bsbwrjnz.dmt
231236 jfmsg.mts
dir qpb
256063 zhmw
65512 zrnhr
$ cd qpb
$ ls
228289 dqvcqs.zpb
$ cd ..
$ cd ..
$ cd snqcgbs
$ ls
dir mnwgf
$ cd mnwgf
$ ls
178834 qgnwvlfd.cps
255140 sls.mnw
9546 tvhbm
281615 vntrb
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd rsfh
$ ls
310413 snqcgbs
$ cd ..
$ cd wfwl
$ ls
dir fmvg
129025 jgsqvf.tql
$ cd fmvg
$ ls
276100 nvqsqtjw
$ cd ..
$ cd ..
$ cd ..
$ cd rwmsqdw
$ ls
46554 qzdmgl
55785 shmvmqv
127982 tfffrg.sbz
$ cd ..
$ cd shmvmqv
$ ls
dir ntstz
dir vprlz
$ cd ntstz
$ ls
304801 nvqsqtjw
28969 wzfb.fjv
$ cd ..
$ cd vprlz
$ ls
dir cmmtnt
dir shmvmqv
$ cd cmmtnt
$ ls
270129 shmvmqv
$ cd ..
$ cd shmvmqv
$ ls
dir sgm
$ cd sgm
$ ls
287889 hghh.mwt
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd pgqmwn
$ ls
85368 qnm
$ cd ..
$ cd tmw
$ ls
dir fnpjwg
dir gdt
dir ggs
dir llh
69470 nvqsqtjw
dir sgm
$ cd fnpjwg
$ ls
161820 dndq.tfl
dir dwmcs
205155 tdccsw.qlq
165352 vvmnpj
$ cd dwmcs
$ ls
121466 dqvcqs.zpb
274171 qbbqmf.ltf
$ cd ..
$ cd ..
$ cd gdt
$ ls
dir cnvtrw
dir gdcvdsv
dir hcn
dir hsmhn
dir jnhqz
78446 pgqmwn.mwr
dir qwfl
dir snqcgbs
$ cd cnvtrw
$ ls
dir hfvzm
$ cd hfvzm
$ ls
305880 tmw.lvw
$ cd ..
$ cd ..
$ cd gdcvdsv
$ ls
69690 jhscd
$ cd ..
$ cd hcn
$ ls
166775 dqvcqs.zpb
294325 nvqsqtjw
$ cd ..
$ cd hsmhn
$ ls
172897 lrjf.dnw
dir npgr
225227 pbcmjg.rhf
234530 pgqmwn.cqb
dir qlz
dir snqcgbs
52808 tnntq.wjt
$ cd npgr
$ ls
141280 qnm
64422 rwv
$ cd ..
$ cd qlz
$ ls
258070 nbb.ztq
$ cd ..
$ cd snqcgbs
$ ls
3723 frcr.jmn
109486 sgm.nsw
114054 shmvmqv.frr
142024 snqcgbs
$ cd ..
$ cd ..
$ cd jnhqz
$ ls
dir gpztwnqm
dir nwpqbf
dir sgm
dir tmw
$ cd gpztwnqm
$ ls
303103 bjbpj
281422 hgp
284044 jgsqvf.tql
dir qzts
133248 sgm
$ cd qzts
$ ls
2428 dqvcqs.zpb
283206 hzs.smg
dir lmlw
$ cd lmlw
$ ls
dir sjrfmpc
$ cd sjrfmpc
$ ls
164708 nbb.ztq
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd nwpqbf
$ ls
192033 dqvcqs.zpb
298220 jqd.bfh
dir mhtsg
100921 snqcgbs
dir zbtb
$ cd mhtsg
$ ls
140813 cgcn.rjn
$ cd ..
$ cd zbtb
$ ls
201213 gjglrmf.dzv
dir grbl
81636 pgqmwn.zfm
265992 pwhbflzn.sch
dir twjrlzpj
$ cd grbl
$ ls
82894 jgsqvf.tql
$ cd ..
$ cd twjrlzpj
$ ls
304952 cwhtqv.zvh
$ cd ..
$ cd ..
$ cd ..
$ cd sgm
$ ls
56329 ftfvfpz.srv
3875 nbb.ztq
4766 shmvmqv.fdt
247272 vbw.hsv
$ cd ..
$ cd tmw
$ ls
dir ddbvd
$ cd ddbvd
$ ls
83200 tnrwdc.dzm
$ cd ..
$ cd ..
$ cd ..
$ cd qwfl
$ ls
dir bcfnz
23440 nvqsqtjw
dir pwb
206984 shmvmqv.fjb
35453 snqcgbs
297136 snqcgbs.fnr
dir tmw
181689 wcbdwwq
$ cd bcfnz
$ ls
dir fnrclwn
dir fslh
258656 gtbhdpt.pth
238261 psbsmvpf.lmt
dir sgm
$ cd fnrclwn
$ ls
30297 crhjfzlp.gtb
297557 gvvnbmt.spr
189301 nvqsqtjw
45159 sndmlvw.lsb
259295 sqd
$ cd ..
$ cd fslh
$ ls
246662 bpvcj.hnf
$ cd ..
$ cd sgm
$ ls
dir jpr
dir tmw
dir wscvtrd
$ cd jpr
$ ls
49005 dqvcqs.zpb
$ cd ..
$ cd tmw
$ ls
201387 sgm
$ cd ..
$ cd wscvtrd
$ ls
77175 blczlqf.pnv
207393 shmvmqv.qbs
$ cd ..
$ cd ..
$ cd ..
$ cd pwb
$ ls
89451 bqcmzzf
207548 gfwgnft.php
dir gsn
dir jtvpnvz
144792 nbb.ztq
dir nzzqj
214209 pgqmwn.sjv
236845 pzvjqqvz
dir sgm
dir snqcgbs
dir vfvttj
$ cd gsn
$ ls
93490 snqcgbs.fbv
$ cd ..
$ cd jtvpnvz
$ ls
dir fdnvff
208857 gpvwzhd
229559 rnc
225519 snqcgbs
162969 tmw
$ cd fdnvff
$ ls
286944 dztqqtf.nmp
dir rwc
181737 snqcgbs
$ cd rwc
$ ls
115290 nbb.ztq
$ cd ..
$ cd ..
$ cd ..
$ cd nzzqj
$ ls
154210 jgsqvf.tql
dir sgm
182438 snqcgbs.wpg
dir zpvghr
$ cd sgm
$ ls
123163 rjgc.ccm
dir rqn
291622 tflv.pqc
$ cd rqn
$ ls
220655 rtbrwmjn.clj
$ cd ..
$ cd ..
$ cd zpvghr
$ ls
288859 dqvcqs.zpb
218036 hfdcrjp
$ cd ..
$ cd ..
$ cd sgm
$ ls
107183 sgm.nsf
225832 sjwn
dir tgf
$ cd tgf
$ ls
258766 nvqsqtjw
$ cd ..
$ cd ..
$ cd snqcgbs
$ ls
56144 whjpg.ffz
$ cd ..
$ cd vfvttj
$ ls
dir ptmggmsl
$ cd ptmggmsl
$ ls
dir psd
dir wdzptvjc
$ cd psd
$ ls
121637 dqvcqs.zpb
$ cd ..
$ cd wdzptvjc
$ ls
dir shmvmqv
$ cd shmvmqv
$ ls
23754 dqmrj.fhh
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd tmw
$ ls
17390 hqz
dir jnsb
31072 nvqsqtjw
dir tmw
144511 vvwjcqr.rtz
$ cd jnsb
$ ls
265907 snqcgbs.swh
$ cd ..
$ cd tmw
$ ls
dir gfncpvw
$ cd gfncpvw
$ ls
dir ctvwgtlh
$ cd ctvwgtlh
$ ls
29825 ccjvs.qqq
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd ..
$ cd snqcgbs
$ ls
230355 ccl.ddg
dir csfdmhmb
dir drpgbvzf
313060 hhcpw.nbs
dir pfpn
dir ptwnpdnc
273250 qfsnmbm
dir shmvmqv
244767 tmw.zjg
$ cd csfdmhmb
$ ls
50690 nbb.ztq
282078 vzrw
$ cd ..
$ cd drpgbvzf
$ ls
dir bhwvqf
803 dqvcqs.zpb
49859 hhw.gpd
180202 nbb.ztq
dir nfh
64808 pgqmwn
276746 qnm
dir shmvmqv
dir tmw
$ cd bhwvqf
$ ls
76667 qcgpdwm.sbs
$ cd ..
$ cd nfh
$ ls
23774 jgsqvf.tql
34652 pnp.lvp
120264 zvp
$ cd ..
$ cd shmvmqv
$ ls
47748 cswm.dsr
dir pgqmwn
$ cd pgqmwn
$ ls
109587 qnm
$ cd ..
$ cd ..
$ cd tmw
$ ls
105578 snqcgbs
$ cd ..
$ cd ..
$ cd pfpn
$ ls
194628 wgc
$ cd ..
$ cd ptwnpdnc
$ ls
142456 rvwtfvr.tsc
$ cd ..
$ cd shmvmqv
$ ls
118642 hgqlrt.btl
$ cd ..
$ cd ..
$ cd ..
$ cd ggs
$ ls
231223 hmtp.djc
$ cd ..
$ cd llh
$ ls
dir hbq
dir svt
$ cd hbq
$ ls
157243 fhpsb
36981 rdbqnbfr.cwz
282257 tmw.wwv
$ cd ..
$ cd svt
$ ls
161395 sgm.hdl
$ cd ..
$ cd ..
$ cd sgm
$ ls
247276 fss
dir pgqmwn
68084 pgqmwn.vfl
28475 sgm.swb
dir shmvmqv
223438 snqcgbs.bng
$ cd pgqmwn
$ ls
134640 dqvcqs.zpb
dir nrdd
25431 nvqsqtjw
149751 qhzqw
dir vfmcjhwz
dir zlfhr
$ cd nrdd
$ ls
dir pgqmwn
$ cd pgqmwn
$ ls
57090 nfbd
$ cd ..
$ cd ..
$ cd vfmcjhwz
$ ls
24256 fdzfwfh.rcv
$ cd ..
$ cd zlfhr
$ ls
20504 fgbpndj.wgm
181769 qnm
$ cd ..
$ cd ..
$ cd shmvmqv
$ ls
208988 nbb.ztq
$ cd ..
$ cd ..
$ cd ..
$ cd vtm
$ ls
dir lqvjm
dir msmtcnsj
dir qmtgdn
dir tmw
$ cd lqvjm
$ ls
239772 hnj.zqf
$ cd ..
$ cd msmtcnsj
$ ls
48711 clfl.fsl
245929 ddh.gdq
dir fvlb
241040 nvqsqtjw
dir shmvmqv
305567 vdzzqpz.jfs
$ cd fvlb
$ ls
25669 ddz.tbc
$ cd ..
$ cd shmvmqv
$ ls
283905 nvqsqtjw
$ cd ..
$ cd ..
$ cd qmtgdn
$ ls
246479 pgqmwn
35386 rtf.cdp
217551 sgm.mrz
$ cd ..
$ cd tmw
$ ls
dir qfggmdvd
dir tlv
dir tmw
$ cd qfggmdvd
$ ls
288091 djwfq.wzc
37383 pwnzdj
214119 shmvmqv.wlg
29747 tmw.ntw
146556 zgbd
$ cd ..
$ cd tlv
$ ls
142924 grj.qhw
210672 qhmn
209554 zbcqcb.mhn
141215 zjmrgw.wlc
$ cd ..
$ cd tmw
$ ls
dir fwsgn
dir tmw
$ cd fwsgn
$ ls
dir qbbhrst
306142 sgm
$ cd qbbhrst
$ ls
dir sgm
dir srbn
$ cd sgm
$ ls
80992 bbvqrcf.chp
$ cd ..
$ cd srbn
$ ls
161382 nvqsqtjw
$ cd ..
$ cd ..
$ cd ..
$ cd tmw
$ ls
219508 dqvcqs.zpb
dir tmw
134434 wbvvgqwn.bmh
$ cd tmw
$ ls
209116 pgqmwn

61
2022/07/part1 Normal file
View File

@@ -0,0 +1,61 @@
#!/usr/bin/env python
import re
from functools import reduce
FS = {}
POS = [] # empty dict is /
def dig(d, keys):
if keys == []:
return d
else:
return reduce(dict.__getitem__, keys, d)
def process_instruction(spec):
_, cmd, *args = spec.split(" ")
if cmd == "cd":
if args[0] == "/":
POS.clear()
elif args[0] == "..":
POS.pop()
else:
POS.append(args[0])
elif cmd != "ls": # nothing to do for ls
raise "Unknown command: " + spec
def process_output(spec):
cwd = dig(FS, POS)
size_or_dir, name = spec.split(" ")
if size_or_dir == "dir":
cwd[name] = {}
else:
cwd[name] = int(size_or_dir)
with open('input') as f:
# Read the diagram + separating line
for line in f:
if line[0] == '$':
process_instruction(line.rstrip())
else:
process_output(line.rstrip())
SIZE = []
# Recursively sum each dictionary and add the sums together
def sum_sizes(d):
sz = 0
for v in d.values():
if isinstance(v, dict):
sz = sz + sum_sizes(v)
else:
sz = sz + v
if sz <= 100000:
SIZE.append(sz)
return sz
sum_sizes(FS)
print(sum(SIZE))

67
2022/07/part2 Executable file
View File

@@ -0,0 +1,67 @@
#!/usr/bin/env python
import re
from functools import reduce
FS = {}
POS = [] # empty dict is /
def dig(d, keys):
if keys == []:
return d
else:
return reduce(dict.__getitem__, keys, d)
def process_instruction(spec):
_, cmd, *args = spec.split(" ")
if cmd == "cd":
if args[0] == "/":
POS.clear()
elif args[0] == "..":
POS.pop()
else:
POS.append(args[0])
elif cmd != "ls": # nothing to do for ls
raise "Unknown command: " + spec
def process_output(spec):
cwd = dig(FS, POS)
size_or_dir, name = spec.split(" ")
if size_or_dir == "dir":
cwd[name] = {}
else:
cwd[name] = int(size_or_dir)
with open('input') as f:
# Read the diagram + separating line
for line in f:
if line[0] == '$':
process_instruction(line.rstrip())
else:
process_output(line.rstrip())
SIZE = []
# Recursively sum each dictionary and add the sums together
def sum_sizes(d):
sz = 0
for v in d.values():
if isinstance(v, dict):
sz = sz + sum_sizes(v)
else:
sz = sz + v
SIZE.append(sz)
return sz
total_used = sum_sizes(FS)
space_free = 70000000 - total_used
target = 30000000 - space_free
for v in sorted(SIZE):
if v >= target:
print(v)
break

99
2022/08/input Normal file
View File

@@ -0,0 +1,99 @@
230302102312303431324124303141114045300001501242156105363242032123135210143324224140132332112100221
322200120140130323143433402101444233512140224062422011111403231052521053542252401012232443102111032
220300201042003221454531141345330151415344324656555610153343240503352304331551230452141112120303320
131301034134041313145104311104431531104002136262204021050462633364005504230105333250310334430012231
021000431324243205221240551231546346005546113055526350502461501303260444304552521404504240012202100
130032042140100501120530551053341401664420533042546256013026351632616214431331333233341222140143402
102213021202104044154525451632332223320015014365014110000262152226451306654102512123512023131343201
331321033401405043214153225511265312435604105124767542760400104362304616510410004451235001241134031
234010022341252215202325124644011146300614531262461555623242615510132104506502155353245030411321214
304102101231325220244422554336626240225366453655233535214545356712401516453566460554521045401410034
124222310241022025221634021203456261377536264451547554432421672616632511164231351545110100421124041
231432431351552412035636562534314116212363155763515352233177566413166344310511112324524355103343213
103031123324141030040550165506212465546735652123674755314542271633361443500442335114204031255241224
320113443131100311503426244335257671411253247761166615472155473411374661621210160254602143000503002
003031503150544521324165216521624371212157515435232724117746343274255223574322040541222535240125320
431234101124435354234422257673575575175341283683836588272273446224536761435621240216142511140302323
123130200251405600130545412766211145442246588283778878426386645127335561311156623533260243441410122
432402514341626355125037245134531317588423262388855625822687585244364351651321623121561560010312113
312341305215255100304471152277172523637784345263433358277226635245516164123212336452605424200110430
001434330142034560665237211325533756327872855833882354736845633764265764254723135136216531341302425
345110412256633232261137637156368637757634446735753883783375577533786454271246611655350133245255344
130515311233246602623742771612278266785844368233445235428485736334867477631346361563230603123034134
330040046512436325746335744443684727248746257893478978476233834562664674872164576161101306065422041
222154026412500467311716243862854643768585738339383839693837627262625554423155651645532206206134414
542550455123342216235327358832483365754856794969568679863575688486863754828773355515541016335040545
404234533623052522751165344644483278684968464647937735374953694986883822877673474565215510426220344
314254353400344713147333655472357537587356967673598874457668767889935746887521663427411521635661241
250301522140303127537224263455464893375697787574446387685355687386368545878447447117247625662212301
531245634640354662654558667774728435789865389774334746464789766764944468568554351264634206163162541
254210565205047575772722425336239545866857335764867899689375964484886366575237326255114412442436305
254440240052645344117878758858477694934868449869846797495773435673485582766622343237654674230614650
302350056253421457757382352837655457348549979584868566587675763536549455773244366226575120110432202
524251410101643732555863746673768898357598988876769465556757759865678788677845447537546514520246465
412424366507365464723435562846447777556788564867748886999988659539789863738827284322243654235650222
302260630341726247764652638469957786688964699758599945666799457875988357894464748565724572166261234
215150213244237121847528247786444449998976749466844877974565875546766745893426378444445742710223525
424160233533557213425484474439489658786978977985856797555685676569553489768586885887425626363046446
153322066741372433344452464455559968984567799888687677756697744545783483874576867684647332571001005
145420124453223247785888737894569596698676567955697655669665679864796955354676474465373675660155614
033506450161333145373824444348436889577445897969987595896979686466678689467597644746532527513131131
225012522655144432763537973395798658496758867787886779885975689947696977368784268458336146373115143
216342537614133655675625959443677654855666875698895757965779667678777945996749485327555574145424460
166106344353256563624325443477776845578965867968867569996565856754694668864655545773383227234335414
150522031675635233237668486584959896545865765899786958699768689485564988376498275457676373151605464
412336103615667832572493349365459748765865988788966796676798558958658889874394465442751254315016610
352326617457732528434753466738454444568858687988678798897989789856878957499594873552874152661460523
062415331267566426437243673895878674897896558788889897878987955994767455333837536424584567627336053
411350266636525852438469567638886987958577976996868967687585597767547999698594634538245463464543005
052464462614766832722735867947598567878869668679877788879769878876988899643845375267672315514353000
543545564473648376567477376798669977686956967668898889969875757785956549649485643782434576251353131
634033674455736672452884665689654778778759896979877869977686568577555776433947564287374612267436364
620541245674573376723897469464969646966776677799787978979857977798869788359344972235473531452736105
602620347126374653254296764775476547797557857869988876878957998886476566934646536357683276776151421
453313013613244386884696349435758974966876787969887886879899685595858499393337785854825724737215563
633162016753461244685737989459664898569667899679799786798979988797998958559548885735471347141136630
000101426742225562735894769979656676989556887676998666978968879767489645833678358457422477754521142
620262606411662643533249376858748847498879757666997687879595676878844467633967768755461265735510400
360023137544654575733228376896988578467698566656988978959969695576685749457685864437734765717026064
453004005155344764583728835857979544659758957678779579869558958494954483997436423583442547122611144
542364512554772785834745874957646879945679759867877799887755596454644564849589474263221373377352410
002404034225236156254239388474876685554666797767767967895789558759867549659597464467365225556245635
245410135477125426663788797639838547747878866579559887665897566567957973945395387477415314463463430
134134265157751574644752634743354666668958565798799857969998998868959355953856752485414215452524346
134233063522723113742886693543696949958945798696986777765986578999899884698774475872617234240653423
244361001066345154366465584498936779955869489578987799745999756687935697875536775754117227145563503
424615513054521426726444456756894679964484855474988695686689467459399699543485425832215323565610231
010511022361177421578425884488933866869996559974758675556944646898573447548734866775441423552334113
455000614233131572534883424588896457684489858997764475858957676964979965647378323342574224433221410
554234433657562455545554335673953366894875796478846544767476975987878676385863745315342113644542314
334234343615275457652768335759749448996379787584585465788795884334949898848654742611353314261636503
333304555356366151638427333872998755488366686597689567687856687846596683534345663212543346305030250
221202454261633375664542356764698437549939857548989949987335436749598666277762261737227146546505534
240412550420563537276688628732843367868467736695759997434973759746799657483248636225432651522613045
234101415413036337546543888388563596433499988836578844689689497975764628525732325317653041241353030
431410263125326725415234754275746658476797893535668937455785755994425345326575247342241464251000421
235305105630506142127546572374764553754685586586673543349859396362874755756655416517334460144522501
053230360255455453432625173284836864837934635996948769536785973725832747476731215716516416145320150
220341023145561653434447455522778482225563875986777563368797985846552555226462623761223514365411344
555505021215644010564473315638562438843876455985785666379866472746877227331266714741141010601131000
453335252144616255521312353556677472322787423527747647554222386736627248134362414253412412531431213
042151015320560413551651234262565787675225582872838475557456742335545484137617276444245016450453552
014404334344615462565743465273746656366752555484464325685467246827267515345457117051354205241444340
213041551013263163616741653367152326275633684378845888827238722532735171772265542620411543050510551
224455113205603560061536164734146772822552432636277537568582283454552565546556622004610432104440414
120034300413036442405642132721761733145582724757284464865848374626544672733422446132110450322334043
321102323253550034451665134657546626247721386824348475375862731112516436572563504423615532222151203
423413023253053651012440232734663275166577433646527244777525111735773767313620631626060044333201413
310311122105544263022025236566616265144255413423733523634375771573412213343520014446112203251501244
242112304444105230054262221514232727536351532732445557376642241447573270443566533260102401044113312
300401122201443130504625604224103567247721576334262357161547725313757534624304442441502400005401420
312140241542522534423315456561105236441214136262754317657256235334116150340065011324403154142414212
144233324321121441233255150514400352347655162673141155544742475145632635002103305025150134340421444
111103103110050242122311312046534446626061741554364774752533752234163656421540312341011215100222430
303431234002202314522440214134041163045124514037641775350115015005306206502562310105314100032000400
022101131200322543535350013343206260166164021153334624135541245000601615213233143310354543221432032
233233001110344441512334010360062644015111403065346201116113310635016323603102000435213440203331333
221234200414024043305553013402501300310163441031202131631042043410330561032554522352320341422042103
321123401142123425525550311314256215506650120142506242614512364236453401432552531430304012423410223
122333244113420243051112411113522042223653563261365250113056645225530145055223432541231304233333203

40
2022/08/part1 Executable file
View File

@@ -0,0 +1,40 @@
#!/usr/bin/env python
TGRID = [] # heights
VGRID = [] # visibility
def check_visible(x, y, xr, yr):
target = TGRID[y][x]
for y in yr:
for x in xr:
if TGRID[y][x] >= target:
return False
return True
with open('input') as f:
for line in f:
l = []
for tree in line.rstrip():
l.append(int(tree))
TGRID.append(l)
max_y = len(TGRID)
for y in range(0, max_y):
max_x = len(TGRID[y])
l = []
for x in range(0, max_x):
l.append(
check_visible(x, y, range(0, x), range(y, y+1)) or # left to right
check_visible(x, y, range(x, x+1), range(0, y)) or # top to bottom
check_visible(x, y, range(max_x-1, x, -1), range(y, y+1)) or # right to left
check_visible(x, y, range(x, x+1), range(max_y-1, y, -1)) # bottom to top
)
VGRID.append(l)
count = 0
for row in VGRID:
for col in row:
if col:
count = count + 1
print(count)

45
2022/08/part2 Executable file
View File

@@ -0,0 +1,45 @@
#!/usr/bin/env python
TGRID = [] # heights
VGRID = [] # scenic score
def count_visible(x, y, xr, yr):
target = TGRID[y][x]
count = 0
for y in yr:
for x in xr:
if TGRID[y][x] >= target:
if x > 0 and y > 0:
count += 1
return count
count+=1
return count
with open('input') as f:
for line in f:
l = []
for tree in line.rstrip():
l.append(int(tree))
TGRID.append(l)
max_y = len(TGRID)
for y in range(0, max_y):
max_x = len(TGRID[y])
l = []
for x in range(0, max_x):
l.append(
count_visible(x, y, range(x, x+1), range(y-1, -1, -1)) * # north
count_visible(x, y, range(x+1, max_x), range(y, y+1)) * # east
count_visible(x, y, range(x, x+1), range(y+1, max_y)) * # south
count_visible(x, y, range(x-1, -1, -1), range(y, y+1)) # west
)
VGRID.append(l)
best_seen = 0
for y in range(0, len(VGRID)):
for x in range(0, len(VGRID[y])):
if VGRID[y][x] > best_seen:
best_seen = VGRID[y][x]
print(best_seen)

2000
2022/09/input Normal file

File diff suppressed because it is too large Load Diff

40
2022/09/part1 Executable file
View File

@@ -0,0 +1,40 @@
#!/usr/bin/env python
import math
MOVES = {
'U': ( 0, -1),
'D': ( 0, +1),
'L': (-1, 0),
'R': (+1, 0),
}
TAIL_POSITIONS = set([])
HEAD = (0, 0)
TAIL = (0, 0)
def point_add(a, b):
return tuple(map(lambda i, j: i + j, a, b))
def move(delta):
global TAIL_POSITIONS, HEAD, TAIL
last_head = HEAD
HEAD = point_add(HEAD, delta)
if ed := math.dist(HEAD, TAIL) < 2.0:
_ # do nothing
elif ed == 2.0:
TAIL = point_add(TAIL, delta)
else:
TAIL = last_head
TAIL_POSITIONS.add(TAIL)
with open('input') as f:
for line in f:
direction, count = line.rstrip().split(" ")
for _ in range(int(count)):
move(MOVES[direction])
print(len(TAIL_POSITIONS))

60
2022/09/part2 Executable file
View File

@@ -0,0 +1,60 @@
#!/usr/bin/env python
import math
MOVES = {
'U': ( 0, -1),
'D': ( 0, +1),
'L': (-1, 0),
'R': (+1, 0),
}
TAIL_POSITIONS = set([])
HEAD = (0, 0)
TAILS = [(0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0), (0, 0)]
def point_add(a, b):
return tuple(map(lambda i, j: i + j, a, b))
def move(delta):
global TAIL_POSITIONS, HEAD, TAIL
HEAD = point_add(HEAD, delta)
leader = HEAD
for idx, tail in enumerate(TAILS):
ed = math.dist(leader, tail);
if ed < 2.0:
_ # do nothing
elif ed == 2.0: # follow the leader: linear
x, y = 0,0
if leader[0] < tail[0]:
x = -1
elif leader[0] > tail[0]:
x = 1
if leader[1] < tail[1]:
y = -1
elif leader[1] > tail[1]:
y = 1
TAILS[idx] = point_add(tail, (x,y))
else: # follow the leader: diagonal
x, y = 1, 1
if leader[0] < tail[0]:
x = -1
if leader[1] < tail[1]:
y = -1
TAILS[idx] = point_add(tail, (x,y))
leader = TAILS[idx]
TAIL_POSITIONS.add(TAILS[-1])
with open('input') as f:
for line in f:
direction, count = line.rstrip().split(" ")
for _ in range(int(count)):
move(MOVES[direction])
print(len(TAIL_POSITIONS))

143
2022/10/input Normal file
View File

@@ -0,0 +1,143 @@
noop
noop
noop
addx 5
addx 1
addx 4
addx 1
noop
addx 4
noop
addx 1
addx 4
addx 8
addx -7
addx 3
addx 1
noop
addx 4
addx 2
addx 5
addx -1
noop
addx -37
noop
noop
addx 3
addx 2
addx 13
addx 12
addx -15
addx -2
addx 2
addx -11
addx 18
addx 2
addx -15
addx 16
addx 5
addx 2
addx 5
noop
noop
noop
addx 3
addx -2
addx -38
noop
addx 3
addx 4
noop
noop
noop
noop
noop
addx 5
addx 5
noop
noop
addx 21
addx -17
addx 6
noop
noop
noop
noop
addx 5
noop
noop
noop
noop
noop
addx 3
addx 5
addx -38
noop
noop
addx 5
addx -2
addx 1
addx 7
noop
addx 22
addx -18
addx -11
addx 27
addx -13
addx 2
addx 5
addx -8
addx 9
addx 2
noop
addx 7
noop
addx 1
noop
addx -38
noop
addx 2
addx 5
addx -3
noop
addx 8
addx 11
addx -6
noop
addx 24
addx -31
addx 10
addx 2
addx 5
addx 3
noop
addx 2
addx -29
addx 21
addx 11
addx 5
addx -39
addx 4
addx -2
addx 2
addx 7
noop
addx -1
addx 2
noop
addx 4
noop
addx 1
addx 2
addx 5
addx 2
noop
noop
addx -6
addx 9
addx -18
addx 25
addx 3
noop
addx -17
noop

28
2022/10/part1 Executable file
View File

@@ -0,0 +1,28 @@
#!/usr/bin/env python
CLOCK = 1
X = 1
X_VALUES = []
with open('input') as f:
for line in f:
ins, *args = line.rstrip().split(" ")
if ins == "noop":
CLOCK += 1
X_VALUES.append(X)
elif ins == "addx":
CLOCK += 2
X_VALUES.append(X)
X_VALUES.append(X)
X += int(args[0])
print(
(X_VALUES[19] * 20) +
(X_VALUES[59] * 60) +
(X_VALUES[99] * 100) +
(X_VALUES[139] * 140) +
(X_VALUES[179] * 180) +
(X_VALUES[219] * 220)
)

32
2022/10/part2 Executable file
View File

@@ -0,0 +1,32 @@
#!/usr/bin/env python
CLOCK = 0
X = 1
OUT = []
def clock():
global CLOCK, X, OUT
pos = CLOCK%40
if X == pos or X-1 == pos or X+1 == pos:
OUT.append('#')
else:
OUT.append('.')
if pos == 39:
OUT.append("\n")
CLOCK += 1
with open('input') as f:
for line in f:
ins, *args = line.rstrip().split(" ")
if ins == "noop":
clock()
elif ins == "addx":
clock()
clock()
X += int(args[0])
print(''.join(OUT))

55
2022/11/input Normal file
View File

@@ -0,0 +1,55 @@
Monkey 0:
Starting items: 89, 73, 66, 57, 64, 80
Operation: new = old * 3
Test: divisible by 13
If true: throw to monkey 6
If false: throw to monkey 2
Monkey 1:
Starting items: 83, 78, 81, 55, 81, 59, 69
Operation: new = old + 1
Test: divisible by 3
If true: throw to monkey 7
If false: throw to monkey 4
Monkey 2:
Starting items: 76, 91, 58, 85
Operation: new = old * 13
Test: divisible by 7
If true: throw to monkey 1
If false: throw to monkey 4
Monkey 3:
Starting items: 71, 72, 74, 76, 68
Operation: new = old * old
Test: divisible by 2
If true: throw to monkey 6
If false: throw to monkey 0
Monkey 4:
Starting items: 98, 85, 84
Operation: new = old + 7
Test: divisible by 19
If true: throw to monkey 5
If false: throw to monkey 7
Monkey 5:
Starting items: 78
Operation: new = old + 8
Test: divisible by 5
If true: throw to monkey 3
If false: throw to monkey 0
Monkey 6:
Starting items: 86, 70, 60, 88, 88, 78, 74, 83
Operation: new = old + 4
Test: divisible by 11
If true: throw to monkey 1
If false: throw to monkey 2
Monkey 7:
Starting items: 81, 58
Operation: new = old + 5
Test: divisible by 17
If true: throw to monkey 3
If false: throw to monkey 5

58
2022/11/part1 Executable file
View File

@@ -0,0 +1,58 @@
#!/usr/bin/env python
import re
MONKEYS = []
def parse_factor(old, factor):
if factor == 'old':
return old
return int(factor)
OPS = {
'*': lambda old, factor: old * parse_factor(old, factor),
'+': lambda old, factor: old + parse_factor(old, factor),
}
with open('input') as f:
monkey = {'inspections': 0}
for line in f:
if line == "\n":
MONKEYS.append(monkey)
monkey = {'inspections': 0}
elif match := re.match('^Monkey (\d+):$', line):
monkey['id'] = int(match[1])
elif match := re.match('^ Starting items:', line):
_, items = line.rstrip().split(":")
monkey['items'] = list(map(int, items.split(", ")))
elif match := re.match('^ Operation: new = old ([\*\+]) (\w+)', line):
monkey['op_op'] = match[1]
monkey['op_factor'] = match[2]
elif match := re.match('^ Test: divisible by (\d+)$', line):
monkey['test_factor'] = int(match[1])
elif match := re.match('^ If (true|false): throw to monkey (\d+)$', line):
monkey['test_'+match[1]] = int(match[2])
else:
raise Exception('unhandled line: '+line)
MONKEYS.append(monkey)
for idx, monkey in enumerate(MONKEYS):
assert(idx == monkey['id'])
for r in range(1, 21): # round
for monkey in MONKEYS: # turn
for item in monkey['items']:
item = OPS[monkey['op_op']](item, monkey['op_factor'])
item = item // 3
if item % monkey['test_factor'] == 0:
MONKEYS[monkey['test_true']]['items'].append(item)
else:
MONKEYS[monkey['test_false']]['items'].append(item)
monkey['inspections'] = monkey['inspections'] + 1
monkey['items'] = []
by_inspections = sorted(MONKEYS, key=lambda monkey: monkey['inspections'])
print(by_inspections[-1]['inspections'] * by_inspections[-2]['inspections'])

62
2022/11/part2 Executable file
View File

@@ -0,0 +1,62 @@
#!/usr/bin/env python
import re
import math
MONKEYS = []
def parse_factor(old, factor):
if factor == 'old':
return old
return int(factor)
OPS = {
'*': lambda old, factor: old * parse_factor(old, factor),
'+': lambda old, factor: old + parse_factor(old, factor),
}
with open('input') as f:
monkey = {'inspections': 0}
for line in f:
if line == "\n":
MONKEYS.append(monkey)
monkey = {'inspections': 0}
elif match := re.match('^Monkey (\d+):$', line):
monkey['id'] = int(match[1])
elif match := re.match('^ Starting items:', line):
_, items = line.rstrip().split(":")
monkey['items'] = list(map(int, items.split(", ")))
elif match := re.match('^ Operation: new = old ([\*\+]) (\w+)', line):
monkey['op_op'] = match[1]
monkey['op_factor'] = match[2]
elif match := re.match('^ Test: divisible by (\d+)$', line):
monkey['test_factor'] = int(match[1])
elif match := re.match('^ If (true|false): throw to monkey (\d+)$', line):
monkey['test_'+match[1]] = int(match[2])
else:
raise Exception('unhandled line: '+line)
MONKEYS.append(monkey)
for idx, monkey in enumerate(MONKEYS):
assert(idx == monkey['id'])
# keep the size of the numbers down
lcm = math.lcm(*map(lambda monkey: monkey['test_factor'], MONKEYS))
for r in range(0,10000): # round
for monkey in MONKEYS: # turn
for item in monkey['items']:
item = OPS[monkey['op_op']](item, monkey['op_factor'])
item = item % lcm
if item % monkey['test_factor'] == 0:
MONKEYS[monkey['test_true']]['items'].append(item)
else:
MONKEYS[monkey['test_false']]['items'].append(item)
monkey['inspections'] = monkey['inspections'] + 1
monkey['items'] = []
by_inspections = sorted(MONKEYS, key=lambda monkey: monkey['inspections'])
print(by_inspections[-1]['inspections'] * by_inspections[-2]['inspections'])

41
2022/12/input Normal file
View File

@@ -0,0 +1,41 @@
abccccccccccccccccaaccccccccccccccccccccaaaaaaaaaaaaacccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaaa
abcccccccccccccaaaaaccccccccccccccccccccaaaaaaaaaaaaaccccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaaa
abccccccccccccccaaaaaccccccccccccccaaaaacccaaaaaacccccaaccccccccccccccccccccccccccccccccccccccccccccccccccccccaaaa
abccccccccccccccaaaaacccccccccaacccaaaaacccaaaaaaaccccaaaacaacaaccccccccccccccccccccccccaaaccccaaaccccccccccccaaaa
abcccccccccccccaaaaacccccccaaaaaccaaaaaacccaaaaaaaacaaaaaacaaaaaccccccccccccccccccccccccaaacccaaaaccccccccccccaaac
abccccccaacaaaccccaaccccccccaaaaacaaaaaaccaaaacaaaacaaaaaccaaaaaaccccccccccccccccccccccccaaaaaaaacccccccccccccaacc
abccccccaaaaaaccccccccccccccaaaaacaaaaaaccaaaaccaaaacaaaaacaaaaaacccccccccccccccccccccccaaaaaaaaaccccccccccccccccc
abccccccaaaaaacccccccccccccaaaaaccccaaccccaacccccaaccaacaacaaaaaccccccccccccccccccccccccccaaakkkkllllcccaaaccccccc
abccccccaaaaaaacccccccccccccccaaccccaacccccccccccccccccccccccaaaccccccaaaacccccccccjjjjkkkkkkkkkkllllccccaacaccccc
abcccccaaaaaaaacccccaaccccccccccccccaaaaaaccccccccccccccccccaaccccccccaaaaccccccccjjjjjkkkkkkkkkppllllcccaaaaacccc
abcccccaaaaaaaaccaaaacccccccccccccccaaaaaccccccccccccccccaacaaccccccccaaaacccccccjjjjjjjkkkkkppppppplllccaaaaacccc
abccccccccaaaccccaaaaaacccccccccccaaaaaaaccccccccccccccccaaaaacccccccccaacccccccjjjjoooooooppppppppplllcccaaaccccc
abccccccccaaccccccaaaaaccccaacccccaaaaaaaaccccaaacccccccccaaaaaaacccccccccccccccjjjooooooooppppuuppppllcccaaaccccc
abccccccaacccccccaaaaacccccaaaccaaaaaaaaaaccaaaaaaccccccaaaaaaaaaacaaaccccccccccjjjoooouuuoopuuuuupppllcccaaaccccc
abacccccaaccccccccccaacccccaaaaaaaccaaaaaaccaaaaaaccccccaaaaaccaaaaaaaccccaaccccjjoootuuuuuuuuuuuuvpqlllcccccccccc
abaccaaaaaaaacccccccccccccccaaaaaaccaacccccccaaaaacccccccacaaaccaaaaaaccaaaacaccjjooottuuuuuuuxyuvvqqljjccddcccccc
abcccaaaaaaaaccccccccccccaaaaaaaaacaacaaccccaaaaaccccccccccaaaaaaaaaacccaaaaaacciijootttxxxuuxyyyvvqqjjjjdddcccccc
abcccccaaaaccccaaacccccccaaaaaaaaacaaaaaccccaaaaaccccccccccccaaaaaaaaacccaaaaccciiinntttxxxxxxyyvvqqqqjjjddddccccc
abccccaaaaaccccaaaaacccccaaaaaaaaaaaaaaaaccccccccccccccccccccaaaaaaaaaaccaaaaccciiinntttxxxxxxyyvvvqqqqjjjdddccccc
abccccaaaaaaccaaaaaccccccccaaaaaaaaaaaaaacccccccccccccccccccccccaaacaaacaacaaccciiinnnttxxxxxyyyvvvvqqqqjjjdddcccc
SbccccaaccaaccaaaaacccccccccaaaaaaaaaaaaacccccccccccccccccccccccaaacccccccccccciiinnntttxxxEzzyyyyvvvqqqjjjdddcccc
abcccccccccccccaaaaacccccccaaaaaaaaacaaaccccccccccccccccccccccccaaccccccccccccciiinnnttxxxxyyyyyyyyvvvqqqjjjdddccc
abcccccccccccccaaccccccccccaaaaaaaaccccccccccccccccccccccccccccccccccccccccccciiinnntttxxyyyyyyyyyvvvvqqqjjjdddccc
abccccccccccccccccccccccccaaaaaaaacccccccccccccccccccccccccccccccccccccccccccciiinntttxxxwwwyyywwvvvvrqqjjjjdddccc
abcccccccccccccccccccccccccccaaaaaaccccccccccccccccccccccccccccccccccccccccccciinnntttxwwwwwyyywwvvvrrrqkkkeddcccc
abcccccccccccccccccccccccccccaaaaaaccccccccccccccccccccccccccccccccccccccccccchhnnntttsswwswwyywwrrrrrrkkkkeeecccc
abcccccccccccccccccccccccccccaaaaaacccccccccccccccccccaccccccccccccaaacccccccchhhnmmssssssswwwwwwrrrkkkkkeeeeecccc
abcccccccccccccccccccccccccccccaaacccccccccccccccccccaaccccccccccaaaaaacccccaahhhmmmmmsssssswwwwrrrkkkkkeeeeeccccc
abaacccccccccccccaccccccccccccccccccccccccccccccccaaaaacaacccccccaaaaaacaaaaaahhhhmmmmmmmmssswwwrrkkkkeeeeeacccccc
abacccccccccccccaaaaaaaaccccccccaaacccccccaaccccccaaaaaaaacccccccaaaaaacaaaaaaahhhhmmmmmmmmsssrrrrkkkeeeeeaacccccc
abaaaccccaaccccccaaaaaacccccccccaaacccaacaaaccccccccaaaacccccccccaaaaacccaaaaaaahhhhhhhmmmmlsssrrllkfeeeeaaaaacccc
abaaaccaaaaccccccaaaaaacccccccccaaaaaaaaaaaaaacccccaaaaacccccccccaaaaacccaaaaaaachhhhhgggmllsssrrllkffeaaaaaaacccc
abaacccaaaaaacccaaaaaaaacccccaaaaaaaaaaaaaaaaacccccaacaaacccccccccccccccaaaaaacccccchggggglllllllllfffaaaaaaaacccc
abaaccccaaaacccaaaaaaaaaaccccaaaaaaaaacaaaaaaaccaccaccaaacccccccccccccccaaaaaacccccccccgggglllllllffffaaaaaacccccc
abcccccaaaaacccaaaaaaaaaacccccaaaaaaaccaaaaacccaaaccccccccccccccccccccccccccaacccccccccagggglllllffffccccaaacccccc
abcccccaacaaccccccaaaaacaccaacccaaaaaaaaaaaaaccaaacccccccccccccccccccccccccccccccccccccaagggggffffffcccccccccccccc
abcccccccccccaaaaaaaaacccccaaccaaaaaaaccaaaaacaaaaccccccccccccccccccccccccccccccccccccaaaacgggfffffccccccccccccccc
abcccccccccccaaaaacaacccaaaaaaaaaaccaacccaaaaaaaacccaaccccccccccccccccccccccccccccccccccccccggfffccccccccccccaaaca
abccccccccccaaaaaaccccccaaaaaaaaacccccccccaaaaaaaaaaaacccccccccccccaaaccccccccccccccccccccccaaaccccccccccccccaaaaa
abccccccccccaaaaaaccccccccaaaacccccccccccccaaaaaaaaaaaaccccccccccccaaaaccccccccccccccccccccccaaaccccccccccccccaaaa
abcccccccccccaaaaacccccccaaaaaaccccccccccaaaaaaaaaaaaaaccccccccccccaaaaccccccccccccccccccccccccccccccccccccccaaaaa

63
2022/12/part1 Executable file
View File

@@ -0,0 +1,63 @@
#!/usr/bin/env python
import math
MAP = []
START = (0, 0)
END = (0, 0)
DISTANCES = {}
def possible(x, y):
global MAP
threshold = MAP[y][x] + 1 # Can't go higher than this, can always go lower
points = [(x-1,y),(x+1,y),(x,y-1),(x,y+1)]
out = []
for (x,y) in points:
if x < 0 or y < 0:
continue
if len(MAP) < y+1 or len(MAP[y]) < x+1:
continue
if MAP[y][x] > threshold:
continue
out.append((x,y))
return out
with open('input') as f:
for y, line in enumerate(f):
row = []
for x, byte in enumerate(line.rstrip()):
DISTANCES[(x,y)] = math.inf
if byte == 'S':
byte = 'a'
START = (x,y)
DISTANCES[START] = 0
elif byte == 'E':
byte = 'z'
END = (x,y)
row.append(ord(byte) - ord('a'))
MAP.append(row)
visited = set([])
queue = [START]
while len(queue) > 0:
pos = queue.pop(0)
visited.add(pos)
for neighbour in possible(*pos):
if neighbour == END:
print(DISTANCES[pos] + 1)
quit()
if DISTANCES[neighbour] > DISTANCES[pos] + 1:
DISTANCES[neighbour] = DISTANCES[pos] + 1
if neighbour not in visited and neighbour not in queue:
queue.append(neighbour)
print("Couldn't find it!")

68
2022/12/part2 Executable file
View File

@@ -0,0 +1,68 @@
#!/usr/bin/env python
import math
from collections import defaultdict
MAP = []
END = (0, 0)
def possible(x, y):
global MAP
threshold = MAP[y][x] + 1 # Can't go higher than this, can always go lower
points = [(x-1,y),(x+1,y),(x,y-1),(x,y+1)]
out = []
for (x,y) in points:
if x < 0 or y < 0:
continue
if len(MAP) < y+1 or len(MAP[y]) < x+1:
continue
if MAP[y][x] > threshold:
continue
out.append((x,y))
return out
with open('input') as f:
for y, line in enumerate(f):
row = []
for x, byte in enumerate(line.rstrip()):
if byte == 'S':
byte = 'a'
elif byte == 'E':
byte = 'z'
END = (x,y)
row.append(ord(byte) - ord('a'))
MAP.append(row)
def search(start):
distances = defaultdict(lambda: math.inf)
distances[start] = 0
visited = set([])
queue = [start]
while len(queue) > 0:
pos = queue.pop(0)
visited.add(pos)
for neighbour in possible(*pos):
if neighbour == END:
return distances[pos] + 1
if distances[neighbour] > distances[pos] + 1:
distances[neighbour] = distances[pos] + 1
if neighbour not in visited and neighbour not in queue:
queue.append(neighbour)
return None # Some start positions may not have a valid path
results = []
for y, row in enumerate(MAP):
for x, height in enumerate(row):
if height == 0:
result = search((x,y))
if result != None:
results.append(result)
print(sorted(results)[0])

View File

@@ -0,0 +1,23 @@
# Advent of Code
In this repository are my Advent of Code solutions.
I don't religiously take part, and tend to bow out before halfway through even
on the years I do take part. Mostly, it's how I find an excuse to write code in
a programming language I'm interested in learning more about.
2018, 2019, and 2020 were in their own separate repositories, but have been
`git subtree`'d into this one - no point creating a new repository every year.
* [2022](https://code.ur.gs/lupine/advent-of-code/src/branch/main/2022) 🌟 `24` - Python
* [2021](https://code.ur.gs/lupine/advent-of-code/src/branch/main/2021) 🌟 ` 5` - Python
* [2020](https://code.ur.gs/lupine/advent-of-code/src/branch/main/2020) 🌟 `20` - Javascript
* [2019](https://code.ur.gs/lupine/advent-of-code/src/branch/main/2019) 🌟 `22` - Zig
* [2018](https://code.ur.gs/lupine/advent-of-code/src/branch/main/2018) 🌟 ` 6` - Rust
* 2017 🌟 ` 0` - ?
* 2016 🌟 `16` - LISP?
* 2015 🌟 ` 9` - Ruby?
Total: 🌟 `102`
Maybe I'll backfill some of the old years one day.