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