re-organise repo
This commit is contained in:
44
2022/go/day01/day01.go
Normal file
44
2022/go/day01/day01.go
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
package day01
|
||||||
|
|
||||||
|
import (
|
||||||
|
"sort"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"adventofcode2022/utils"
|
||||||
|
)
|
||||||
|
|
||||||
|
type elf struct {
|
||||||
|
calories int
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
elves := common(input)
|
||||||
|
return elves[0].calories
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
elves := common(input)
|
||||||
|
return elves[0].calories + elves[1].calories + elves[2].calories
|
||||||
|
}
|
||||||
|
|
||||||
|
func common(input string) []elf {
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
|
||||||
|
elves := []elf{}
|
||||||
|
e := elf{}
|
||||||
|
for _, line := range lines {
|
||||||
|
if line == "" {
|
||||||
|
elves = append(elves, e)
|
||||||
|
e = elf{}
|
||||||
|
} else {
|
||||||
|
e.calories += utils.MustAtoi(line)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
elves = append(elves, e)
|
||||||
|
|
||||||
|
sort.Slice(elves, func(i, j int) bool {
|
||||||
|
return elves[i].calories > elves[j].calories
|
||||||
|
})
|
||||||
|
|
||||||
|
return elves
|
||||||
|
}
|
||||||
43
2022/go/day01/day01_test.go
Normal file
43
2022/go/day01/day01_test.go
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
package day01
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/assert"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`1000
|
||||||
|
2000
|
||||||
|
3000
|
||||||
|
|
||||||
|
4000
|
||||||
|
|
||||||
|
5000
|
||||||
|
6000
|
||||||
|
|
||||||
|
7000
|
||||||
|
8000
|
||||||
|
9000
|
||||||
|
|
||||||
|
10000`)
|
||||||
|
assert.Equal(t, 24000, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(`1000
|
||||||
|
2000
|
||||||
|
3000
|
||||||
|
|
||||||
|
4000
|
||||||
|
|
||||||
|
5000
|
||||||
|
6000
|
||||||
|
|
||||||
|
7000
|
||||||
|
8000
|
||||||
|
9000
|
||||||
|
|
||||||
|
10000`)
|
||||||
|
assert.Equal(t, 45000, r)
|
||||||
|
}
|
||||||
2255
2022/go/day01/input.txt
Normal file
2255
2022/go/day01/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
89
2022/go/day02/day02.go
Normal file
89
2022/go/day02/day02.go
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
package day02
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
var sum int = 0
|
||||||
|
|
||||||
|
values := map[string]int{
|
||||||
|
"Rock": 1,
|
||||||
|
"Paper": 2,
|
||||||
|
"Scissors": 3,
|
||||||
|
}
|
||||||
|
|
||||||
|
translateMap := map[string]string{
|
||||||
|
"X": "Rock",
|
||||||
|
"Y": "Paper",
|
||||||
|
"Z": "Scissors",
|
||||||
|
"A": "Rock",
|
||||||
|
"B": "Paper",
|
||||||
|
"C": "Scissors",
|
||||||
|
}
|
||||||
|
|
||||||
|
winOn := map[string]string{
|
||||||
|
"Rock": "Scissors",
|
||||||
|
"Paper": "Rock",
|
||||||
|
"Scissors": "Paper",
|
||||||
|
}
|
||||||
|
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
for _, line := range lines {
|
||||||
|
objects := strings.Split(line, " ")
|
||||||
|
opponent := translateMap[objects[0]]
|
||||||
|
player := translateMap[objects[1]]
|
||||||
|
sum = sum + values[player]
|
||||||
|
if player == opponent {
|
||||||
|
sum = sum + 3
|
||||||
|
} else if winOn[player] == opponent {
|
||||||
|
sum = sum + 6
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sum
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
var sum int = 0
|
||||||
|
|
||||||
|
values := map[string]int{
|
||||||
|
"Rock": 1,
|
||||||
|
"Paper": 2,
|
||||||
|
"Scissors": 3,
|
||||||
|
}
|
||||||
|
|
||||||
|
translateMap := map[string]string{
|
||||||
|
"X": "Lose",
|
||||||
|
"Y": "Draw",
|
||||||
|
"Z": "Win",
|
||||||
|
"A": "Rock",
|
||||||
|
"B": "Paper",
|
||||||
|
"C": "Scissors",
|
||||||
|
}
|
||||||
|
|
||||||
|
winOn := map[string]string{
|
||||||
|
"Rock": "Paper",
|
||||||
|
"Paper": "Scissors",
|
||||||
|
"Scissors": "Rock",
|
||||||
|
}
|
||||||
|
|
||||||
|
loseOn := map[string]string{
|
||||||
|
"Rock": "Scissors",
|
||||||
|
"Paper": "Rock",
|
||||||
|
"Scissors": "Paper",
|
||||||
|
}
|
||||||
|
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
for _, line := range lines {
|
||||||
|
objects := strings.Split(line, " ")
|
||||||
|
opponent := translateMap[objects[0]]
|
||||||
|
result := translateMap[objects[1]]
|
||||||
|
if result == "Draw" {
|
||||||
|
sum = sum + 3 + values[opponent]
|
||||||
|
} else if result == "Win" {
|
||||||
|
sum = sum + 6 + values[winOn[opponent]]
|
||||||
|
} else {
|
||||||
|
sum = sum + values[loseOn[opponent]]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sum}
|
||||||
23
2022/go/day02/day02_test.go
Normal file
23
2022/go/day02/day02_test.go
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
package day02
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(
|
||||||
|
`A Y
|
||||||
|
B X
|
||||||
|
C Z`)
|
||||||
|
require.Equal(t, 15, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(
|
||||||
|
`A Y
|
||||||
|
B X
|
||||||
|
C Z`)
|
||||||
|
require.Equal(t, 12, r)
|
||||||
|
}
|
||||||
2500
2022/go/day02/input.txt
Normal file
2500
2022/go/day02/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
54
2022/go/day03/day03.go
Normal file
54
2022/go/day03/day03.go
Normal file
@@ -0,0 +1,54 @@
|
|||||||
|
package day03
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
// "fmt"
|
||||||
|
|
||||||
|
mapset "github.com/deckarep/golang-set/v2"
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
var sum int = 0
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
for _, line := range lines {
|
||||||
|
c1 := []rune(line[:len(line)/2])
|
||||||
|
c1set := mapset.NewSet[rune](c1...)
|
||||||
|
|
||||||
|
c2 := []rune(line[len(line)/2:])
|
||||||
|
c2set := mapset.NewSet[rune](c2...)
|
||||||
|
for _, v := range c1set.Intersect(c2set).ToSlice() {
|
||||||
|
sum += getValue(v)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sum
|
||||||
|
}
|
||||||
|
|
||||||
|
func getValue(v rune) int {
|
||||||
|
if v >= 'a' && v <= 'z' {
|
||||||
|
return int(v) - int('a') + 1
|
||||||
|
}
|
||||||
|
if v >= 'A' && v <= 'Z' {
|
||||||
|
return int(v) - int('A') + 27
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
var sum int = 0
|
||||||
|
var idx int = 0
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
for idx=0; idx < len(lines); idx += 3 {
|
||||||
|
c1 := []rune(lines[idx])
|
||||||
|
c1set := mapset.NewSet[rune](c1...)
|
||||||
|
c2 := []rune(lines[idx+1])
|
||||||
|
c2set := mapset.NewSet[rune](c2...)
|
||||||
|
c3 := []rune(lines[idx+2])
|
||||||
|
c3set := mapset.NewSet[rune](c3...)
|
||||||
|
for _, v := range c1set.Intersect(c2set).Intersect(c3set).ToSlice() {
|
||||||
|
sum += getValue(v)
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
return sum
|
||||||
|
}
|
||||||
29
2022/go/day03/day03_test.go
Normal file
29
2022/go/day03/day03_test.go
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
package day03
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(
|
||||||
|
`vJrwpWtwJgWrhcsFMMfFFhFp
|
||||||
|
jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
|
||||||
|
PmmdzqPrVvPwwTWBwg
|
||||||
|
wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
|
||||||
|
ttgJtRGJQctTZtZT
|
||||||
|
CrZsJsPPZsGzwwsLwLmpwMDw`)
|
||||||
|
require.Equal(t, 157, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(
|
||||||
|
`vJrwpWtwJgWrhcsFMMfFFhFp
|
||||||
|
jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
|
||||||
|
PmmdzqPrVvPwwTWBwg
|
||||||
|
wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
|
||||||
|
ttgJtRGJQctTZtZT
|
||||||
|
CrZsJsPPZsGzwwsLwLmpwMDw`)
|
||||||
|
require.Equal(t, 70, r)
|
||||||
|
}
|
||||||
300
2022/go/day03/input.txt
Normal file
300
2022/go/day03/input.txt
Normal file
@@ -0,0 +1,300 @@
|
|||||||
|
hDsDDttbhsmshNNWMNWGbTNqZq
|
||||||
|
VQfjnlFvnQFRdZWdVtqMGdWW
|
||||||
|
zvvvRnFFfjjlRBlBPzgQgRvvmtrmhHcptLHCDhcHHmLsBmsB
|
||||||
|
FrzFvvdTDcTnmTzdDTTzdvWmjhgVPrhSljSQSPwPjPjPjSVC
|
||||||
|
sMsGbqGsbbRqRbBMBGRMbLpNSSpjhlQljHVClhjgPjjPhlVp
|
||||||
|
sNbGtJbMfssNtvcnWFVmnvDd
|
||||||
|
TNfmdFJmfdZMQffVRQVV
|
||||||
|
jVHBCcDSjWrMZjvg
|
||||||
|
SShSbCGpcBtBtwtVLJJddmtLmT
|
||||||
|
CtpNftbNWbtSJDHqGZJFLfLr
|
||||||
|
dPsHlsRBHcZdqDFDZwwJ
|
||||||
|
snjVlvTPlPjVlQlHWjpSmzgNNzSmtpSm
|
||||||
|
qhZtSVqCqThGcGzZnnfZcB
|
||||||
|
WbddWbDwrBzcpzHpBb
|
||||||
|
DBBMFWRJDrDFWLWljCqjQjFvtCsqTjqs
|
||||||
|
vhFTzRzzTmPvbplWFtQttQQZtZhMZqcqSQ
|
||||||
|
fJVCfDfJNCLDwJNGmssZgwqgZcmtgcms
|
||||||
|
VmdVNLHGGVDBdfLCHnLGHnbWpTplWbddRTlzplWPpbFp
|
||||||
|
smwtNVqRjNmZjZBDSvzSzl
|
||||||
|
FnTJFcTTFccCrJGTLncdCCcPJZfBBDSlSJwZDlggSffvgSSf
|
||||||
|
FWTFGLFWLCPWrCnFnQWNbQVVwphhmHHbptVsss
|
||||||
|
BrrgrtgfBpPFhhgMWq
|
||||||
|
ZGvsvDGClvsSRScpGBhPphWMPhhTNh
|
||||||
|
SBSBdBZCcdwHrVQwQr
|
||||||
|
qmFqdVtqsVdzqGbwMJwGPpmPHM
|
||||||
|
ZjTjLQLLDrrLjcFhlfrGHppfbJwGpMMpGHwRCC
|
||||||
|
BTlZjrBBBcLTcDrjBlThWBjBtWNqnSzSnsSdvsFggNnqVVnv
|
||||||
|
zVvmjGgpcJnbTTTJHRHSRb
|
||||||
|
NPFrFQfCLPrdRlbtQRRvBtHb
|
||||||
|
frMLqPFMrfrPLCwqqNvjczwwnmwggGmssnmnnm
|
||||||
|
HbFJhhshsffcvslmGmLFrQBrlFTG
|
||||||
|
jNRPwwPjSPCdCdvRzRBTlRzmGrmB
|
||||||
|
nCSWdNjCCPqvtttZnDscth
|
||||||
|
ScSrRTPcSSDRWSptWcdmmWGbmGGLmLJvNJNbbJ
|
||||||
|
flzHjFpZjFfjjgszjlqzJNnnvsmbMmGvJLNNbmJv
|
||||||
|
jFZFVpffpVlqfQhgtTwcTVtrTcRBwBTD
|
||||||
|
rHrdGSMSSbZbjShj
|
||||||
|
qZfDBBvllvvWLtqbbQwhJjbtwbnQgN
|
||||||
|
WzWlzZmLWBLZLzCzrHMVcRrMRFRCCccF
|
||||||
|
BzdplppDlBBrqWnjFMBWqNWq
|
||||||
|
whZhZSSHhhVSrvSgHPvgvjnFTPsFFnnNTcjTFnTTsc
|
||||||
|
HLCwVSfZLffSHhLvwtQbJbrdGlRRrGdmpztG
|
||||||
|
grDFfDlfCftCzCfNztclNFrBNQjbZjJjjPPVsjNvsbvPsj
|
||||||
|
HwwTpGpRwMdpHWhvjzVsPJjJGVvVZs
|
||||||
|
ShphRpwzMWdpHdwWHwMpnHwLDmmgcLCCDtLDCCSlcgcfCD
|
||||||
|
ccqqLLqCqTSlZMLQMllZTvnNfjddttmmDpRJjvhfpfthRmdf
|
||||||
|
rbVssWwggFrGsWzPbVFGJpftQRPDmQDpdPmdJmfR
|
||||||
|
bBHWWHzWHWWHrsVbsFgwbFqqMLTnBclTMMSnLnqLqMQZ
|
||||||
|
CcSPGCCPrdPtdjcsBLDghbVLhqDl
|
||||||
|
vMJwTHzPvzVwqBBDblls
|
||||||
|
QNvMFfRMJHPZHjnfWmdftSjSnp
|
||||||
|
dnBCPhhBCrQfChdbNVGLszzDzVDsTbWT
|
||||||
|
HgcJgpppPqqHwPwJSczVzDssNNVWTtqVVGts
|
||||||
|
JHRFpjFccplcRwPJpHPScpMPQmCdBQQfQjjhCfBCrQQvdmnn
|
||||||
|
rQGmVRLRbDRHmmZLGBGVLHBVFspSstWWWNJcsgpQTSsNppJS
|
||||||
|
qlldhPdfCgnspJFWCFsFNT
|
||||||
|
jMMzwndfhnwPfqPMjgjMVBrGBmrHDHLZbjRGHbHj
|
||||||
|
wzpZfzHRSRfzgHfffZwwStCtSrBhBBCTrtFhhBFG
|
||||||
|
QPjQQQDcDWJNFWtrtWrGmTCMtmBW
|
||||||
|
lDvvDQcdjQcQLvlDwnpFgbbznZZglZsl
|
||||||
|
RfMFTMFrVrSRFPlFSfVlHpLqgzpHBLzHBBVzVpHG
|
||||||
|
CchbhcwdmdJmwJJtGgnqzppLmGGBQqQp
|
||||||
|
hCsstCJwLvMRvsZsTR
|
||||||
|
fQlfMlNClQhhZhrlWrWw
|
||||||
|
njDbnTDTBtGjmrGvSh
|
||||||
|
bgshBdBcDbTTdnnnTqcqLgqfpfQppCsCMsHHVVpHHNCHFF
|
||||||
|
PbCnTbzJnqQNzbbTNDdpwcmjDmwjGQjccw
|
||||||
|
hWgvSdLvwcGjSpSm
|
||||||
|
vVfrFvvhHFTZndJq
|
||||||
|
FFvRVCRqVRcfsDLrgqGNWjjHfhQQzGWjQHzN
|
||||||
|
ppJPBwplwSBJTmPpTzWWStzHHjNNLNzHNh
|
||||||
|
wnwMPbLJMJllJJwBmJmnLVvCvsCsbFgDrRrsCsvrqc
|
||||||
|
jqHgVgdgGQttWCtNqNflmllgFnfDnmFFlpcl
|
||||||
|
TZZsrrwwhwrsrZRGmhcfSnhGlmSFcf
|
||||||
|
rsLvvbJPPLBGPCQqHWtMCMHN
|
||||||
|
WzzBpCBpMsBpCvCfsgnPPfHgbfFNfF
|
||||||
|
jtdTLLjGTGjDjLbbbGlDLLLmfFgmmfgrPrgmNPHSnnNnqFSq
|
||||||
|
jbRRbjlwlRVpvWwvzBpB
|
||||||
|
qpwzCzCznFznTcCvrcrvVcLb
|
||||||
|
cPmNMHSlMsLfvWgsrWvL
|
||||||
|
mMHGPDMBGSGPHlPBcBPzznnzpdQFBjqRFdwdnn
|
||||||
|
QGZLJzmJrZgZzZhNQFqDWlWPWDFCWNRlPW
|
||||||
|
hMMbhVbhHWCsPWCMRs
|
||||||
|
BwjbSHVBVvfcTfZgZzQhrzdGrt
|
||||||
|
cvPTjfDPpDmmBjbQjZMdlBZj
|
||||||
|
CHNnghNChVzNgrFVwCMJLMMMMMQQdbLZ
|
||||||
|
FNSzShrHhNnWgVnWfvfbpfpDGTfvsG
|
||||||
|
FFpVrZhpTlSQlQzTtRtZHfmPmJDbRtZJ
|
||||||
|
jNnwBLnWwBgNBNCwsNgsMsCLVfDWfmDJRffmRRtmfRmPDRtR
|
||||||
|
BnLdNdjnBNcLngdCVBndgllFlQrrpQlSSFrQphFcQq
|
||||||
|
JmVLJPMNjmVJpMLJSVmNQZZQZZrnTHqZQHTrTTMr
|
||||||
|
ltfdwChhwRdRswDDdnBQqqWNTqrrHrqZRr
|
||||||
|
dwdwwDwsGlhhDFtsCwhsJLcPmGPcGzSjSjjLzNPS
|
||||||
|
QgSbgQCLQSJFMccLFLVVzH
|
||||||
|
WBNffrBpBNdNRdWDfptBtdzWcMZZVPMVwHMmsVHFccHsDsVc
|
||||||
|
ptphRWrfGRGRnqlCSQvhqbCzJS
|
||||||
|
VvdMLMLMBMlVlVschsNpDGpdNsGc
|
||||||
|
tqFSmnmnnttGfDqNcfvNDD
|
||||||
|
nzRHnrwrrWRrrzHtbMlTMBjCvWLgBBMl
|
||||||
|
pCBlRvzwzlCzvZqqDwzmvgtsLsQdgZsgPNtdrsWrst
|
||||||
|
JbGjbGVGHSFbhbnhTShSTbQtQrPsLsHLQgNRtsgdQsLP
|
||||||
|
GnnbJbGMGbSjjbSbCzqlwMRRDzqzMBBv
|
||||||
|
TTVRJVMWMshSQtjSVTQJRQlcCBncJccdppnJcBBDngFpgP
|
||||||
|
frvfzfHrwzZNrtNwzzzZncCCZFdFFCgBDpPcBcBg
|
||||||
|
LwNGbqwvmvvtbNQjQlVVRWTGTQWM
|
||||||
|
RnggwVLRLDfCVZhfpDGGMGMGcGzGNHvv
|
||||||
|
jmmWBTSsBmFmSzctsqpccHvzpN
|
||||||
|
SBSrTblSQPbQhNwwZfPVdZPf
|
||||||
|
CCvCwzfNStLzfrbmMJbZMtlsbJMW
|
||||||
|
gPPPBqDjBcPFpVgBRbnMsVsbJZnWsdbSbM
|
||||||
|
qgDPHjHcPhpDRRpPBRpCGSLwvHQwGfzrHLGLTL
|
||||||
|
CLGqDZZLTdddPsdJpq
|
||||||
|
gbRbbnghnrWvgrdJdSTRSsVNJlld
|
||||||
|
hMnwrjnnjggvnLDwGffTfwCZZZ
|
||||||
|
NzJHbNHNNzJzgmHmzpQSvvLqbLsVVsVGvB
|
||||||
|
WtWhtWDdrZldDWrWTlZgppVVsqQTVQBqsGqBsQVp
|
||||||
|
jWjWRRRlPcHRwJgw
|
||||||
|
CCnnFTmnPCMCRNfnwGwdfzvwwl
|
||||||
|
VQQVShDSSshhDDtDLhjccGjLBBzBzlZflNZvwZzdwBzpSNNZ
|
||||||
|
QLHhJDDhDhgscgtjbGHTrWbrTbRmbFrm
|
||||||
|
CJbLvJvbwtFHqvLzwJqqqtHWTWRgDScDRSWQQjTRcWRDLT
|
||||||
|
mssGsMNphZMNsPPBnhSjRgdnQRdWgdjgrcDn
|
||||||
|
GGmBMMsffmslMGshZlMphGqCzHCbzlbvzqwzzgFJggCF
|
||||||
|
WCgWBphpWLQZQpgdhGdwmfbfFRVRjRTbbSFttdbSbT
|
||||||
|
qqrZnDNqZJDTVzRjVFbfSN
|
||||||
|
rPMvqJJqrJMPJnZMZZgLPgLWLggWQghwhmBh
|
||||||
|
CWGGzdHHmPPSmPsC
|
||||||
|
LqwlZwRLrPMQlMqrlbZrQRsSNsmssSNSsNcBNpgmsJ
|
||||||
|
lwLDQhrDMQqPGfhzGGjhGn
|
||||||
|
ZqDlZssCqJJMvpdBpBBmBQSMRp
|
||||||
|
wLgVcbgFLzTLTNNZmNNRdjdRmF
|
||||||
|
HZHbctWTwgVWgsfrnnPqlnsWlD
|
||||||
|
RSnwSPFcLnFPnRwjzctzbGNlZgNbbGdGpLhZdpgM
|
||||||
|
BqqBfMvTmmJqDgGNVdGVbVJJZG
|
||||||
|
vsTDfqBmHmMWQCwjtrHjjSFFnRSn
|
||||||
|
LsCmmcDHRjdtNMstwwzJ
|
||||||
|
TvThqfBFBNTnnndTtL
|
||||||
|
lvGQfbFQGblFrRccLRSSlPPVHS
|
||||||
|
qbLpqTHSqpbqbrPcQgjPDjcdDL
|
||||||
|
gnzhhBBwBWZzMglmjDrDPjvfdvQPdwtd
|
||||||
|
WZZzZZlZmhsMmFgRBBBzHHJpNJGVRSJVGTVpNqCH
|
||||||
|
JDphhGhDdGzWRBnvqqLDNLMnLw
|
||||||
|
gsrTHHffTHPcrPrlHCNZhvBZnZNLhPvBNwvh
|
||||||
|
sHVCSsSghJpSJjQh
|
||||||
|
JTMGlfjlTdqjnqbnqFwqmnbQ
|
||||||
|
PBZhBBcWRZprPZcZDDCZTZRgnnzwbbsbnvhbvznFsNFFvvNQ
|
||||||
|
BcWrVgCCZTDRDrlGttfVtMddSJlH
|
||||||
|
vwwvpVbSvnSRRmfMCmTHVHTBHB
|
||||||
|
QLZgDPgSDgGTMZfmTTBZ
|
||||||
|
QDDsQFDlzlgtJlLdFDgSJQFvvpRvjqzjRwwwzWvhvWwqjj
|
||||||
|
mRRTGGNNflGRGGmmgRblsGwCZwVZlZjVwjztpjZhpBCB
|
||||||
|
PMLLFLHPLPnLqDDLvFDrzzMjhwVCjtphBzjMhV
|
||||||
|
FDdSPSpLcDsNRRWSTNWN
|
||||||
|
STldJthdJbtTqljCRDDHmqmj
|
||||||
|
VVvNwwvNFssJFJPNNwVvRMCgCgDqjjjqrDqqMHqP
|
||||||
|
QBZwQfZwfVhtcSBtBJnT
|
||||||
|
TzjjPzsQTslNlNzPRVGJJJGGtTJmgJHtmTZC
|
||||||
|
dBDWScMBhhPGgdwwJPfw
|
||||||
|
SqSqbSPDBhqnMqvrrSWVNFpRVRLzVQslvpNjVL
|
||||||
|
bWFgFCPFtgvDZWgtChDNFJHvGVzHHpjzHnnzGzzHRR
|
||||||
|
qcScQbbmqdQmlQmrlcQwLmHlRRjzGHnHJnnGVjHzBHzG
|
||||||
|
TqQwmLmfcddfwrfCgbWCNPsZNfCb
|
||||||
|
pddprrtrCPdvJdMjwwwHnLwwjLWCLg
|
||||||
|
qhzZTmZcmRhmpFlVHcQQVwWQHVQwnH
|
||||||
|
lGmhfRfmBZRlmmbvDPBMvNbvJJpP
|
||||||
|
NsptgfGLLNwnNQSZbCvZnRnMCb
|
||||||
|
JldhdzwzBMCSZvrz
|
||||||
|
JFcdWTdwhPTFVDVmTJNqmstLqgLtLtjGGpsG
|
||||||
|
dVVTSgTDpHVDjgdWpdpHTZSbWGrnnvrNwzFGNrFwnNNwvh
|
||||||
|
CPRlMPJcMQcBcsmmLCMPrzbFfhwfrvLrNNwwGwfF
|
||||||
|
CRJmtbmJlQbsQlRBpZDVjTHTdjDtSjZt
|
||||||
|
rQVJrRFdrwDfzHQHQBTnpWTW
|
||||||
|
PCLbPcPCsgqCgPgLjScSqNbHTzMtWmWtzlTHmBtTlMssMT
|
||||||
|
cCqghSSPcvgScPbwFGdDDVZFfDhZGB
|
||||||
|
zrRQRdqzPHQtnMPrtzPMRRQMVBBblJJBSClBpJbpdCCbBlCC
|
||||||
|
hTcGwzswGwGmGfDvvfGmGNfBpllVSWbWppNCBNBVpCBClW
|
||||||
|
gvGFTmTgwDhTDccsTfzfmfGGQPgPPqrgRZPHnRqRZrQLnRgP
|
||||||
|
hvmmJllPbmCRMNGMMlNwNl
|
||||||
|
PFTpTVjTgpTpBRgMGMnRNHBB
|
||||||
|
WWrqzTTPVQDPqpjTqPJbmLtcfsQsftbLbvct
|
||||||
|
SzrmpjjcsjTZNzgnnNzN
|
||||||
|
BLHNDwBLBPLwLBhwDVLgdQCgCQGTngHQZCngZd
|
||||||
|
PPJBDvBVVBmppNjJjrrr
|
||||||
|
ZHBNQFhsqHBsgCfqtctcPvSwPqrV
|
||||||
|
LlnGTnJpJJTmdDpmLlmLndWfVrPvvRwDfcwwwRVwcfQtvP
|
||||||
|
GnbQblWmWGdTJQdTGnZHsHhZhFNsbCsjFgjC
|
||||||
|
hWfDzDTVndDMhddMlBWMBDfJRnRtvvSSQjCvZCtjtpJvSR
|
||||||
|
bGHsccFcbscsqGPHNGcrpjJZtvSRtFtQCZrjSj
|
||||||
|
GsbwGGwNNGLgPLwMzBzfMMVMTLdTCC
|
||||||
|
GBcNzTSSmGzmTLNgvwgpNCDqpDggpw
|
||||||
|
JRZMrJWFZZnZtJgvvjwbpbCJDd
|
||||||
|
rFMPRhZtZFnWrRtQGmPPDcLfmGLTfz
|
||||||
|
VdWnVdjhhdFjVWbndMlNLQspVMHCNVlClV
|
||||||
|
RSrJBRRJwJSBQpMBHLLDCL
|
||||||
|
TqwtRRRJzJTSqJSzSrtmqgWWhcncvPgnWbPQnbnWmb
|
||||||
|
VnDFpPpFssVSpFDVHbRbscCvgbMTvTCR
|
||||||
|
JfzqdQBfhBdddfBBGDLdGQvbrqMMcCRRMTgbqgMrbbqc
|
||||||
|
QDfzJNWBJLQBhmdGDzDGhQGGlFZwPtWjtFFppllSVpZZFnjj
|
||||||
|
qrLLNpJbJnRLNnpvQtRVhhRFCdlFFlFd
|
||||||
|
mmjzjvGjwPwmTsSTSQjDVlVWQjlCDthCCC
|
||||||
|
cSSmcTTPcSswScfSHmTSTzJqqNrnpBpqBbJLvZMrqfrL
|
||||||
|
NSvRZRfFvfHSZQcNJBLbzDLnrDFnhtFLFnrh
|
||||||
|
wmTGpmGCwsMplMsHllPlMnDLjznrgrzDjgnntznr
|
||||||
|
dsCVGGGwmpTGPplmCmPppVmHSSRJNfJvBNZQfWdBRJZRBZcR
|
||||||
|
TwQwqDPQtwNwzNDTZcnZbJvMnMMbFqZM
|
||||||
|
SzGSjrjLWrjHHspWVhvVVnFJbccVZcRJbllb
|
||||||
|
pHppszGSprhhWHLCLrsjdTtDDPfwdfwtdNfDgNCN
|
||||||
|
ftcvBtBFtmBlmvPFmmcczCChrgSCzzCSnCSSnGHf
|
||||||
|
sJddbdTDbDHdnJRggrGzGzrG
|
||||||
|
dppDVDZMMMsTTVsDTsTDpwVctNcvBZQPcPctqtQcHmvlvQ
|
||||||
|
jzbdzztbDqNqwvLvRmQZjvRH
|
||||||
|
FSJbFFWgJnZFLRZmHmRQ
|
||||||
|
TgVJTVSJGJcJlllgTMdqpdNsrztNNsNbMDDp
|
||||||
|
CCCVWbwVnlRbTcqSShqGhhGcnF
|
||||||
|
PgDBfDpMNlfgpPfNZZtcJgcqqhmmjqSmjFmhmS
|
||||||
|
tpfpsPrlpsPDDMDfBZrwLrVWLLLWRCdHLTwbVR
|
||||||
|
pjvfDGjSMpvDmDpDpSDnJmfqbPVsCMFsPqFVPqCrwrbMFV
|
||||||
|
NQlHtHNhZHgZZNBHhQgzPmCwbqqVFlsrPFrFCP
|
||||||
|
hgHtQdQchcHctHgcgNgBQdWNpmvTWvpGmLJDLGjTpLGnnjfv
|
||||||
|
QhgLLLmtlRqDtRGP
|
||||||
|
HLbnCZFWVHLZnFCJJRFrGJzDGDGJDD
|
||||||
|
WZHfndfMfCZbMnTVTfZhSNQQpdwSdLwhNcmdSN
|
||||||
|
sPwrPMgLFPFFsLZtmcclSSZDtcZs
|
||||||
|
qVzqdNdCnnNVVNCGmbncDBlmBlBBnRlZ
|
||||||
|
VTdCGVvVfffrjpfMQPwm
|
||||||
|
BPDldDTDPZcggjcccTdNMbbMNSQNqqjtzMbrRb
|
||||||
|
LvmWsfvssLGnQbQMRQqrSRnz
|
||||||
|
WpvsVmmpmmfpfJGrHfVCHVvmcDgpDlZphgFgdhclhdgdBlgF
|
||||||
|
VGwHbNzMMrzHbbHChhqgCqPNghgCqW
|
||||||
|
ZJVBvBvZWqvRvggP
|
||||||
|
JBJlBlBZcsBfcJVrHnLwQQGzLQMc
|
||||||
|
gBWfBPPPfhvVWFfSVfVdjjbvTvwwQppHcHcctTcQTHcZ
|
||||||
|
DnNnMJMqMJzqchbZtTQQrb
|
||||||
|
llRmNLDLDGlCsWSFCffWdshd
|
||||||
|
LpNMZZpqqpfTTwNqLZwGsZqZbdHRHbHGddnCBHRcmzGmmCdG
|
||||||
|
JFRtRlVStjPlhtjbBzBncmVWdzWBnb
|
||||||
|
rPhhSlrvQlFFFPgtJlJtFlhlDNTwRMfZTZfDZNrspZLMMsrq
|
||||||
|
zBLjLFBjLjmHWlzNZlzVCC
|
||||||
|
dcJrdfddbllJbdMTwDNMZWNVwVDwHT
|
||||||
|
gRcgJbcbqfgbftdjlqLhFFLPPhGBjm
|
||||||
|
WfBgBRzQGNNQqmmqZN
|
||||||
|
nFjCjCpLbtpPJtCDDnCDJpzncrSVbmdVqbhhdqNbSSmrdVSq
|
||||||
|
CLPJpDLlLlFDpFjjsGRsBGRfWwsHHglz
|
||||||
|
lSlSlpCRSsWTRLTlWRvlmMrBPjBPjpqrrmqPJMPZ
|
||||||
|
DDzbhVhQhDGzhQnGGfnHHQGBPZjMqJjBJMBVJmqMdrqqdT
|
||||||
|
NNGQbFwnHzNzwbQwFnwbfsLCLtsvLsWggFslsTggSc
|
||||||
|
nvzPvCnlvtwCrZWmWwvvZCQfbbfQfGbqSJJGmqGSFSbJ
|
||||||
|
LhTBWdsMNNRgNcgDWsDNcVSfQqJGFSFJqSSddQGSJF
|
||||||
|
HNgchHcWDRNhTNMWwtPrtZZjnHzrnvCz
|
||||||
|
djhnzRghMMVCBfhh
|
||||||
|
qjQTrTPQJCDDqBDJ
|
||||||
|
LQvGrLjTHLjNNPPTpQgtztSmmbFgmgLbFnmL
|
||||||
|
FRDNFBBRRVFFmbLZHPZBZvvH
|
||||||
|
QnhgMllglJTdGgJnhLQQJpZpvwZHpwsPTwpbsZHmsH
|
||||||
|
lnhnQGrMgthMlntlGfQhgWWcRSDcVCrLWzRSrRFDRN
|
||||||
|
PqrrrRnPBbrVhVqFrFVRPVhZLvNSNvLZcQvtJfRvNScJNJ
|
||||||
|
dDzWwwCTmmdwdddpDLWQZMSSMfSJtcWJfQSQZN
|
||||||
|
CCwmTdjsClVjFjnLBl
|
||||||
|
srjCvjPmQVlPjFPmQmPrdHHZhvHZDqHhDDwHHqfB
|
||||||
|
pLcnJQNQMZpqZDDZ
|
||||||
|
WNRbtNJgRPjjQVmz
|
||||||
|
NJJRmjmJbbJfqSVMNHFCSFzLLlrLLrFHTz
|
||||||
|
QvnsQGvBwWwQvgRHlGGDFPFCGlrR
|
||||||
|
QhvwBvBctBccZWZNRNmVfjpmjJjb
|
||||||
|
RMmGGMLRRCFmRPPfGFpGPFPJWZQWctrtlQvZvltfrQWcWWBq
|
||||||
|
gggwjjbjwwbZtwZBBcmQQv
|
||||||
|
SdNbDDVSgPMFmPzdMm
|
||||||
|
nZhnNZDnZPmZPWbppPpMlvRlzvrtMmRtqRzRfq
|
||||||
|
HcFwsCQLVQwFwLtLbvtzrlrLtt
|
||||||
|
GsgCFCgCQHHCVHsFQHcFdDPDbJDZTpZDbWJPNWWZDd
|
||||||
|
BBrBrGlGpgGjsNhlBlpBwpfSwZJdQwfcZwvSQnnn
|
||||||
|
LvWvHLmmVJQQHfQH
|
||||||
|
RPLRMvqFTbRTjGBhjNFsslls
|
||||||
|
cNZZZmZDcDDJmhzzrrlHtSbvgjSvgfPSWvPfjShv
|
||||||
|
VBwnndnVCqbqpRRpnspnqRWtGgWSSgvFBSGGSWgtGGSP
|
||||||
|
LqCMnTLVRwCRCpRLpbHDNzMMNcmmHNHQJQ
|
||||||
|
MMqDtnVnBlHtZvtB
|
||||||
|
WLWrWgdWwdrLCTFCwLlbbsJsJQsbQlQzlvrB
|
||||||
|
jFSvTdjfnfRmVcRR
|
||||||
|
ZLGqnvnqLzvbGRMfcRpwMpdV
|
||||||
|
fgfNNfgHHjVmRcVdgM
|
||||||
|
HsWDCDfCQCZBBZnvWtLq
|
||||||
|
bTZjqflqZhcrlczGzppGNgjmFNnp
|
||||||
|
PmmRSWWDMBQVNpWFznGF
|
||||||
|
SStRBDSCCSSSwPBwBDBwPmZhZlfZhqHTsTfltHHZfsHH
|
||||||
|
GbNbsSptQGqsdJCzsddcgzzv
|
||||||
|
DHRRnmWWmZnmRhllnHnnnMLvvLgcTVvjVhCTvgzcJgLj
|
||||||
|
RnWMlDZRlnHlmHWBFwGQqNGGPNQzPGqFwz
|
||||||
|
vSGvHpJnBLbGHBNCgfDzzChDgbCfzT
|
||||||
|
wFRslqmqTRgggQghPmQf
|
||||||
|
qjRFMjWqNNMMGHTL
|
||||||
|
fWGcQGGSRFQZhttZJfSSJflDDrwdClljVrNDdrdCFBCr
|
||||||
|
MTgvLLPPnHzMbDwdlNbMBwMM
|
||||||
|
mnTvnnPTcNmmJJWN
|
||||||
|
qqbbQQnbWrqGgnWqvZpVzMCZjCgfjZCSVM
|
||||||
|
ldcmDPDhmlFBHPDddLBVFDHLppZpjSCjjNfwNMwCpSMwhCMp
|
||||||
|
FtDdsHPcHmdHVPLtHsdtBHQnsbvnTRRTRsRRqbqvqWnJ
|
||||||
|
hhtBtPrgbbhhgjZjjCCHHNpNDHpffHWCvr
|
||||||
|
LGFLVwswsJMSgFwMMpddSvpHCCdDdvCpvm
|
||||||
|
sGsFsQLsVsLFnnFTJQthjcjQqhRcBZZtRg
|
||||||
59
2022/go/day04/day04.go
Normal file
59
2022/go/day04/day04.go
Normal file
@@ -0,0 +1,59 @@
|
|||||||
|
package day04
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
"strconv"
|
||||||
|
// "fmt"
|
||||||
|
|
||||||
|
mapset "github.com/deckarep/golang-set/v2"
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
var count int = 0
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
for _, line := range lines {
|
||||||
|
pairs := strings.Split(line, ",")
|
||||||
|
|
||||||
|
pair1 := strings.Split(pairs[0], "-")
|
||||||
|
pair2 := strings.Split(pairs[1], "-")
|
||||||
|
|
||||||
|
p1set := mapset.NewSet[int](Range(pair1[0], pair1[1])...)
|
||||||
|
p2set := mapset.NewSet[int](Range(pair2[0], pair2[1])...)
|
||||||
|
|
||||||
|
if p1set.IsSubset(p2set) || p2set.IsSubset(p1set) {
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
var count int = 0
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
for _, line := range lines {
|
||||||
|
pairs := strings.Split(line, ",")
|
||||||
|
|
||||||
|
pair1 := strings.Split(pairs[0], "-")
|
||||||
|
pair2 := strings.Split(pairs[1], "-")
|
||||||
|
|
||||||
|
p1set := mapset.NewSet[int](Range(pair1[0], pair1[1])...)
|
||||||
|
p2set := mapset.NewSet[int](Range(pair2[0], pair2[1])...)
|
||||||
|
|
||||||
|
if len(p1set.Intersect(p2set).ToSlice()) > 0 {
|
||||||
|
count++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return count
|
||||||
|
}
|
||||||
|
|
||||||
|
func Range(start string, end string)[]int {
|
||||||
|
s, _ := strconv.Atoi(start)
|
||||||
|
e, _ := strconv.Atoi(end)
|
||||||
|
|
||||||
|
var r []int
|
||||||
|
for i := s; i <= e; i++ {
|
||||||
|
r = append(r, i)
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
||||||
29
2022/go/day04/day04_test.go
Normal file
29
2022/go/day04/day04_test.go
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
package day04
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(
|
||||||
|
`2-4,6-8
|
||||||
|
2-3,4-5
|
||||||
|
5-7,7-9
|
||||||
|
2-8,3-7
|
||||||
|
6-6,4-6
|
||||||
|
2-6,4-8`)
|
||||||
|
require.Equal(t, 2, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(
|
||||||
|
`2-4,6-8
|
||||||
|
2-3,4-5
|
||||||
|
5-7,7-9
|
||||||
|
2-8,3-7
|
||||||
|
6-6,4-6
|
||||||
|
2-6,4-8`)
|
||||||
|
require.Equal(t, 4, r)
|
||||||
|
}
|
||||||
1000
2022/go/day04/input.txt
Normal file
1000
2022/go/day04/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
93
2022/go/day05/day05.go
Normal file
93
2022/go/day05/day05.go
Normal file
@@ -0,0 +1,93 @@
|
|||||||
|
package day05
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/philhanna/stack"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Part1(input string) (result string) {
|
||||||
|
|
||||||
|
result = ""
|
||||||
|
var stacks [9]stack.Stack[string]
|
||||||
|
var lineNo int
|
||||||
|
|
||||||
|
for i := 0; i < 9; i++ {
|
||||||
|
stacks[i] = stack.NewStack[string]()
|
||||||
|
}
|
||||||
|
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
for n, line := range lines {
|
||||||
|
if line == " 1 2 3 4 5 6 7 8 9 " {
|
||||||
|
lineNo = n + 2
|
||||||
|
break
|
||||||
|
}
|
||||||
|
for i, r := range line {
|
||||||
|
if r != ' ' && r != '[' && r != ']' {
|
||||||
|
stacks[i/4].Push(string(r))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for i := 0; i < 9; i++ {
|
||||||
|
stacks[i].Reverse()
|
||||||
|
}
|
||||||
|
var quantity, from, to int
|
||||||
|
for _, line := range lines[lineNo:] {
|
||||||
|
fmt.Sscanf(line, "move %d from %d to %d", &quantity, &from, &to)
|
||||||
|
for i := 0; i < quantity; i++ {
|
||||||
|
value, _ := (stacks[from-1]).Pop()
|
||||||
|
stacks[to-1].Push(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for i := 0; i < 9; i++ {
|
||||||
|
item, _ := stacks[i].Peek()
|
||||||
|
result = result + item
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) (result string) {
|
||||||
|
|
||||||
|
result = ""
|
||||||
|
var stacks [9]stack.Stack[string]
|
||||||
|
tmp := stack.NewStack[string]()
|
||||||
|
var lineNo int
|
||||||
|
|
||||||
|
for i := 0; i < 9; i++ {
|
||||||
|
stacks[i] = stack.NewStack[string]()
|
||||||
|
}
|
||||||
|
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
for n, line := range lines {
|
||||||
|
if line == " 1 2 3 4 5 6 7 8 9 " {
|
||||||
|
lineNo = n + 2
|
||||||
|
break
|
||||||
|
}
|
||||||
|
for i, r := range line {
|
||||||
|
if r != ' ' && r != '[' && r != ']' {
|
||||||
|
stacks[i/4].Push(string(r))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for i := 0; i < 9; i++ {
|
||||||
|
stacks[i].Reverse()
|
||||||
|
}
|
||||||
|
var quantity, from, to int
|
||||||
|
for _, line := range lines[lineNo:] {
|
||||||
|
fmt.Sscanf(line, "move %d from %d to %d", &quantity, &from, &to)
|
||||||
|
for i := 0; i < quantity; i++ {
|
||||||
|
value, _ := (stacks[from-1]).Pop()
|
||||||
|
tmp.Push(value)
|
||||||
|
}
|
||||||
|
for i := 0; i < quantity; i++ {
|
||||||
|
value, _ := tmp.Pop()
|
||||||
|
stacks[to-1].Push(value)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
for i := 0; i < 9; i++ {
|
||||||
|
item, _ := stacks[i].Peek()
|
||||||
|
result = result + item
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
17
2022/go/day05/day05_test.go
Normal file
17
2022/go/day05/day05_test.go
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package day05
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1("")
|
||||||
|
require.Equal(t, 0, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2("")
|
||||||
|
require.Equal(t, 0, r)
|
||||||
|
}
|
||||||
514
2022/go/day05/input.txt
Normal file
514
2022/go/day05/input.txt
Normal file
@@ -0,0 +1,514 @@
|
|||||||
|
[G] [D] [Q]
|
||||||
|
[P] [T] [L] [M] [Z]
|
||||||
|
[Z] [Z] [C] [Z] [G] [W]
|
||||||
|
[M] [B] [F] [P] [C] [H] [N]
|
||||||
|
[T] [S] [R] [H] [W] [R] [L] [W]
|
||||||
|
[R] [T] [Q] [Z] [R] [S] [Z] [F] [P]
|
||||||
|
[C] [N] [H] [R] [N] [H] [D] [J] [Q]
|
||||||
|
[N] [D] [M] [G] [Z] [F] [W] [S] [S]
|
||||||
|
1 2 3 4 5 6 7 8 9
|
||||||
|
|
||||||
|
move 7 from 6 to 8
|
||||||
|
move 5 from 2 to 6
|
||||||
|
move 2 from 4 to 1
|
||||||
|
move 1 from 4 to 5
|
||||||
|
move 5 from 7 to 6
|
||||||
|
move 7 from 6 to 3
|
||||||
|
move 5 from 9 to 2
|
||||||
|
move 6 from 2 to 3
|
||||||
|
move 2 from 7 to 9
|
||||||
|
move 20 from 3 to 1
|
||||||
|
move 11 from 1 to 6
|
||||||
|
move 1 from 9 to 8
|
||||||
|
move 3 from 8 to 2
|
||||||
|
move 8 from 1 to 5
|
||||||
|
move 10 from 8 to 4
|
||||||
|
move 7 from 6 to 4
|
||||||
|
move 1 from 8 to 3
|
||||||
|
move 8 from 1 to 7
|
||||||
|
move 16 from 4 to 8
|
||||||
|
move 1 from 9 to 8
|
||||||
|
move 1 from 5 to 2
|
||||||
|
move 4 from 7 to 4
|
||||||
|
move 5 from 6 to 7
|
||||||
|
move 1 from 6 to 1
|
||||||
|
move 8 from 7 to 4
|
||||||
|
move 1 from 6 to 9
|
||||||
|
move 12 from 4 to 5
|
||||||
|
move 3 from 2 to 5
|
||||||
|
move 1 from 6 to 2
|
||||||
|
move 1 from 3 to 7
|
||||||
|
move 1 from 3 to 2
|
||||||
|
move 1 from 9 to 3
|
||||||
|
move 1 from 7 to 8
|
||||||
|
move 1 from 7 to 5
|
||||||
|
move 1 from 3 to 2
|
||||||
|
move 4 from 5 to 7
|
||||||
|
move 5 from 5 to 7
|
||||||
|
move 1 from 4 to 3
|
||||||
|
move 1 from 3 to 9
|
||||||
|
move 3 from 1 to 8
|
||||||
|
move 1 from 9 to 1
|
||||||
|
move 2 from 2 to 1
|
||||||
|
move 2 from 2 to 7
|
||||||
|
move 8 from 8 to 1
|
||||||
|
move 3 from 5 to 2
|
||||||
|
move 8 from 7 to 5
|
||||||
|
move 7 from 1 to 3
|
||||||
|
move 3 from 1 to 7
|
||||||
|
move 1 from 1 to 5
|
||||||
|
move 1 from 3 to 7
|
||||||
|
move 7 from 5 to 8
|
||||||
|
move 2 from 2 to 8
|
||||||
|
move 1 from 3 to 2
|
||||||
|
move 1 from 2 to 4
|
||||||
|
move 1 from 4 to 8
|
||||||
|
move 13 from 8 to 1
|
||||||
|
move 13 from 5 to 9
|
||||||
|
move 2 from 5 to 2
|
||||||
|
move 7 from 9 to 3
|
||||||
|
move 12 from 8 to 3
|
||||||
|
move 4 from 9 to 3
|
||||||
|
move 1 from 3 to 4
|
||||||
|
move 2 from 2 to 3
|
||||||
|
move 1 from 1 to 6
|
||||||
|
move 1 from 2 to 3
|
||||||
|
move 1 from 5 to 9
|
||||||
|
move 7 from 7 to 4
|
||||||
|
move 10 from 1 to 8
|
||||||
|
move 1 from 1 to 4
|
||||||
|
move 1 from 9 to 5
|
||||||
|
move 2 from 5 to 1
|
||||||
|
move 1 from 6 to 5
|
||||||
|
move 3 from 8 to 9
|
||||||
|
move 5 from 4 to 3
|
||||||
|
move 4 from 4 to 1
|
||||||
|
move 7 from 1 to 6
|
||||||
|
move 2 from 5 to 7
|
||||||
|
move 35 from 3 to 4
|
||||||
|
move 4 from 9 to 1
|
||||||
|
move 19 from 4 to 8
|
||||||
|
move 1 from 7 to 6
|
||||||
|
move 1 from 9 to 2
|
||||||
|
move 10 from 4 to 5
|
||||||
|
move 2 from 4 to 7
|
||||||
|
move 3 from 4 to 3
|
||||||
|
move 1 from 2 to 8
|
||||||
|
move 1 from 1 to 9
|
||||||
|
move 3 from 3 to 6
|
||||||
|
move 4 from 8 to 6
|
||||||
|
move 4 from 5 to 2
|
||||||
|
move 2 from 8 to 3
|
||||||
|
move 3 from 5 to 9
|
||||||
|
move 12 from 6 to 1
|
||||||
|
move 8 from 8 to 6
|
||||||
|
move 2 from 9 to 1
|
||||||
|
move 1 from 4 to 1
|
||||||
|
move 1 from 3 to 8
|
||||||
|
move 3 from 7 to 8
|
||||||
|
move 2 from 9 to 7
|
||||||
|
move 1 from 6 to 7
|
||||||
|
move 10 from 6 to 8
|
||||||
|
move 4 from 2 to 5
|
||||||
|
move 1 from 3 to 7
|
||||||
|
move 7 from 5 to 7
|
||||||
|
move 13 from 8 to 1
|
||||||
|
move 29 from 1 to 4
|
||||||
|
move 8 from 7 to 8
|
||||||
|
move 1 from 1 to 3
|
||||||
|
move 3 from 7 to 6
|
||||||
|
move 1 from 1 to 9
|
||||||
|
move 15 from 4 to 1
|
||||||
|
move 1 from 3 to 6
|
||||||
|
move 10 from 1 to 6
|
||||||
|
move 10 from 6 to 7
|
||||||
|
move 1 from 4 to 9
|
||||||
|
move 1 from 9 to 1
|
||||||
|
move 1 from 9 to 7
|
||||||
|
move 6 from 7 to 8
|
||||||
|
move 1 from 1 to 6
|
||||||
|
move 5 from 6 to 5
|
||||||
|
move 21 from 8 to 9
|
||||||
|
move 5 from 1 to 9
|
||||||
|
move 2 from 9 to 5
|
||||||
|
move 3 from 5 to 6
|
||||||
|
move 3 from 7 to 9
|
||||||
|
move 4 from 4 to 6
|
||||||
|
move 6 from 8 to 7
|
||||||
|
move 6 from 6 to 3
|
||||||
|
move 2 from 7 to 9
|
||||||
|
move 1 from 7 to 2
|
||||||
|
move 6 from 3 to 2
|
||||||
|
move 1 from 6 to 4
|
||||||
|
move 4 from 5 to 9
|
||||||
|
move 1 from 4 to 5
|
||||||
|
move 9 from 4 to 6
|
||||||
|
move 7 from 6 to 4
|
||||||
|
move 10 from 9 to 2
|
||||||
|
move 5 from 7 to 5
|
||||||
|
move 10 from 2 to 7
|
||||||
|
move 2 from 5 to 4
|
||||||
|
move 2 from 5 to 9
|
||||||
|
move 4 from 9 to 4
|
||||||
|
move 1 from 8 to 6
|
||||||
|
move 7 from 7 to 2
|
||||||
|
move 1 from 5 to 4
|
||||||
|
move 2 from 7 to 1
|
||||||
|
move 1 from 5 to 7
|
||||||
|
move 3 from 6 to 2
|
||||||
|
move 4 from 4 to 5
|
||||||
|
move 1 from 2 to 7
|
||||||
|
move 10 from 4 to 7
|
||||||
|
move 3 from 7 to 3
|
||||||
|
move 17 from 9 to 4
|
||||||
|
move 1 from 1 to 4
|
||||||
|
move 1 from 1 to 5
|
||||||
|
move 5 from 2 to 7
|
||||||
|
move 1 from 9 to 2
|
||||||
|
move 5 from 4 to 8
|
||||||
|
move 2 from 9 to 7
|
||||||
|
move 4 from 8 to 1
|
||||||
|
move 3 from 4 to 8
|
||||||
|
move 1 from 2 to 5
|
||||||
|
move 1 from 9 to 2
|
||||||
|
move 6 from 4 to 8
|
||||||
|
move 3 from 7 to 5
|
||||||
|
move 1 from 4 to 9
|
||||||
|
move 1 from 9 to 1
|
||||||
|
move 3 from 1 to 9
|
||||||
|
move 4 from 8 to 5
|
||||||
|
move 2 from 9 to 8
|
||||||
|
move 4 from 2 to 5
|
||||||
|
move 8 from 7 to 2
|
||||||
|
move 5 from 8 to 5
|
||||||
|
move 2 from 7 to 8
|
||||||
|
move 1 from 3 to 5
|
||||||
|
move 1 from 1 to 2
|
||||||
|
move 1 from 1 to 6
|
||||||
|
move 2 from 3 to 6
|
||||||
|
move 5 from 2 to 8
|
||||||
|
move 4 from 7 to 1
|
||||||
|
move 7 from 8 to 5
|
||||||
|
move 1 from 1 to 5
|
||||||
|
move 3 from 8 to 3
|
||||||
|
move 1 from 9 to 3
|
||||||
|
move 7 from 2 to 3
|
||||||
|
move 2 from 2 to 8
|
||||||
|
move 2 from 4 to 8
|
||||||
|
move 1 from 8 to 5
|
||||||
|
move 1 from 1 to 4
|
||||||
|
move 2 from 4 to 7
|
||||||
|
move 2 from 7 to 1
|
||||||
|
move 3 from 2 to 3
|
||||||
|
move 3 from 5 to 2
|
||||||
|
move 1 from 8 to 3
|
||||||
|
move 3 from 3 to 2
|
||||||
|
move 5 from 2 to 1
|
||||||
|
move 17 from 5 to 8
|
||||||
|
move 9 from 8 to 1
|
||||||
|
move 11 from 3 to 5
|
||||||
|
move 8 from 8 to 5
|
||||||
|
move 2 from 8 to 5
|
||||||
|
move 16 from 1 to 4
|
||||||
|
move 13 from 4 to 7
|
||||||
|
move 6 from 5 to 2
|
||||||
|
move 2 from 4 to 8
|
||||||
|
move 5 from 7 to 9
|
||||||
|
move 2 from 1 to 2
|
||||||
|
move 7 from 7 to 1
|
||||||
|
move 1 from 1 to 4
|
||||||
|
move 1 from 9 to 8
|
||||||
|
move 7 from 2 to 8
|
||||||
|
move 1 from 4 to 7
|
||||||
|
move 2 from 9 to 4
|
||||||
|
move 1 from 4 to 1
|
||||||
|
move 1 from 3 to 5
|
||||||
|
move 2 from 9 to 8
|
||||||
|
move 11 from 8 to 7
|
||||||
|
move 2 from 6 to 5
|
||||||
|
move 1 from 6 to 9
|
||||||
|
move 1 from 1 to 9
|
||||||
|
move 1 from 9 to 1
|
||||||
|
move 4 from 1 to 4
|
||||||
|
move 2 from 1 to 8
|
||||||
|
move 1 from 1 to 2
|
||||||
|
move 1 from 9 to 5
|
||||||
|
move 2 from 4 to 3
|
||||||
|
move 2 from 2 to 7
|
||||||
|
move 2 from 3 to 9
|
||||||
|
move 1 from 9 to 1
|
||||||
|
move 1 from 9 to 1
|
||||||
|
move 5 from 5 to 1
|
||||||
|
move 19 from 5 to 6
|
||||||
|
move 5 from 1 to 4
|
||||||
|
move 1 from 2 to 9
|
||||||
|
move 1 from 1 to 3
|
||||||
|
move 7 from 5 to 8
|
||||||
|
move 1 from 3 to 6
|
||||||
|
move 8 from 7 to 3
|
||||||
|
move 7 from 4 to 8
|
||||||
|
move 3 from 8 to 5
|
||||||
|
move 1 from 4 to 1
|
||||||
|
move 1 from 9 to 4
|
||||||
|
move 1 from 4 to 9
|
||||||
|
move 1 from 5 to 2
|
||||||
|
move 2 from 5 to 6
|
||||||
|
move 2 from 8 to 2
|
||||||
|
move 7 from 8 to 1
|
||||||
|
move 1 from 1 to 7
|
||||||
|
move 3 from 6 to 9
|
||||||
|
move 2 from 3 to 2
|
||||||
|
move 1 from 2 to 1
|
||||||
|
move 1 from 8 to 7
|
||||||
|
move 2 from 9 to 6
|
||||||
|
move 2 from 9 to 5
|
||||||
|
move 1 from 5 to 6
|
||||||
|
move 1 from 2 to 8
|
||||||
|
move 2 from 1 to 7
|
||||||
|
move 1 from 4 to 3
|
||||||
|
move 3 from 2 to 5
|
||||||
|
move 7 from 1 to 3
|
||||||
|
move 10 from 3 to 4
|
||||||
|
move 3 from 5 to 4
|
||||||
|
move 1 from 3 to 8
|
||||||
|
move 3 from 3 to 2
|
||||||
|
move 1 from 8 to 1
|
||||||
|
move 1 from 1 to 3
|
||||||
|
move 3 from 8 to 3
|
||||||
|
move 5 from 4 to 6
|
||||||
|
move 1 from 2 to 3
|
||||||
|
move 4 from 6 to 4
|
||||||
|
move 1 from 5 to 7
|
||||||
|
move 4 from 3 to 4
|
||||||
|
move 1 from 2 to 8
|
||||||
|
move 12 from 7 to 6
|
||||||
|
move 1 from 8 to 2
|
||||||
|
move 2 from 2 to 7
|
||||||
|
move 1 from 8 to 4
|
||||||
|
move 23 from 6 to 3
|
||||||
|
move 14 from 3 to 6
|
||||||
|
move 15 from 4 to 6
|
||||||
|
move 1 from 8 to 6
|
||||||
|
move 10 from 3 to 7
|
||||||
|
move 2 from 4 to 2
|
||||||
|
move 11 from 7 to 8
|
||||||
|
move 2 from 2 to 6
|
||||||
|
move 44 from 6 to 9
|
||||||
|
move 21 from 9 to 3
|
||||||
|
move 12 from 3 to 6
|
||||||
|
move 1 from 7 to 4
|
||||||
|
move 1 from 4 to 7
|
||||||
|
move 9 from 3 to 2
|
||||||
|
move 2 from 8 to 6
|
||||||
|
move 3 from 2 to 4
|
||||||
|
move 17 from 9 to 1
|
||||||
|
move 3 from 4 to 6
|
||||||
|
move 2 from 2 to 9
|
||||||
|
move 4 from 9 to 2
|
||||||
|
move 10 from 6 to 9
|
||||||
|
move 1 from 7 to 6
|
||||||
|
move 4 from 9 to 5
|
||||||
|
move 4 from 2 to 4
|
||||||
|
move 14 from 1 to 5
|
||||||
|
move 4 from 4 to 3
|
||||||
|
move 3 from 2 to 9
|
||||||
|
move 9 from 9 to 7
|
||||||
|
move 1 from 2 to 5
|
||||||
|
move 9 from 8 to 5
|
||||||
|
move 8 from 7 to 2
|
||||||
|
move 4 from 3 to 8
|
||||||
|
move 5 from 6 to 2
|
||||||
|
move 3 from 1 to 6
|
||||||
|
move 1 from 7 to 1
|
||||||
|
move 4 from 2 to 4
|
||||||
|
move 3 from 6 to 4
|
||||||
|
move 3 from 8 to 3
|
||||||
|
move 13 from 5 to 2
|
||||||
|
move 2 from 3 to 5
|
||||||
|
move 12 from 5 to 9
|
||||||
|
move 1 from 3 to 5
|
||||||
|
move 1 from 5 to 9
|
||||||
|
move 1 from 8 to 3
|
||||||
|
move 4 from 9 to 5
|
||||||
|
move 6 from 4 to 5
|
||||||
|
move 12 from 9 to 7
|
||||||
|
move 1 from 9 to 3
|
||||||
|
move 1 from 3 to 2
|
||||||
|
move 12 from 5 to 6
|
||||||
|
move 12 from 7 to 2
|
||||||
|
move 1 from 3 to 7
|
||||||
|
move 1 from 4 to 8
|
||||||
|
move 33 from 2 to 8
|
||||||
|
move 1 from 7 to 5
|
||||||
|
move 1 from 1 to 2
|
||||||
|
move 4 from 5 to 4
|
||||||
|
move 3 from 2 to 5
|
||||||
|
move 34 from 8 to 6
|
||||||
|
move 1 from 4 to 3
|
||||||
|
move 1 from 5 to 7
|
||||||
|
move 1 from 7 to 5
|
||||||
|
move 3 from 4 to 9
|
||||||
|
move 2 from 9 to 7
|
||||||
|
move 1 from 9 to 4
|
||||||
|
move 1 from 3 to 7
|
||||||
|
move 1 from 5 to 8
|
||||||
|
move 1 from 5 to 1
|
||||||
|
move 1 from 5 to 7
|
||||||
|
move 1 from 4 to 8
|
||||||
|
move 1 from 1 to 4
|
||||||
|
move 1 from 4 to 2
|
||||||
|
move 3 from 7 to 5
|
||||||
|
move 2 from 8 to 5
|
||||||
|
move 1 from 2 to 8
|
||||||
|
move 4 from 6 to 2
|
||||||
|
move 1 from 8 to 6
|
||||||
|
move 1 from 7 to 9
|
||||||
|
move 29 from 6 to 7
|
||||||
|
move 4 from 2 to 3
|
||||||
|
move 2 from 5 to 8
|
||||||
|
move 1 from 9 to 5
|
||||||
|
move 2 from 8 to 1
|
||||||
|
move 23 from 7 to 5
|
||||||
|
move 2 from 6 to 1
|
||||||
|
move 23 from 5 to 6
|
||||||
|
move 1 from 3 to 6
|
||||||
|
move 4 from 5 to 9
|
||||||
|
move 2 from 1 to 3
|
||||||
|
move 5 from 3 to 8
|
||||||
|
move 2 from 6 to 5
|
||||||
|
move 2 from 1 to 4
|
||||||
|
move 1 from 9 to 8
|
||||||
|
move 1 from 9 to 1
|
||||||
|
move 1 from 4 to 6
|
||||||
|
move 2 from 5 to 6
|
||||||
|
move 6 from 7 to 8
|
||||||
|
move 2 from 9 to 2
|
||||||
|
move 18 from 6 to 5
|
||||||
|
move 21 from 6 to 4
|
||||||
|
move 1 from 1 to 6
|
||||||
|
move 2 from 6 to 7
|
||||||
|
move 2 from 7 to 9
|
||||||
|
move 2 from 2 to 8
|
||||||
|
move 7 from 4 to 3
|
||||||
|
move 12 from 5 to 3
|
||||||
|
move 1 from 9 to 5
|
||||||
|
move 1 from 9 to 4
|
||||||
|
move 6 from 5 to 2
|
||||||
|
move 17 from 3 to 4
|
||||||
|
move 3 from 4 to 3
|
||||||
|
move 1 from 2 to 4
|
||||||
|
move 5 from 2 to 8
|
||||||
|
move 1 from 5 to 8
|
||||||
|
move 19 from 8 to 7
|
||||||
|
move 1 from 3 to 6
|
||||||
|
move 1 from 8 to 4
|
||||||
|
move 1 from 6 to 1
|
||||||
|
move 15 from 4 to 6
|
||||||
|
move 1 from 1 to 4
|
||||||
|
move 3 from 3 to 5
|
||||||
|
move 4 from 6 to 7
|
||||||
|
move 1 from 4 to 7
|
||||||
|
move 10 from 6 to 7
|
||||||
|
move 16 from 4 to 5
|
||||||
|
move 24 from 7 to 2
|
||||||
|
move 8 from 7 to 8
|
||||||
|
move 1 from 4 to 2
|
||||||
|
move 6 from 8 to 7
|
||||||
|
move 1 from 8 to 7
|
||||||
|
move 1 from 6 to 9
|
||||||
|
move 14 from 5 to 4
|
||||||
|
move 9 from 7 to 8
|
||||||
|
move 4 from 5 to 1
|
||||||
|
move 2 from 1 to 5
|
||||||
|
move 3 from 8 to 6
|
||||||
|
move 2 from 6 to 9
|
||||||
|
move 2 from 2 to 8
|
||||||
|
move 6 from 2 to 7
|
||||||
|
move 3 from 4 to 6
|
||||||
|
move 1 from 3 to 4
|
||||||
|
move 3 from 5 to 7
|
||||||
|
move 1 from 6 to 9
|
||||||
|
move 5 from 7 to 2
|
||||||
|
move 4 from 9 to 1
|
||||||
|
move 1 from 7 to 9
|
||||||
|
move 9 from 8 to 4
|
||||||
|
move 5 from 1 to 2
|
||||||
|
move 2 from 6 to 1
|
||||||
|
move 6 from 4 to 7
|
||||||
|
move 1 from 7 to 3
|
||||||
|
move 1 from 3 to 9
|
||||||
|
move 1 from 9 to 7
|
||||||
|
move 1 from 6 to 7
|
||||||
|
move 9 from 4 to 5
|
||||||
|
move 7 from 7 to 9
|
||||||
|
move 3 from 7 to 5
|
||||||
|
move 1 from 9 to 2
|
||||||
|
move 6 from 9 to 8
|
||||||
|
move 4 from 4 to 5
|
||||||
|
move 1 from 4 to 2
|
||||||
|
move 1 from 4 to 2
|
||||||
|
move 2 from 1 to 2
|
||||||
|
move 1 from 9 to 8
|
||||||
|
move 10 from 2 to 4
|
||||||
|
move 8 from 2 to 7
|
||||||
|
move 12 from 2 to 9
|
||||||
|
move 6 from 7 to 4
|
||||||
|
move 1 from 1 to 2
|
||||||
|
move 8 from 9 to 8
|
||||||
|
move 7 from 5 to 1
|
||||||
|
move 9 from 4 to 3
|
||||||
|
move 14 from 8 to 4
|
||||||
|
move 1 from 8 to 4
|
||||||
|
move 1 from 1 to 5
|
||||||
|
move 1 from 5 to 2
|
||||||
|
move 3 from 2 to 4
|
||||||
|
move 1 from 7 to 1
|
||||||
|
move 1 from 7 to 3
|
||||||
|
move 2 from 1 to 7
|
||||||
|
move 3 from 5 to 7
|
||||||
|
move 2 from 7 to 6
|
||||||
|
move 1 from 6 to 5
|
||||||
|
move 3 from 7 to 1
|
||||||
|
move 1 from 6 to 8
|
||||||
|
move 1 from 8 to 7
|
||||||
|
move 1 from 3 to 6
|
||||||
|
move 1 from 7 to 1
|
||||||
|
move 4 from 1 to 4
|
||||||
|
move 6 from 3 to 2
|
||||||
|
move 3 from 1 to 2
|
||||||
|
move 3 from 3 to 6
|
||||||
|
move 3 from 2 to 6
|
||||||
|
move 6 from 6 to 5
|
||||||
|
move 1 from 1 to 4
|
||||||
|
move 1 from 9 to 6
|
||||||
|
move 5 from 2 to 1
|
||||||
|
move 3 from 1 to 2
|
||||||
|
move 2 from 9 to 8
|
||||||
|
move 3 from 1 to 5
|
||||||
|
move 1 from 9 to 7
|
||||||
|
move 25 from 4 to 1
|
||||||
|
move 1 from 1 to 7
|
||||||
|
move 2 from 8 to 3
|
||||||
|
move 13 from 1 to 9
|
||||||
|
move 2 from 3 to 5
|
||||||
|
move 8 from 5 to 9
|
||||||
|
move 4 from 2 to 1
|
||||||
|
move 2 from 6 to 7
|
||||||
|
move 10 from 5 to 9
|
||||||
|
move 4 from 7 to 2
|
||||||
|
move 2 from 2 to 3
|
||||||
|
move 9 from 9 to 2
|
||||||
|
move 4 from 4 to 5
|
||||||
|
move 4 from 5 to 4
|
||||||
|
move 5 from 1 to 4
|
||||||
|
move 10 from 4 to 5
|
||||||
|
move 22 from 9 to 1
|
||||||
|
move 2 from 2 to 7
|
||||||
|
move 3 from 2 to 1
|
||||||
|
move 6 from 2 to 6
|
||||||
|
move 1 from 7 to 1
|
||||||
|
move 10 from 5 to 7
|
||||||
|
move 15 from 1 to 4
|
||||||
|
move 13 from 1 to 5
|
||||||
|
move 3 from 6 to 8
|
||||||
|
move 1 from 8 to 9
|
||||||
35
2022/go/day06/day06.go
Normal file
35
2022/go/day06/day06.go
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
package day06
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "fmt"
|
||||||
|
"sort"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"github.com/mpvl/unique"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
for i:=4;i<len(input);i++ {
|
||||||
|
s := input[i-4:i]
|
||||||
|
if s[0] == s[1] || s[0] == s[2] || s[0] == s[3] || s[1] == s[2] || s[1] == s[3] || s[2] == s[3] {
|
||||||
|
continue
|
||||||
|
} else {
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
for i:=14;i<len(input);i++ {
|
||||||
|
s := input[i-14:i]
|
||||||
|
sSlice := strings.Split(s,"")
|
||||||
|
length := len(sSlice)
|
||||||
|
sort.Strings(sSlice)
|
||||||
|
unique.Strings(&sSlice)
|
||||||
|
if length == len(sSlice) {
|
||||||
|
return i
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return 0
|
||||||
|
}
|
||||||
17
2022/go/day06/day06_test.go
Normal file
17
2022/go/day06/day06_test.go
Normal file
@@ -0,0 +1,17 @@
|
|||||||
|
package day06
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(`nznrnfrfntjfmvfwmzdfjlvtqnbhcprsg`)
|
||||||
|
require.Equal(t, 10, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2("mjqjpqmgbljsphdztnvjfqwrcgsmlb")
|
||||||
|
require.Equal(t, 19, r)
|
||||||
|
}
|
||||||
1
2022/go/day06/input.txt
Normal file
1
2022/go/day06/input.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
srjsssgppnssqzszmzjmjdmmqwqcwqccslsjswjssgbsgsnggqtqnnjznndtndnhddfldfdsfswsjsjjptjpttlwlccpnpgngcncnscncsnnwrwmwggsgdgssvbsstzsstqqrjqqlsqlsqscschhclhccznzcnnzzqppjbpjjqzzbwbqqzdqdjjqtjtbtgtqgtgdgwwsjjbwjjzssrsvsttgqtgglgplgpllcrcncssbrbgrbrllsqlsltthshrrnddwzdzdbbrppdvdqvvpvdvdsslbbmnbnjjrdrnntzzftzftttrsshpspvvrzzqzwzhzszbzjjwqwvqqglgflfwfrfprpddfvdffhzztwtppwwwztzsznzmnnbvbbtqqdhqdqdfffnjnmnlmljmlmnlnddzbbdgdqdnqqtjjtnthttvwwtrwwwgffqcfchfcfwcczhhgjhghpgpwgwffhghzghhtftntnnmlnmlmddqbbfwbfwbwvvfssrggptpltpllbcbzczzlccjgcgvcczjzvvvdtvdvqdqwdqdvdjvddjfdjjqmmfgfsftfzfwzwzfftmfmmqdqccjqcqwwflwlccpssvzzzbnbjnbjjgtgpttbwbrbwrwvrrwccgrgrvvpjvvznvvhddtdldpldppmlplltdllhqhpqhqqbpptgpgjgqjgjffvfdvdttsrsllhzlzrrdrnrjrddqbbjrrvrsstgsttjqjhjbhhnmndmmnrmnnrggmtgmmhshjjfqjjtqtstpstppggtzzrsrwwqffvzvzvqqggqsqtstszttpvtvvvddcncvncvchhnsnpsnnlmnnmqnqjjfwfccmwmbwbswbswwghhzrrptptbbjbtjjgdjgjrgrwgwlglblbnlnbbwnnpbnbmbtmtvvhjjlwlhhszslldwlwdllhjhghqghhqpplhhtjhhnhqhlhjhmmlhlmmrpptvvcczfcccwgcccpgpspdpccfhchffbjbzzwppfbbstbtltpllcssnnctnnqcqhhclhccvlvlffnjjwbwfbfttwvvdvnnnsrstrtmtfthtzzcvzvhzzpmpfpmmmwggdbdqdbbjnbbdqbbrnnnprrwbbcwbbpjjprjjzzvwwvrrthhqvhvnhhzmzszrszsjssclcjjbhjbhjbhjbjhhzbbzttnrnssrbrjbrjjmsmffdlflfzfbzzmtztdthdhldhlddnccgbbmtbbsbzsbzzcsszpzfffprfpfzfrzzhvhffsmmqtjwgjbzhnmrslrmgfjpqcllcgsjdhrshqtlgmqqtfmswfzwtnrswtzdjzclcfmltqgdhcsgvzrdltgfbtqclpppvbqnbqmlhmdbsjbwbdllzpnrwfhmnlgvdwsdjsznnhqzhwntjvcpzdrfwmwwdrttdvzspmbmqggmlmsvwgcjgpvcmplqwfjgpghnfpbctnfhcgngcbdmzhlpcnjpmczzsgfgrdftrzgvmmpdmgcrpcdrjsgczpfjnwpdjpntdngdjwctvcbsjmfwvtsrlhvpswppmfwrwzsbsgbjvljzqjjldmnqnmwsmqnmhmqhhttppbpqlvdcvdbhmbnjzztjrdjdzlvmbdrghtftwdpcwwblsjbgnzwtpztmtmnrpsvzfzncqmrvhcbqcvqvnlngdcllrqlbhjttnmjmhfhdzmjmplcfdqpmwblzsnmpczwcnggcwdvgnjcrrtmpwwqdqpvtbzpdbfnbfcfllntqjlslcsznjvzvsbntrtzwhcbtdmbmwttvhdvdtvrcmprcrrjlgsqddrsmwsrbtbpjrmlbrnsdrjfhjnqjtgjmhzjbjnprvmhtjcdbztwqmrlfflfmcslshtwmwhgvbdslgjhzjlglhllsdphlzngjfwfrlwpnqfhghnqhzhgrszbcwjvlrtmshntszsqplvfbccjwctgtfmqgqjdlgdbwhgvctqtcgfdwvqdwqzddmsbrpftzpqztgzbnplvhftmgpdthnrdhqbltbrmhpcqsfccmqzwmrbnbgbjspslwpjhdqspssqdtnssmjmvzwwfstgzzjrmfczdlznwqpdhbsjqddvffcgfhfdqdrlwcsgcsszdtpqbbsthpwbhdfzmgmcdggfcwcmzfjnfbzbccjhvwhbwfslnqnrwhgrwtlnmrmncnjtbjbdlmqsczppgbcmsdrwlrpjbgrmnhqqfhhsdhmdmpvvpjrnzsvzctmqhpzcvcjfgtlfvqvnvlnprmgrsvrrvtjfndqfsvqdsfbcwlbglmfhfhcfgqdfmclnzhdtppgzzsqgjqncqrbdhlhdjqwjpmbdnfmgdgwbwmnlngnmrhcgqwzvmbjzdvsspjwwdtpnvpftdlqlzfgtscfczsvbrtrqqpgqlvmrtddqplbzsswbgpdzpqfvqpqbndblghmdhmnctdnjbgglmrlvmrmsfgntfdwvqcvvlvbcnwrctvjqhmnsjqccwltbfqpqpmwsfvmnnfqmlmlcchqcdtbvqwcpptvfwrwtbdrlsgnwpmjgnwlprzqjlwqmtmjglbrzlgfbsghwqdmwhrcmfwdmzmflsbngtgndftdpzsqvgqdsfdhplmfcmwpbtvcdmpghmfwqjvhdhfpmbrqpvnbhlftgdtprlztrgnlcldfpjqjqdfrvqtcnzrtjcgzgsslzghlnfhwwjwzdsmpsczclrfmnqjvfmvsqpntsnnnlrfswqtrppzhqgjzlzvrrbhhfhchhvgztpgctcsgssvttszsrdwzwrbmwmspgqhmmfnzqqdbmnbltdmrsvqgddltwczbbjcmplncspgqgmzrndhttsrbvqbpbvhshfqrpqgmmdbhmmtccjcmntmpqhrvhnfnlqqbctsnfzjbphhqwmztgbhqqlbctbsfcszbggzrlcdhwddtjgtqhppzgjsqcddwjsngjrcdflmgwgfnzhjtcwgbqvpwmpgcpdwvqgswwfzcnjgmdpffmqczmsqgpthpmsjlwnrcbzrfshvwftzllwrmfccmlpjnmpjdfpcvjgjpznllmqjwpcflgqgdljtbbjvjlvhhmtvzfnjfnnwrvtlfdbhqphrjghtmlsrplqscsnvjvqdslsbsfzzrjfmchplzgjgdqvzhfphvsjfvnqlgmjfzhrdlmmvfntnzdvrnwqshsmtjnqmwzgpbbzszrsqcvlzjwnmgjhmfqrbvgmfqpswctmvpfcghvdqgstglmzvpfhzfzvhqqdmvrvrttlpwwhqgddzqlrvvdffqtznvlfgjhhmvbmtzjqnnhqzrtbzpqcwpngrdcndcgzwhzgtfwbmwbrpvvczczhwcqwsqzqbqvqftcswtcbzdbpccjhtwbpnwlwwwqwscptlwshrdbmmdcgrmpnnwgjwzszwwdwctfspbfqvdjqtrflshrqlbfgpnrmbszwjpcdzbggphgplcgvwljprzmtncsvfwqchttndhpnzmtdvtjqtcsddtqvcmztmjgwqvjhflrjjtnvfpjrnlvzvwvrpbhrzslmrqqzqhnzqnvtqppmncddphbwwsjczmphsrlltzndtqjgdlqgpnlfcvwntstmrgcrjzmmllpwldnwmwzpvzctmhszspcvtgnqthszzsmtdnzwtfddfctpjhscbqgwfpqmzpvqrzvtbrdjzrqprdgbpmzzfbgqcvcdtsfrffcpqwtvdwvtcqlcsdrzntgrhrspznndslmnvptlphpdqgbblfhmgbpmmfwqzlhvzshhpzgfjldqclngbcbrmmnqqvqmwdnjsglsggqfgjldqfbsqgtrwmpdffqlcwwlfhlpqfgwtssnjwzhgvtwqzmhmgwzwmcggmpmrzqrcsmflqsrbnzvdmjcdbnscstqrqhvddsbjpzwsvzswqhcqmgzlvfcnzjrrffzphmrvdbhqbrwpsfqvfqwhqhcgfvfsfttzcdsrjgjwcgvhllszmplmvgczqsbfldnbvrnqccbprjjdwhmqpdjjrnfdlhzdvlfmrldjlqclbjrrtjfsflphzdcdpfpr
|
||||||
112
2022/go/day07/day07.go
Normal file
112
2022/go/day07/day07.go
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
package day07
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"adventofcode2022/utils"
|
||||||
|
)
|
||||||
|
|
||||||
|
type dir struct {
|
||||||
|
name string
|
||||||
|
files map[string]int
|
||||||
|
subdir map[string]*dir
|
||||||
|
parent *dir
|
||||||
|
size int
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
root := dir{name: "/", files: map[string]int{}, subdir: map[string]*dir{}, parent: nil}
|
||||||
|
root.parse(input)
|
||||||
|
sum := 0
|
||||||
|
find_dirs_part1(&root, 100000, &sum)
|
||||||
|
return sum
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
root := dir{name: "/", files: map[string]int{}, subdir: map[string]*dir{}, parent: nil}
|
||||||
|
root.parse(input)
|
||||||
|
unused := 70000000 - root.size
|
||||||
|
need := 30000000 - unused
|
||||||
|
dir_size := 0
|
||||||
|
find_dirs_part2(&root, need, &dir_size)
|
||||||
|
return dir_size
|
||||||
|
}
|
||||||
|
|
||||||
|
func find_dirs_part1(d *dir, size int, sum *int) {
|
||||||
|
// recurse into subdir
|
||||||
|
for _, subdir := range d.subdir {
|
||||||
|
if (subdir.size) <= size {
|
||||||
|
*sum += subdir.size
|
||||||
|
}
|
||||||
|
find_dirs_part1(subdir, size, sum)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func find_dirs_part2(d *dir, size int, sum *int) {
|
||||||
|
// recurse into subdir
|
||||||
|
for _, subdir := range d.subdir {
|
||||||
|
if (subdir.size) >= size && (*sum == 0 || (subdir.size) < *sum) {
|
||||||
|
*sum = subdir.size
|
||||||
|
}
|
||||||
|
find_dirs_part2(subdir, size, sum)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (root *dir) parse(input string) {
|
||||||
|
c := root
|
||||||
|
|
||||||
|
for _, line := range strings.Split(input, "\n") {
|
||||||
|
pieces := strings.Split(line, " ")
|
||||||
|
if pieces[0] == "$" {
|
||||||
|
if pieces[1] == "cd" {
|
||||||
|
if pieces[2] == ".." {
|
||||||
|
c = c.parent
|
||||||
|
} else if pieces[2] == "/" {
|
||||||
|
c = root
|
||||||
|
} else {
|
||||||
|
c = c.addDirectoryIfMissing(pieces[2])
|
||||||
|
}
|
||||||
|
} else if pieces[1] == "ls" {
|
||||||
|
// no need to do anything
|
||||||
|
} else {
|
||||||
|
panic("oops")
|
||||||
|
}
|
||||||
|
} else if pieces[0] == "dir" {
|
||||||
|
c.addDirectoryIfMissing(pieces[1])
|
||||||
|
} else {
|
||||||
|
c.addFileIfMissing(pieces[1], utils.MustAtoi(pieces[0]))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *dir) addDirectoryIfMissing(name string) *dir {
|
||||||
|
t, ok := d.subdir[name]
|
||||||
|
if !ok {
|
||||||
|
t = &dir{
|
||||||
|
name: name,
|
||||||
|
files: map[string]int{},
|
||||||
|
subdir: map[string]*dir{},
|
||||||
|
parent: d,
|
||||||
|
}
|
||||||
|
d.subdir[name] = t
|
||||||
|
}
|
||||||
|
return t
|
||||||
|
}
|
||||||
|
|
||||||
|
func (d *dir) addFileIfMissing(name string, size int) {
|
||||||
|
t, ok := d.files[name]
|
||||||
|
if ok {
|
||||||
|
if t != size {
|
||||||
|
panic("oops")
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
current := d
|
||||||
|
d.files[name] = size
|
||||||
|
|
||||||
|
for current.name != "/" {
|
||||||
|
current.size += size
|
||||||
|
current = current.parent
|
||||||
|
}
|
||||||
|
current.size += size
|
||||||
|
}
|
||||||
|
}
|
||||||
63
2022/go/day07/day07_test.go
Normal file
63
2022/go/day07/day07_test.go
Normal file
@@ -0,0 +1,63 @@
|
|||||||
|
package day07
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(
|
||||||
|
`$ cd /
|
||||||
|
$ ls
|
||||||
|
dir a
|
||||||
|
14848514 b.txt
|
||||||
|
8504156 c.dat
|
||||||
|
dir d
|
||||||
|
$ cd a
|
||||||
|
$ ls
|
||||||
|
dir e
|
||||||
|
29116 f
|
||||||
|
2557 g
|
||||||
|
62596 h.lst
|
||||||
|
$ cd e
|
||||||
|
$ ls
|
||||||
|
584 i
|
||||||
|
$ cd ..
|
||||||
|
$ cd ..
|
||||||
|
$ cd d
|
||||||
|
$ ls
|
||||||
|
4060174 j
|
||||||
|
8033020 d.log
|
||||||
|
5626152 d.ext
|
||||||
|
7214296 k`)
|
||||||
|
require.Equal(t, 95437, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(
|
||||||
|
`$ cd /
|
||||||
|
$ ls
|
||||||
|
dir a
|
||||||
|
14848514 b.txt
|
||||||
|
8504156 c.dat
|
||||||
|
dir d
|
||||||
|
$ cd a
|
||||||
|
$ ls
|
||||||
|
dir e
|
||||||
|
29116 f
|
||||||
|
2557 g
|
||||||
|
62596 h.lst
|
||||||
|
$ cd e
|
||||||
|
$ ls
|
||||||
|
584 i
|
||||||
|
$ cd ..
|
||||||
|
$ cd ..
|
||||||
|
$ cd d
|
||||||
|
$ ls
|
||||||
|
4060174 j
|
||||||
|
8033020 d.log
|
||||||
|
5626152 d.ext
|
||||||
|
7214296 k`)
|
||||||
|
require.Equal(t, 24933642, r)
|
||||||
|
}
|
||||||
1051
2022/go/day07/input.txt
Normal file
1051
2022/go/day07/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
89
2022/go/day08/day08.go
Normal file
89
2022/go/day08/day08.go
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
package day08
|
||||||
|
|
||||||
|
import (
|
||||||
|
_ "fmt"
|
||||||
|
|
||||||
|
"adventofcode2022/utils"
|
||||||
|
"adventofcode2022/utils/inputs"
|
||||||
|
"adventofcode2022/utils/grid2d"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
grid := inputs.ToGrid2D(input, "\n", "", -1, utils.MustAtoi)
|
||||||
|
visible := grid2d.NewGrid(grid.SizeX(), grid.SizeY(), false)
|
||||||
|
|
||||||
|
for j := 0; j < grid.SizeY(); j++ {
|
||||||
|
for i := 0; i < grid.SizeX(); i++ {
|
||||||
|
directions := [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}}
|
||||||
|
for _, dir := range directions {
|
||||||
|
v := true
|
||||||
|
x := i
|
||||||
|
y := j
|
||||||
|
for {
|
||||||
|
x += dir[0]
|
||||||
|
y += dir[1]
|
||||||
|
if x < 0 || x >= grid.SizeX() || y < 0 || y >= grid.SizeY() {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if grid.Get(i, j) <= grid.Get(x, y) {
|
||||||
|
v = false
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if v {
|
||||||
|
visible.Set(i, j, true)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
sum := 0
|
||||||
|
for j := 0; j < visible.SizeY(); j++ {
|
||||||
|
for i := 0; i < visible.SizeX(); i++ {
|
||||||
|
if visible.Get(i, j) {
|
||||||
|
sum++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return sum
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
grid := inputs.ToGrid2D(input, "\n", "", -1, utils.MustAtoi)
|
||||||
|
scenicScore := grid2d.NewGrid(grid.SizeX(), grid.SizeY(), 1)
|
||||||
|
|
||||||
|
for j := 0; j < grid.SizeY(); j++ {
|
||||||
|
for i := 0; i < grid.SizeX(); i++ {
|
||||||
|
directions := [][]int{{0, 1}, {0, -1}, {1, 0}, {-1, 0}}
|
||||||
|
for _, dir := range directions {
|
||||||
|
score := 0
|
||||||
|
x := i
|
||||||
|
y := j
|
||||||
|
for {
|
||||||
|
x += dir[0]
|
||||||
|
y += dir[1]
|
||||||
|
if x < 0 || x >= grid.SizeX() || y < 0 || y >= grid.SizeY() {
|
||||||
|
break
|
||||||
|
}
|
||||||
|
if grid.Get(i, j) <= grid.Get(x, y) {
|
||||||
|
score++
|
||||||
|
break
|
||||||
|
}
|
||||||
|
score++
|
||||||
|
}
|
||||||
|
scenicScore.Set(i, j, scenicScore.Get(i,j) * score)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
max := 0
|
||||||
|
for j := 0; j < scenicScore.SizeY(); j++ {
|
||||||
|
for i := 0; i < scenicScore.SizeX(); i++ {
|
||||||
|
if scenicScore.Get(i, j) > max {
|
||||||
|
max = scenicScore.Get(i, j)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return max
|
||||||
|
}
|
||||||
27
2022/go/day08/day08_test.go
Normal file
27
2022/go/day08/day08_test.go
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
package day08
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(
|
||||||
|
`30373
|
||||||
|
25512
|
||||||
|
65332
|
||||||
|
33549
|
||||||
|
35390`)
|
||||||
|
require.Equal(t, 21, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(
|
||||||
|
`30373
|
||||||
|
25512
|
||||||
|
65332
|
||||||
|
33549
|
||||||
|
35390`)
|
||||||
|
require.Equal(t, 8, r)
|
||||||
|
}
|
||||||
99
2022/go/day08/input.txt
Normal file
99
2022/go/day08/input.txt
Normal file
@@ -0,0 +1,99 @@
|
|||||||
|
020111211022103023211142403044034010412103202221251542233334311102303044440313120021223120332211221
|
||||||
|
121001110111201102213124201444431204213221413222211111444444412110041144131210002230130121313101010
|
||||||
|
112010221202200121420032021412024323255214355122345552225213252324112400440302313420323102103100221
|
||||||
|
211022232121222123201224234031435144114512425232345144523531533222344004011342234110131312300332202
|
||||||
|
202103101023303021233104321411251553151424242531344221312225231225524421412434024103021300123300121
|
||||||
|
202122200002211022342141123051132352344252152315525324551424132421225143201002114204223302333232221
|
||||||
|
011310312223223421431113235421121321152124551441143435255214322514544552225412313011414423301132102
|
||||||
|
121331322013001133311000223433443341113554412556562564315233144532455221433431002003332002203013201
|
||||||
|
003201332004241133340023541532333131413153266664363423353232622124454254554345422200200433100333102
|
||||||
|
230030131344203011040552414515334144165664524445366334422626244444323115333252423443232113432003211
|
||||||
|
020300112334333142144323414353551436334563654426436625356343222253643212532215422020214344013310331
|
||||||
|
220002231221003314452445344223355655546325233543653632544634656464243551334233433413423044300230210
|
||||||
|
111022100242320043435324555421362243363346366346456252353246655455262455415331454531201000441410231
|
||||||
|
101232013434204241242451442362524554225656254252456532663634445256345634451144555513214431300213021
|
||||||
|
021113211441142541244515256653533353262654644343347336234522332254544443346322422154143020040021110
|
||||||
|
002032342223245141521455555365463263562446777664546776637635443223664266645633333231151132112140113
|
||||||
|
002033421301452414544444345232465536465366346553375665564756366435442422632435555111445311104203133
|
||||||
|
332303032232445231354236322622423634433537753546335477544636344436526324435436522445155410213401230
|
||||||
|
214021124335354212514535634245552337436663757533364556376776733565333462254562365531354214423412431
|
||||||
|
231123230423124441525624265443647673566756453545563655373357453547537663433453433212213223101140424
|
||||||
|
100211320333154123522263362425466444634667564437776546465446345667366445453365366551352122420231230
|
||||||
|
024400401554531424535342424657437377754456437376767656436366374765557746355562226364213315421212320
|
||||||
|
214442223135544515264335435467756354735433346664764464468465443746334373746425422542525455354340110
|
||||||
|
141333001441254326655252563743544735555378755475567457777687677357576573543344653346551442221242312
|
||||||
|
022033123224325536562464253467675635635678458757477754757874576653435356676234462564555551451230022
|
||||||
|
444402313413432333426636637636453646648557685556587678886878777785454364533433543362622525453201222
|
||||||
|
031024134513414333456224636475357556855564445765756678575486648885765563445546566235352311454320030
|
||||||
|
341331341415512452344636337436467675565575756658588888477584775646657736366434365523664142235144413
|
||||||
|
333344214132152543325563654447567486457556845676545687457688885466457333476777342344625323533242333
|
||||||
|
203124152315365546566375565336778768544768846599686578655665448478657834657533335544343231212251101
|
||||||
|
200144235323636235437557635373578555545475587655886585897998654658858755534374677344254563233421200
|
||||||
|
433243323452635426237436445738684446475489658878699879887988684656474746764334543334452565153341241
|
||||||
|
340411231113223465344733555465744685569658998876796578688888887678657675875533766464362432543531231
|
||||||
|
132155112416452662274535754677457567869597559977756878779755568868854644586734466764422245333151550
|
||||||
|
321153454153653654743477667888756477986578656976558879999589975695487876766664653466625262642234421
|
||||||
|
414524133155254243564664555445778475666688565697596679558768656758547564888437343772346336642515514
|
||||||
|
321251321324554554436434474754674597576658986766997798688766897876884764444653674674326233445555243
|
||||||
|
031553412663524646375654566887688857698655696699699989968699659665774657875735457664452362352111522
|
||||||
|
121541141642244257534355645887786995858959886778688769889987779898696567777567344373632655621545545
|
||||||
|
334343242432423553675774445756455759676757789677879778999988695976997447856786357655446656351514552
|
||||||
|
125145532643224566754564678556569669557567799868776897666898866898879866784847777744353546366314141
|
||||||
|
045114213352452647446647465888875868689699789677897977779999699895556776458746737674746244442322442
|
||||||
|
132343555663565436365447746478789879798676878686777999789966769777759954677478745673552645533545344
|
||||||
|
045253354653642556466557766588567888887978866878777776986676768968695857655674556463732652626443441
|
||||||
|
324411423536354677366485874488885578788769789998797978797888777868996895476778847746764226464355343
|
||||||
|
355421453642352476436787475855785669696986976979989787787998669696679989555875747556435562425323311
|
||||||
|
225422326356526465747344444546866698678986799879779799999876866969999686664477767757535635652555421
|
||||||
|
215234242322226376376776764668889755898766677787987779877967696689565966757675463574434246652622343
|
||||||
|
214252444222333767567367778585695867987669688798987987789888698888858597545545475573737453632634414
|
||||||
|
435144324646623745547785547465689576878976877888878988989877866686976879488454664357347554642541254
|
||||||
|
424224446333664566656688545685586987987699788897978888788999878967887869445474863534753362524653532
|
||||||
|
234521532264544735666677658457578679997886798878788998987976677895559685784445835563745433436535545
|
||||||
|
541253562333326733576345574569866788667878789897999998887996866685657897848485475437744246636412312
|
||||||
|
531515163362265375476387485646556857878999799999999989879989886696789765664474863474462523344554532
|
||||||
|
134323536435565375644658845476675857999867789999988888799986676978987577885467643356656525623333421
|
||||||
|
432434326635433776557758756889896978587689688777989999797796888999765958586488873373565325435254453
|
||||||
|
352344243543664654777655867556767767686778796989888798998697976755779565488844544677343523234525134
|
||||||
|
023522455223435563774634466685769765877876776996699877886876668865856964846675357575675235445525211
|
||||||
|
452211123455454466574537744568597875596879779869788776669767986968956557448486336534544244456115451
|
||||||
|
154255352645344566574476875484685575595898898697799799688669879869766768688476473673634645556554324
|
||||||
|
153224532366353377543578485765465665577767776999977978876879865565957587758448456773452265664315213
|
||||||
|
212223354662352476456344644856876756566976677698968768897897866997679566845464663374352444344522513
|
||||||
|
333134124655526377555445475778655559695856687767878889687866969787796886748547665457422543622531314
|
||||||
|
114114243655626456537464558857564557866777897897898988696885586978887448448543375665233363532515252
|
||||||
|
022123225426235336675765546686448888566865666569876966556979869667956845877753374733454555422452344
|
||||||
|
105112231544246463366336777688875488697685796985999888976956985978664485756743456372244565641412542
|
||||||
|
243421525526425322655767646868764584599579555769857975877669799998745668566534743565233224245452434
|
||||||
|
310412235133463356343754335447454467578555798898788997569756589585876868467475435524433556255213522
|
||||||
|
122253434533466554567356664688567676567976599967878669868967997845484546736534545734455626245154423
|
||||||
|
313334534424352263526466637778587787868565658999559897596678677574858776343543534432632333531241224
|
||||||
|
001031252124265545567437743765668445564487997555965858678954577555545545743366457636433553523254344
|
||||||
|
044305452425444342246365565576568644874888888677955886697487686854588744354437555336664241413533111
|
||||||
|
110113123534526242542645447354547688467557884774478677887477777586654656653436654455626314334324023
|
||||||
|
403311355254242426345425533745657486754657454674877454647844866774463676664344325662334351444144012
|
||||||
|
114043453225323265365363357353773386544675474785655464585675566555543364665665355442555535443420344
|
||||||
|
234021355512324262426566274773756436677647664566764646854655875476556464746532226425352124354233001
|
||||||
|
104234323224222234534254555373773666356744475886877868685764755374634533664662562645321154355101301
|
||||||
|
413312132345313224565423553463467666456365585778746647466885776356666677636556254365513311121044324
|
||||||
|
010140223145323354554344523347476477547564757555585887484666633663433654743326266555221322431333120
|
||||||
|
023311233225342421354662654347733666374666336373663635367447753577353743232632663243333251551031321
|
||||||
|
143043334422453221246324462653756444767736544367544755375437335646557334655533644454121143303220002
|
||||||
|
101212344011254432246625336226267546745356655577456676377355677475746633565634244145133154032123242
|
||||||
|
233244204414154431434433222525444454344635736634774576466473546373725623264634363324244114303014300
|
||||||
|
010103422332213512154554324533443662535535356636747655647737636354525554536436123454141421414030443
|
||||||
|
203123300244432323224135253642444433566335637575443374634433336553444225543564152215332533001133230
|
||||||
|
213003230312403552352142145445635666323653353353657647435752235322633623453542112525124011312421020
|
||||||
|
120004434213011143254452233425222536464236356544634635324242345464353322232141135221424123200431123
|
||||||
|
331000214011314431233211121223425334456246345226324246526344536556636556453143153253323114441131132
|
||||||
|
303123142412333143322451153243464566344362342525524265432552566442626262524431454151443133021301210
|
||||||
|
220100102032004440315125323552226234566265233246334556355333643662354455122325544112124232340231031
|
||||||
|
112122312031202424345533512342151435534325334444254264542526645645533111234131131223411304322200110
|
||||||
|
213031212133401330114433121533455425225634422363334633454623522242353342455454511303033230433202120
|
||||||
|
223232022333401311421344332255311133421254642562465526534445512134533413153142410113101444330132130
|
||||||
|
020133013100324344342244215442123125243314222446342424421353134352515124333133430431401122202211032
|
||||||
|
102300310001014311443112031115242425132234255215315523551534154524134344433432201022200432133000302
|
||||||
|
001233311232134334100401400151532231322435145412132433235254313414243334103312232304403111313321210
|
||||||
|
110213022233310011220103432114343112114222424442543155552411511144115122143322304023012132213011210
|
||||||
|
000220123220323122321103444304134551331233141552114422121151224211122042434324042030120133230110110
|
||||||
|
020120232301110331441234422110132302233413123211331413433254521355004032312110222131010330301222211
|
||||||
119
2022/go/day09/day09.go
Normal file
119
2022/go/day09/day09.go
Normal file
@@ -0,0 +1,119 @@
|
|||||||
|
package day09
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"adventofcode2022/utils"
|
||||||
|
sparsegrid "adventofcode2022/utils/sparseGrid"
|
||||||
|
)
|
||||||
|
|
||||||
|
type rope struct {
|
||||||
|
size int
|
||||||
|
posX []int
|
||||||
|
posY []int
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
rope := newRope(2)
|
||||||
|
grid := sparsegrid.NewGrid(false)
|
||||||
|
grid.Set(rope.posX[rope.size-1], rope.posY[rope.size-1], true)
|
||||||
|
for _, line := range strings.Split(input, "\n") {
|
||||||
|
dx := 0
|
||||||
|
dy := 0
|
||||||
|
switch line[0] {
|
||||||
|
case 'R':
|
||||||
|
dx = 1
|
||||||
|
case 'U':
|
||||||
|
dy = -1
|
||||||
|
case 'D':
|
||||||
|
dy = 1
|
||||||
|
case 'L':
|
||||||
|
dx = -1
|
||||||
|
}
|
||||||
|
n := utils.MustAtoi(line[2:])
|
||||||
|
for i := 0; i < n; i++ {
|
||||||
|
// move head
|
||||||
|
rope.posX[0] += dx
|
||||||
|
rope.posY[0] += dy
|
||||||
|
|
||||||
|
// update tail
|
||||||
|
rope.updateTail()
|
||||||
|
grid.Set(rope.posX[rope.size-1], rope.posY[rope.size-1], true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return grid.Visited()
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
rope := newRope(10)
|
||||||
|
grid := sparsegrid.NewGrid(false)
|
||||||
|
grid.Set(rope.posX[rope.size-1], rope.posY[rope.size-1], true)
|
||||||
|
for _, line := range strings.Split(input, "\n") {
|
||||||
|
dx := 0
|
||||||
|
dy := 0
|
||||||
|
switch line[0] {
|
||||||
|
case 'R':
|
||||||
|
dx = 1
|
||||||
|
case 'U':
|
||||||
|
dy = -1
|
||||||
|
case 'D':
|
||||||
|
dy = 1
|
||||||
|
case 'L':
|
||||||
|
dx = -1
|
||||||
|
}
|
||||||
|
n := utils.MustAtoi(line[2:])
|
||||||
|
for i := 0; i < n; i++ {
|
||||||
|
// move head
|
||||||
|
rope.posX[0] += dx
|
||||||
|
rope.posY[0] += dy
|
||||||
|
|
||||||
|
// update tail
|
||||||
|
rope.updateTail()
|
||||||
|
grid.Set(rope.posX[rope.size-1], rope.posY[rope.size-1], true)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return grid.Visited()
|
||||||
|
}
|
||||||
|
|
||||||
|
func newRope(size int) *rope {
|
||||||
|
return &rope{
|
||||||
|
size: size,
|
||||||
|
posX: make([]int, size),
|
||||||
|
posY: make([]int, size),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *rope) updateTail() {
|
||||||
|
outer:
|
||||||
|
for i := 1; i < r.size; i++ {
|
||||||
|
diffX := utils.Abs(r.posX[i-1] - r.posX[i])
|
||||||
|
diffY := utils.Abs(r.posY[i-1] - r.posY[i])
|
||||||
|
if diffX <= 1 && diffY <= 1 {
|
||||||
|
// no need to update node if it's touching
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
moves := [][]int{{1, 0}, {-1, 0}, {0, 1}, {0, -1}}
|
||||||
|
for _, move := range moves {
|
||||||
|
t := utils.Max(
|
||||||
|
utils.Abs(r.posX[i-1]-r.posX[i]+move[0]),
|
||||||
|
utils.Abs(r.posY[i-1]-r.posY[i]+move[1]))
|
||||||
|
if t == 1 {
|
||||||
|
r.posX[i] = r.posX[i-1] + move[0]
|
||||||
|
r.posY[i] = r.posY[i-1] + move[1]
|
||||||
|
continue outer
|
||||||
|
}
|
||||||
|
}
|
||||||
|
moves = [][]int{{1, 1}, {-1, 1}, {1, -1}, {-1, -1}}
|
||||||
|
for _, move := range moves {
|
||||||
|
t := utils.Max(
|
||||||
|
utils.Abs(r.posX[i-1]-r.posX[i]+move[0]),
|
||||||
|
utils.Abs(r.posY[i-1]-r.posY[i]+move[1]))
|
||||||
|
if t == 1 {
|
||||||
|
r.posX[i] = r.posX[i-1] + move[0]
|
||||||
|
r.posY[i] = r.posY[i-1] + move[1]
|
||||||
|
continue outer
|
||||||
|
}
|
||||||
|
}
|
||||||
|
panic("unreachable")
|
||||||
|
}
|
||||||
|
}
|
||||||
25
2022/go/day09/day09_test.go
Normal file
25
2022/go/day09/day09_test.go
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
package day09
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(
|
||||||
|
`R 4
|
||||||
|
U 4
|
||||||
|
L 3
|
||||||
|
D 1
|
||||||
|
R 4
|
||||||
|
D 1
|
||||||
|
L 5
|
||||||
|
R 2`)
|
||||||
|
require.Equal(t, 13, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2("")
|
||||||
|
require.Equal(t, 0, r)
|
||||||
|
}
|
||||||
2000
2022/go/day09/input.txt
Normal file
2000
2022/go/day09/input.txt
Normal file
File diff suppressed because it is too large
Load Diff
77
2022/go/day10/day10.go
Normal file
77
2022/go/day10/day10.go
Normal file
@@ -0,0 +1,77 @@
|
|||||||
|
package day10
|
||||||
|
|
||||||
|
import (
|
||||||
|
"adventofcode2022/utils"
|
||||||
|
_ "fmt"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
cycle := 0
|
||||||
|
strength := 0
|
||||||
|
x := 1
|
||||||
|
for _, line := range lines {
|
||||||
|
cmd := strings.Split(line, " ")
|
||||||
|
switch {
|
||||||
|
case cmd[0] == "noop":
|
||||||
|
strength,cycle = cycles_1(1, cycle, strength, x)
|
||||||
|
case cmd[0] == "addx":
|
||||||
|
strength, cycle = cycles_1(2, cycle, strength, x)
|
||||||
|
x += utils.MustAtoi(cmd[1])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return strength
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) string {
|
||||||
|
lines := strings.Split(input, "\n")
|
||||||
|
cycle := 0
|
||||||
|
x := 1
|
||||||
|
crt := [6][40]string{}
|
||||||
|
for _, line := range lines {
|
||||||
|
cmd := strings.Split(line, " ")
|
||||||
|
switch {
|
||||||
|
case cmd[0] == "noop":
|
||||||
|
cycle = cycles_2(1, cycle, x, &crt)
|
||||||
|
case cmd[0] == "addx":
|
||||||
|
cycle = cycles_2(2, cycle, x, &crt)
|
||||||
|
x += utils.MustAtoi(cmd[1])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
output := "\n"
|
||||||
|
for i:=0;i<6;i++ {
|
||||||
|
for j:=0;j<40;j++ {
|
||||||
|
output = output + crt[i][j]
|
||||||
|
}
|
||||||
|
output = output + "\n"
|
||||||
|
}
|
||||||
|
|
||||||
|
return output
|
||||||
|
}
|
||||||
|
|
||||||
|
func cycles_1(num int, cycle int, strength int, x int) (int, int) {
|
||||||
|
for i:=0;i<num;i++ {
|
||||||
|
cycle++
|
||||||
|
if cycle == 20 {
|
||||||
|
strength = strength + (x * cycle)
|
||||||
|
} else if (cycle - 20) % 40 == 0 {
|
||||||
|
strength = strength + (x * cycle)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return strength, cycle
|
||||||
|
}
|
||||||
|
|
||||||
|
func cycles_2(num int, cycle int, x int, crt *[6][40]string) int {
|
||||||
|
for i:=0;i<num;i++ {
|
||||||
|
crt_x := cycle / 40
|
||||||
|
crt_y := cycle % 40
|
||||||
|
if x-1 == crt_y || x == crt_y || x+1 == crt_y {
|
||||||
|
crt[crt_x][crt_y] = "#"
|
||||||
|
} else {
|
||||||
|
crt[crt_x][crt_y] = " "
|
||||||
|
}
|
||||||
|
cycle++
|
||||||
|
}
|
||||||
|
return cycle
|
||||||
|
}
|
||||||
314
2022/go/day10/day10_test.go
Normal file
314
2022/go/day10/day10_test.go
Normal file
@@ -0,0 +1,314 @@
|
|||||||
|
package day10
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1(
|
||||||
|
`addx 15
|
||||||
|
addx -11
|
||||||
|
addx 6
|
||||||
|
addx -3
|
||||||
|
addx 5
|
||||||
|
addx -1
|
||||||
|
addx -8
|
||||||
|
addx 13
|
||||||
|
addx 4
|
||||||
|
noop
|
||||||
|
addx -1
|
||||||
|
addx 5
|
||||||
|
addx -1
|
||||||
|
addx 5
|
||||||
|
addx -1
|
||||||
|
addx 5
|
||||||
|
addx -1
|
||||||
|
addx 5
|
||||||
|
addx -1
|
||||||
|
addx -35
|
||||||
|
addx 1
|
||||||
|
addx 24
|
||||||
|
addx -19
|
||||||
|
addx 1
|
||||||
|
addx 16
|
||||||
|
addx -11
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 21
|
||||||
|
addx -15
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx -3
|
||||||
|
addx 9
|
||||||
|
addx 1
|
||||||
|
addx -3
|
||||||
|
addx 8
|
||||||
|
addx 1
|
||||||
|
addx 5
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx -36
|
||||||
|
noop
|
||||||
|
addx 1
|
||||||
|
addx 7
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 2
|
||||||
|
addx 6
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 7
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
addx -13
|
||||||
|
addx 13
|
||||||
|
addx 7
|
||||||
|
noop
|
||||||
|
addx 1
|
||||||
|
addx -33
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 2
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 8
|
||||||
|
noop
|
||||||
|
addx -1
|
||||||
|
addx 2
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
addx 17
|
||||||
|
addx -9
|
||||||
|
addx 1
|
||||||
|
addx 1
|
||||||
|
addx -3
|
||||||
|
addx 11
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx -13
|
||||||
|
addx -19
|
||||||
|
addx 1
|
||||||
|
addx 3
|
||||||
|
addx 26
|
||||||
|
addx -30
|
||||||
|
addx 12
|
||||||
|
addx -1
|
||||||
|
addx 3
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx -9
|
||||||
|
addx 18
|
||||||
|
addx 1
|
||||||
|
addx 2
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 9
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx -1
|
||||||
|
addx 2
|
||||||
|
addx -37
|
||||||
|
addx 1
|
||||||
|
addx 3
|
||||||
|
noop
|
||||||
|
addx 15
|
||||||
|
addx -21
|
||||||
|
addx 22
|
||||||
|
addx -6
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
addx 2
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
addx -10
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 20
|
||||||
|
addx 1
|
||||||
|
addx 2
|
||||||
|
addx 2
|
||||||
|
addx -6
|
||||||
|
addx -11
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop`)
|
||||||
|
require.Equal(t, 13140, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2(
|
||||||
|
`addx 15
|
||||||
|
addx -11
|
||||||
|
addx 6
|
||||||
|
addx -3
|
||||||
|
addx 5
|
||||||
|
addx -1
|
||||||
|
addx -8
|
||||||
|
addx 13
|
||||||
|
addx 4
|
||||||
|
noop
|
||||||
|
addx -1
|
||||||
|
addx 5
|
||||||
|
addx -1
|
||||||
|
addx 5
|
||||||
|
addx -1
|
||||||
|
addx 5
|
||||||
|
addx -1
|
||||||
|
addx 5
|
||||||
|
addx -1
|
||||||
|
addx -35
|
||||||
|
addx 1
|
||||||
|
addx 24
|
||||||
|
addx -19
|
||||||
|
addx 1
|
||||||
|
addx 16
|
||||||
|
addx -11
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 21
|
||||||
|
addx -15
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx -3
|
||||||
|
addx 9
|
||||||
|
addx 1
|
||||||
|
addx -3
|
||||||
|
addx 8
|
||||||
|
addx 1
|
||||||
|
addx 5
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx -36
|
||||||
|
noop
|
||||||
|
addx 1
|
||||||
|
addx 7
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 2
|
||||||
|
addx 6
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 7
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
addx -13
|
||||||
|
addx 13
|
||||||
|
addx 7
|
||||||
|
noop
|
||||||
|
addx 1
|
||||||
|
addx -33
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 2
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 8
|
||||||
|
noop
|
||||||
|
addx -1
|
||||||
|
addx 2
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
addx 17
|
||||||
|
addx -9
|
||||||
|
addx 1
|
||||||
|
addx 1
|
||||||
|
addx -3
|
||||||
|
addx 11
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx -13
|
||||||
|
addx -19
|
||||||
|
addx 1
|
||||||
|
addx 3
|
||||||
|
addx 26
|
||||||
|
addx -30
|
||||||
|
addx 12
|
||||||
|
addx -1
|
||||||
|
addx 3
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx -9
|
||||||
|
addx 18
|
||||||
|
addx 1
|
||||||
|
addx 2
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 9
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx -1
|
||||||
|
addx 2
|
||||||
|
addx -37
|
||||||
|
addx 1
|
||||||
|
addx 3
|
||||||
|
noop
|
||||||
|
addx 15
|
||||||
|
addx -21
|
||||||
|
addx 22
|
||||||
|
addx -6
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
addx 2
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
addx -10
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 20
|
||||||
|
addx 1
|
||||||
|
addx 2
|
||||||
|
addx 2
|
||||||
|
addx -6
|
||||||
|
addx -11
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop`)
|
||||||
|
require.Equal(t, `##..##..##..##..##..##..##..##..##..##..
|
||||||
|
###...###...###...###...###...###...###.
|
||||||
|
####....####....####....####....####....
|
||||||
|
#####.....#####.....#####.....#####.....
|
||||||
|
######......######......######......####
|
||||||
|
#######.......#######.......#######.....`, r)
|
||||||
|
}
|
||||||
140
2022/go/day10/input.txt
Normal file
140
2022/go/day10/input.txt
Normal file
@@ -0,0 +1,140 @@
|
|||||||
|
addx 1
|
||||||
|
addx 4
|
||||||
|
addx 21
|
||||||
|
addx -20
|
||||||
|
addx 4
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 5
|
||||||
|
addx 3
|
||||||
|
noop
|
||||||
|
addx 2
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 4
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 3
|
||||||
|
addx 5
|
||||||
|
addx 2
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
addx -37
|
||||||
|
addx 22
|
||||||
|
addx -4
|
||||||
|
addx -14
|
||||||
|
addx 2
|
||||||
|
addx 5
|
||||||
|
addx 3
|
||||||
|
addx -2
|
||||||
|
addx 2
|
||||||
|
addx 5
|
||||||
|
addx 2
|
||||||
|
addx -15
|
||||||
|
addx 32
|
||||||
|
addx -14
|
||||||
|
addx 5
|
||||||
|
addx 2
|
||||||
|
addx 3
|
||||||
|
noop
|
||||||
|
addx -13
|
||||||
|
addx -2
|
||||||
|
addx 18
|
||||||
|
addx -36
|
||||||
|
noop
|
||||||
|
addx 11
|
||||||
|
addx -7
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 6
|
||||||
|
addx 22
|
||||||
|
addx -21
|
||||||
|
addx 3
|
||||||
|
addx 2
|
||||||
|
addx 4
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 5
|
||||||
|
addx -16
|
||||||
|
addx 17
|
||||||
|
addx 2
|
||||||
|
addx 5
|
||||||
|
addx -11
|
||||||
|
addx 15
|
||||||
|
addx -15
|
||||||
|
addx -24
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 7
|
||||||
|
addx 2
|
||||||
|
addx -6
|
||||||
|
addx 9
|
||||||
|
noop
|
||||||
|
addx 5
|
||||||
|
noop
|
||||||
|
addx -3
|
||||||
|
addx 4
|
||||||
|
addx 2
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 7
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 5
|
||||||
|
addx -28
|
||||||
|
addx 29
|
||||||
|
noop
|
||||||
|
addx 3
|
||||||
|
addx -7
|
||||||
|
addx -29
|
||||||
|
noop
|
||||||
|
addx 7
|
||||||
|
addx -2
|
||||||
|
addx 2
|
||||||
|
addx 5
|
||||||
|
addx 2
|
||||||
|
addx -3
|
||||||
|
addx 4
|
||||||
|
addx 5
|
||||||
|
addx 2
|
||||||
|
addx 8
|
||||||
|
addx -30
|
||||||
|
addx 25
|
||||||
|
addx 7
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 3
|
||||||
|
addx -2
|
||||||
|
addx 2
|
||||||
|
addx -10
|
||||||
|
addx -24
|
||||||
|
addx 2
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx 2
|
||||||
|
noop
|
||||||
|
addx 3
|
||||||
|
addx 2
|
||||||
|
noop
|
||||||
|
addx 3
|
||||||
|
addx 2
|
||||||
|
addx 5
|
||||||
|
addx 2
|
||||||
|
noop
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
addx 2
|
||||||
|
addx 8
|
||||||
|
noop
|
||||||
|
noop
|
||||||
|
addx -1
|
||||||
|
addx -9
|
||||||
|
addx 14
|
||||||
|
noop
|
||||||
|
addx 1
|
||||||
|
noop
|
||||||
|
noop
|
||||||
18
2022/go/go.mod
Normal file
18
2022/go/go.mod
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
module adventofcode2022
|
||||||
|
|
||||||
|
go 1.19
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/alokmenghrajani/adventofcode2022 v0.0.0-20221225182202-291aae949bfb
|
||||||
|
github.com/deckarep/golang-set/v2 v2.3.1
|
||||||
|
github.com/mpvl/unique v0.0.0-20150818121801-cbe035fff7de
|
||||||
|
github.com/philhanna/stack v1.5.0
|
||||||
|
github.com/stretchr/testify v1.8.2
|
||||||
|
golang.org/x/exp v0.0.0-20221208152030-732eee02a75a
|
||||||
|
)
|
||||||
|
|
||||||
|
require (
|
||||||
|
github.com/davecgh/go-spew v1.1.1 // indirect
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 // indirect
|
||||||
|
gopkg.in/yaml.v3 v3.0.1 // indirect
|
||||||
|
)
|
||||||
27
2022/go/go.sum
Normal file
27
2022/go/go.sum
Normal file
@@ -0,0 +1,27 @@
|
|||||||
|
github.com/alokmenghrajani/adventofcode2022 v0.0.0-20221225182202-291aae949bfb h1:brhd2lQBATJuzH9JNEoJHeDT0zs5WImcEtRqQ2OzYLw=
|
||||||
|
github.com/alokmenghrajani/adventofcode2022 v0.0.0-20221225182202-291aae949bfb/go.mod h1:1rWZGu5Q4mtVaXOMj9kUNWcJqNGQJWynsvLmnN3P1Ng=
|
||||||
|
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c=
|
||||||
|
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
|
||||||
|
github.com/deckarep/golang-set/v2 v2.3.1 h1:vjmkvJt/IV27WXPyYQpAh4bRyWJc5Y435D17XQ9QU5A=
|
||||||
|
github.com/deckarep/golang-set/v2 v2.3.1/go.mod h1:VAky9rY/yGXJOLEDv3OMci+7wtDpOF4IN+y82NBOac4=
|
||||||
|
github.com/mpvl/unique v0.0.0-20150818121801-cbe035fff7de h1:D5x39vF5KCwKQaw+OC9ZPiLVHXz3UFw2+psEX+gYcto=
|
||||||
|
github.com/mpvl/unique v0.0.0-20150818121801-cbe035fff7de/go.mod h1:kJun4WP5gFuHZgRjZUWWuH1DTxCtxbHDOIJsudS8jzY=
|
||||||
|
github.com/philhanna/stack v1.5.0 h1:GAKwXfNxNPjv6MIDZAoFOTFMKt2wj+63iDpjyz8tapQ=
|
||||||
|
github.com/philhanna/stack v1.5.0/go.mod h1:w5LpFSK/gkZQdRXU5xvDcvyvVD5VmyfZ3FNZAVmih2s=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/objx v0.4.0/go.mod h1:YvHI0jy2hoMjB+UWwv71VJQ9isScKT/TqJzVSSt89Yw=
|
||||||
|
github.com/stretchr/objx v0.5.0/go.mod h1:Yh+to48EsGEfYuaHDzXPcE3xhTkx73EhmCGUpEOglKo=
|
||||||
|
github.com/stretchr/testify v1.7.1/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
github.com/stretchr/testify v1.8.0/go.mod h1:yNjHg4UonilssWZ8iaSj1OCr/vHnekPRkoO+kdMU+MU=
|
||||||
|
github.com/stretchr/testify v1.8.2 h1:+h33VjcLVPDHtOdpUCuF+7gSuG3yGIftsP1YvFihtJ8=
|
||||||
|
github.com/stretchr/testify v1.8.2/go.mod h1:w2LPCIKwWwSfY2zedu0+kehJoqGctiVI29o6fzry7u4=
|
||||||
|
golang.org/x/exp v0.0.0-20221208152030-732eee02a75a h1:4iLhBPcpqFmylhnkbY3W0ONLUYYkDAW9xMFLfxgsvCw=
|
||||||
|
golang.org/x/exp v0.0.0-20221208152030-732eee02a75a/go.mod h1:CxIveKay+FTh1D0yPZemJVgC/95VzuuOLq5Qi4xnoYc=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405 h1:yhCVgyC4o1eVCa2tZl7eS0r+SDo693bJlVdllGtEeKM=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
|
gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA=
|
||||||
|
gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
||||||
122
2022/go/main.go
Normal file
122
2022/go/main.go
Normal file
@@ -0,0 +1,122 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
// "math/rand"
|
||||||
|
"os"
|
||||||
|
// "strings"
|
||||||
|
// "time"
|
||||||
|
|
||||||
|
"adventofcode2022/utils"
|
||||||
|
"adventofcode2022/day01"
|
||||||
|
"adventofcode2022/day02"
|
||||||
|
"adventofcode2022/day03"
|
||||||
|
"adventofcode2022/day04"
|
||||||
|
"adventofcode2022/day05"
|
||||||
|
"adventofcode2022/day06"
|
||||||
|
"adventofcode2022/day07"
|
||||||
|
"adventofcode2022/day08"
|
||||||
|
"adventofcode2022/day09"
|
||||||
|
"adventofcode2022/day10"
|
||||||
|
|
||||||
|
)
|
||||||
|
|
||||||
|
// Usage: go run main.go <NN>
|
||||||
|
// assumes input is in day<NN>/input.txt
|
||||||
|
func main() {
|
||||||
|
d := day()
|
||||||
|
fmt.Printf("Running day %02d\n", d)
|
||||||
|
|
||||||
|
switch d {
|
||||||
|
case 1:
|
||||||
|
fmt.Printf("part 1: %d\n", day01.Part1(utils.Readfile(d)))
|
||||||
|
fmt.Printf("part 2: %d\n", day01.Part2(utils.Readfile(d)))
|
||||||
|
case 2:
|
||||||
|
fmt.Printf("part 1: %d\n", day02.Part1(utils.Readfile(d)))
|
||||||
|
fmt.Printf("part 2: %d\n", day02.Part2(utils.Readfile(d)))
|
||||||
|
case 3:
|
||||||
|
fmt.Printf("part 1: %d\n", day03.Part1(utils.Readfile(d)))
|
||||||
|
fmt.Printf("part 2: %d\n", day03.Part2(utils.Readfile(d)))
|
||||||
|
case 4:
|
||||||
|
fmt.Printf("part 1: %d\n", day04.Part1(utils.Readfile(d)))
|
||||||
|
fmt.Printf("part 2: %d\n", day04.Part2(utils.Readfile(d)))
|
||||||
|
case 5:
|
||||||
|
fmt.Printf("part 1: %s\n", day05.Part1(utils.Readfile(d)))
|
||||||
|
fmt.Printf("part 2: %s\n", day05.Part2(utils.Readfile(d)))
|
||||||
|
case 6:
|
||||||
|
fmt.Printf("part 1: %d\n", day06.Part1(utils.Readfile(d)))
|
||||||
|
fmt.Printf("part 2: %d\n", day06.Part2(utils.Readfile(d)))
|
||||||
|
case 7:
|
||||||
|
fmt.Printf("part 1: %d\n", day07.Part1(utils.Readfile(d)))
|
||||||
|
fmt.Printf("part 2: %d\n", day07.Part2(utils.Readfile(d)))
|
||||||
|
case 8:
|
||||||
|
fmt.Printf("part 1: %d\n", day08.Part1(utils.Readfile(d)))
|
||||||
|
fmt.Printf("part 2: %d\n", day08.Part2(utils.Readfile(d)))
|
||||||
|
case 9:
|
||||||
|
fmt.Printf("part 1: %d\n", day09.Part1(utils.Readfile(d)))
|
||||||
|
fmt.Printf("part 2: %d\n", day09.Part2(utils.Readfile(d)))
|
||||||
|
case 10:
|
||||||
|
fmt.Printf("part 1: %d\n", day10.Part1(utils.Readfile(d)))
|
||||||
|
fmt.Printf("part 2: %s\n", day10.Part2(utils.Readfile(d)))
|
||||||
|
default:
|
||||||
|
panic(fmt.Errorf("no such day: %d", d))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Reads day from os.Args.
|
||||||
|
func day() int {
|
||||||
|
latest := 9
|
||||||
|
if len(os.Args) == 1 {
|
||||||
|
return latest
|
||||||
|
}
|
||||||
|
|
||||||
|
if os.Args[1] == "next" {
|
||||||
|
genNext(latest + 1)
|
||||||
|
os.Exit(0)
|
||||||
|
}
|
||||||
|
day := utils.MustAtoi(os.Args[1])
|
||||||
|
return day
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
func genNext(n int) {
|
||||||
|
os.Mkdir(fmt.Sprintf("day%02d", n), 0755)
|
||||||
|
f, err := os.Create(fmt.Sprintf("day%02d/day%02d.go", n, n))
|
||||||
|
utils.PanicOnErr(err)
|
||||||
|
defer f.Close()
|
||||||
|
f.WriteString(fmt.Sprintf(`package day%02d
|
||||||
|
|
||||||
|
func Part1(input string) int {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
|
||||||
|
func Part2(input string) int {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
`, n))
|
||||||
|
fmt.Printf("wrote day%02d/day%02d.go\n", n, n)
|
||||||
|
|
||||||
|
f, err = os.Create(fmt.Sprintf("day%02d/day%02d_test.go", n, n))
|
||||||
|
utils.PanicOnErr(err)
|
||||||
|
defer f.Close()
|
||||||
|
f.WriteString(fmt.Sprintf(`package day%02d
|
||||||
|
|
||||||
|
import (
|
||||||
|
"testing"
|
||||||
|
|
||||||
|
"github.com/stretchr/testify/require"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPart1(t *testing.T) {
|
||||||
|
r := Part1("")
|
||||||
|
require.Equal(t, 0, r)
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestPart2(t *testing.T) {
|
||||||
|
r := Part2("")
|
||||||
|
require.Equal(t, 0, r)
|
||||||
|
}
|
||||||
|
`, n))
|
||||||
|
fmt.Printf("wrote day%02d/day%02d_test.go\n", n, n)
|
||||||
|
|
||||||
|
}
|
||||||
74
2022/go/utils/grid2d/grid2d.go
Normal file
74
2022/go/utils/grid2d/grid2d.go
Normal file
@@ -0,0 +1,74 @@
|
|||||||
|
package grid2d
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"adventofcode2022/utils"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Grid[T any] struct {
|
||||||
|
sizeX, sizeY int
|
||||||
|
matrix [][]T
|
||||||
|
empty T
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewGrid[T any](sizeX, sizeY int, empty T) *Grid[T] {
|
||||||
|
matrix := make([][]T, sizeY)
|
||||||
|
rows := make([]T, sizeX*sizeY)
|
||||||
|
for i := 0; i < sizeX*sizeY; i++ {
|
||||||
|
rows[i] = empty
|
||||||
|
}
|
||||||
|
|
||||||
|
j := 0
|
||||||
|
for i := 0; i < sizeY; i++ {
|
||||||
|
matrix[i] = rows[j : j+sizeX : j+sizeX]
|
||||||
|
j += sizeX
|
||||||
|
}
|
||||||
|
return &Grid[T]{
|
||||||
|
sizeX: sizeX,
|
||||||
|
sizeY: sizeY,
|
||||||
|
matrix: matrix,
|
||||||
|
empty: empty,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *Grid[T]) SizeX() int {
|
||||||
|
return g.sizeX
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *Grid[T]) SizeY() int {
|
||||||
|
return g.sizeY
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *Grid[T]) Get(x, y int) T {
|
||||||
|
if x < 0 || x >= g.sizeX {
|
||||||
|
return g.empty
|
||||||
|
}
|
||||||
|
if y < 0 || y >= g.sizeY {
|
||||||
|
return g.empty
|
||||||
|
}
|
||||||
|
return g.matrix[y][x]
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *Grid[T]) Set(x, y int, v T) {
|
||||||
|
if x < 0 || x >= g.sizeX {
|
||||||
|
panic("invalid x")
|
||||||
|
}
|
||||||
|
if y < 0 || y >= g.sizeY {
|
||||||
|
panic("invalid y")
|
||||||
|
}
|
||||||
|
g.matrix[y][x] = v
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *Grid[T]) StringWithFormatter(formatter func(T, int, int) string) string {
|
||||||
|
var r strings.Builder
|
||||||
|
for j := 0; j < g.sizeY; j++ {
|
||||||
|
for i := 0; i < g.sizeX; i++ {
|
||||||
|
_, err := r.WriteString(formatter(g.matrix[j][i], i, j))
|
||||||
|
utils.PanicOnErr(err)
|
||||||
|
}
|
||||||
|
_, err := r.WriteRune('\n')
|
||||||
|
utils.PanicOnErr(err)
|
||||||
|
}
|
||||||
|
return r.String()
|
||||||
|
}
|
||||||
45
2022/go/utils/inputs/inputs.go
Normal file
45
2022/go/utils/inputs/inputs.go
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
package inputs
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"adventofcode2022/utils"
|
||||||
|
"adventofcode2022/utils/grid2d"
|
||||||
|
sparsegrid "adventofcode2022/utils/sparseGrid"
|
||||||
|
)
|
||||||
|
|
||||||
|
func ToInts(input string, sep string) []int {
|
||||||
|
var r []int
|
||||||
|
for _, line := range strings.Split(input, sep) {
|
||||||
|
if line != "" {
|
||||||
|
r = append(r, utils.MustAtoi(line))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return r
|
||||||
|
}
|
||||||
|
|
||||||
|
func ToGrid2D[T any](input, rowSep, colSep string, empty T, conv func(string) T) *grid2d.Grid[T] {
|
||||||
|
lines := strings.Split(input, rowSep)
|
||||||
|
|
||||||
|
grid := grid2d.NewGrid(len(lines[0]), len(lines), empty)
|
||||||
|
for y, line := range lines {
|
||||||
|
for x, v := range strings.Split(line, colSep) {
|
||||||
|
grid.Set(x, y, conv(v))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return grid
|
||||||
|
}
|
||||||
|
|
||||||
|
func ToSparseGrid[T comparable](input, rowSep, colSep string, empty T, conv func(string) T) *sparsegrid.SparseGrid[T] {
|
||||||
|
lines := strings.Split(input, rowSep)
|
||||||
|
|
||||||
|
grid := sparsegrid.NewGrid(empty)
|
||||||
|
for y, line := range lines {
|
||||||
|
for x, v := range strings.Split(line, colSep) {
|
||||||
|
grid.Set(x, y, conv(v))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return grid
|
||||||
|
}
|
||||||
81
2022/go/utils/sparseGrid/sparseGrid.go
Normal file
81
2022/go/utils/sparseGrid/sparseGrid.go
Normal file
@@ -0,0 +1,81 @@
|
|||||||
|
package sparsegrid
|
||||||
|
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"adventofcode2022/utils"
|
||||||
|
)
|
||||||
|
|
||||||
|
type SparseGrid[T comparable] struct {
|
||||||
|
minX, maxX, minY, maxY int
|
||||||
|
data map[string]T
|
||||||
|
empty T
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewGrid[T comparable](empty T) *SparseGrid[T] {
|
||||||
|
return &SparseGrid[T]{
|
||||||
|
minX: utils.MaxInt,
|
||||||
|
maxX: utils.MinInt,
|
||||||
|
minY: utils.MaxInt,
|
||||||
|
maxY: utils.MinInt,
|
||||||
|
data: map[string]T{},
|
||||||
|
empty: empty,
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *SparseGrid[T]) SizeX() (int, int) {
|
||||||
|
return g.minX, g.maxX
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *SparseGrid[T]) SizeY() (int, int) {
|
||||||
|
return g.minY, g.maxY
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *SparseGrid[T]) Visited() int {
|
||||||
|
return len(g.data)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *SparseGrid[T]) Get(x, y int) T {
|
||||||
|
k := key(x, y)
|
||||||
|
v, ok := g.data[k]
|
||||||
|
if !ok {
|
||||||
|
return g.empty
|
||||||
|
}
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *SparseGrid[T]) Set(x, y int, v T) {
|
||||||
|
k := key(x, y)
|
||||||
|
current, ok := g.data[k]
|
||||||
|
if ok && v == current {
|
||||||
|
return
|
||||||
|
} else if !ok && v == g.empty {
|
||||||
|
return
|
||||||
|
} else if v == g.empty {
|
||||||
|
delete(g.data, k)
|
||||||
|
} else {
|
||||||
|
g.data[k] = v
|
||||||
|
g.minX = utils.Min(g.minX, x)
|
||||||
|
g.maxX = utils.Max(g.maxX, x)
|
||||||
|
g.minY = utils.Min(g.minY, y)
|
||||||
|
g.maxY = utils.Max(g.maxY, y)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func (g *SparseGrid[T]) StringWithFormatter(formatter func(T, int, int) string) string {
|
||||||
|
var r strings.Builder
|
||||||
|
for j := g.minY; j <= g.maxY; j++ {
|
||||||
|
for i := g.minX; i <= g.maxX; i++ {
|
||||||
|
_, err := r.WriteString(formatter(g.Get(i, j), i, j))
|
||||||
|
utils.PanicOnErr(err)
|
||||||
|
}
|
||||||
|
_, err := r.WriteRune('\n')
|
||||||
|
utils.PanicOnErr(err)
|
||||||
|
}
|
||||||
|
return r.String()
|
||||||
|
}
|
||||||
|
|
||||||
|
func key(x, y int) string {
|
||||||
|
return fmt.Sprintf("%d:%d", x, y)
|
||||||
|
}
|
||||||
207
2022/go/utils/utils.go
Normal file
207
2022/go/utils/utils.go
Normal file
@@ -0,0 +1,207 @@
|
|||||||
|
package utils
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"fmt"
|
||||||
|
"io"
|
||||||
|
"os"
|
||||||
|
"reflect"
|
||||||
|
"regexp"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
"golang.org/x/exp/constraints"
|
||||||
|
)
|
||||||
|
|
||||||
|
func PanicOnErr(err error) {
|
||||||
|
if err != nil {
|
||||||
|
panic(err)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const MaxInt = int(^uint(0) >> 1)
|
||||||
|
const MinInt = ^MaxInt
|
||||||
|
|
||||||
|
func Max[T constraints.Ordered](a, b T) T {
|
||||||
|
if a > b {
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
func Min[T constraints.Ordered](a, b T) T {
|
||||||
|
if a < b {
|
||||||
|
return a
|
||||||
|
}
|
||||||
|
return b
|
||||||
|
}
|
||||||
|
|
||||||
|
func SliceMinMax[T constraints.Ordered](slice []T) (*T, *T) {
|
||||||
|
if len(slice) == 0 {
|
||||||
|
return nil, nil
|
||||||
|
}
|
||||||
|
min := &slice[0]
|
||||||
|
max := &slice[0]
|
||||||
|
for i, v := range slice {
|
||||||
|
if v < *min {
|
||||||
|
min = &slice[i]
|
||||||
|
}
|
||||||
|
if v > *max {
|
||||||
|
max = &slice[i]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return min, max
|
||||||
|
}
|
||||||
|
|
||||||
|
func MustAtoi(s string) int {
|
||||||
|
v, err := strconv.Atoi(s)
|
||||||
|
PanicOnErr(err)
|
||||||
|
return v
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns key from map[T]int which has the max value
|
||||||
|
func MapFindMax(m interface{}) interface{} {
|
||||||
|
var maxK interface{} = nil
|
||||||
|
var maxV = MinInt
|
||||||
|
iter := reflect.ValueOf(m).MapRange()
|
||||||
|
for iter.Next() {
|
||||||
|
k := iter.Key()
|
||||||
|
v := int(iter.Value().Int())
|
||||||
|
if v > maxV {
|
||||||
|
maxV = v
|
||||||
|
maxK = k.Interface()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return maxK
|
||||||
|
}
|
||||||
|
|
||||||
|
// Returns key from map[T]int which has the min value
|
||||||
|
func MapFindMin(m interface{}) interface{} {
|
||||||
|
var minK interface{} = nil
|
||||||
|
var minV = MaxInt
|
||||||
|
iter := reflect.ValueOf(m).MapRange()
|
||||||
|
for iter.Next() {
|
||||||
|
k := iter.Key()
|
||||||
|
v := int(iter.Value().Int())
|
||||||
|
if v < minV {
|
||||||
|
minV = v
|
||||||
|
minK = k.Interface()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return minK
|
||||||
|
}
|
||||||
|
|
||||||
|
func Readfile(day int) string {
|
||||||
|
filename := fmt.Sprintf("day%02d/input.txt", day)
|
||||||
|
file, err := os.Open(filename)
|
||||||
|
PanicOnErr(err)
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
reader := bufio.NewReader(file)
|
||||||
|
contents, err := io.ReadAll(reader)
|
||||||
|
PanicOnErr(err)
|
||||||
|
|
||||||
|
return strings.TrimSuffix(string(contents), "\n")
|
||||||
|
}
|
||||||
|
|
||||||
|
func ParseToStruct(re *regexp.Regexp, input string, target interface{}) bool {
|
||||||
|
m := re.FindStringSubmatch(input)
|
||||||
|
if m == nil {
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
var useOffset bool
|
||||||
|
|
||||||
|
for i, name := range re.SubexpNames() {
|
||||||
|
if i == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
var field reflect.Value
|
||||||
|
if name == "" {
|
||||||
|
// use offset
|
||||||
|
if i == 1 {
|
||||||
|
useOffset = true
|
||||||
|
} else if !useOffset {
|
||||||
|
panic("can't mix named and unnamed subexpressions")
|
||||||
|
}
|
||||||
|
field = reflect.ValueOf(target).Elem().Field(i - 1)
|
||||||
|
} else {
|
||||||
|
// use name
|
||||||
|
if i == 1 {
|
||||||
|
useOffset = false
|
||||||
|
} else if useOffset {
|
||||||
|
panic("can't mix named and unnamed subexpressions")
|
||||||
|
}
|
||||||
|
field = reflect.ValueOf(target).Elem().FieldByName(name)
|
||||||
|
}
|
||||||
|
if field.Kind() == reflect.String {
|
||||||
|
field.SetString(m[i])
|
||||||
|
} else if field.Kind() == reflect.Int {
|
||||||
|
v, err := strconv.Atoi(m[i])
|
||||||
|
PanicOnErr(err)
|
||||||
|
field.SetInt(int64(v))
|
||||||
|
} else if field.Kind() == reflect.Uint8 {
|
||||||
|
if len(m[i]) != 1 {
|
||||||
|
panic(fmt.Sprintf("expecting 1 char, got: %s", m[i]))
|
||||||
|
}
|
||||||
|
field.SetUint(uint64(m[i][0]))
|
||||||
|
} else {
|
||||||
|
panic(fmt.Sprintf("unknown kind: %s", field.Kind()))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
|
||||||
|
func MustParseToStruct(re *regexp.Regexp, input string, target interface{}) {
|
||||||
|
if !ParseToStruct(re, input, target) {
|
||||||
|
panic(fmt.Errorf("failed to parse: %s", input))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func CharToLower(c byte) byte {
|
||||||
|
return strings.ToLower(string(c))[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
func CharToUpper(c byte) byte {
|
||||||
|
return strings.ToUpper(string(c))[0]
|
||||||
|
}
|
||||||
|
|
||||||
|
func Contains(haystack []string, needle string) bool {
|
||||||
|
for _, s := range haystack {
|
||||||
|
if s == needle {
|
||||||
|
return true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false
|
||||||
|
}
|
||||||
|
|
||||||
|
func Abs[T constraints.Signed](x T) T {
|
||||||
|
if x < 0 {
|
||||||
|
return -x
|
||||||
|
}
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
|
||||||
|
func Gcd(x, y int) int {
|
||||||
|
if x <= 0 || y <= 0 {
|
||||||
|
panic(fmt.Errorf("invalid input: %d, %d", x, y))
|
||||||
|
}
|
||||||
|
if x == y {
|
||||||
|
return x
|
||||||
|
}
|
||||||
|
if x > y {
|
||||||
|
return Gcd(x-y, y)
|
||||||
|
} else {
|
||||||
|
return Gcd(x, y-x)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func Sign[T constraints.Signed](x T) int {
|
||||||
|
if x < 0 {
|
||||||
|
return -1
|
||||||
|
} else if x > 0 {
|
||||||
|
return 1
|
||||||
|
} else {
|
||||||
|
return 0
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user