re-organise repo

This commit is contained in:
2023-11-16 10:48:53 +00:00
parent f62c52d8a9
commit f133e157a1
87 changed files with 11792 additions and 0 deletions

44
2022/go/day01/day01.go Normal file
View 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
}

View 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

File diff suppressed because it is too large Load Diff

89
2022/go/day02/day02.go Normal file
View 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}

View 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

File diff suppressed because it is too large Load Diff

54
2022/go/day03/day03.go Normal file
View 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
}

View 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
View 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
View 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
}

View 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

File diff suppressed because it is too large Load Diff

93
2022/go/day05/day05.go Normal file
View 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
}

View 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
View 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
View 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
}

View 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
View File

@@ -0,0 +1 @@
srjsssgppnssqzszmzjmjdmmqwqcwqccslsjswjssgbsgsnggqtqnnjznndtndnhddfldfdsfswsjsjjptjpttlwlccpnpgngcncnscncsnnwrwmwggsgdgssvbsstzsstqqrjqqlsqlsqscschhclhccznzcnnzzqppjbpjjqzzbwbqqzdqdjjqtjtbtgtqgtgdgwwsjjbwjjzssrsvsttgqtgglgplgpllcrcncssbrbgrbrllsqlsltthshrrnddwzdzdbbrppdvdqvvpvdvdsslbbmnbnjjrdrnntzzftzftttrsshpspvvrzzqzwzhzszbzjjwqwvqqglgflfwfrfprpddfvdffhzztwtppwwwztzsznzmnnbvbbtqqdhqdqdfffnjnmnlmljmlmnlnddzbbdgdqdnqqtjjtnthttvwwtrwwwgffqcfchfcfwcczhhgjhghpgpwgwffhghzghhtftntnnmlnmlmddqbbfwbfwbwvvfssrggptpltpllbcbzczzlccjgcgvcczjzvvvdtvdvqdqwdqdvdjvddjfdjjqmmfgfsftfzfwzwzfftmfmmqdqccjqcqwwflwlccpssvzzzbnbjnbjjgtgpttbwbrbwrwvrrwccgrgrvvpjvvznvvhddtdldpldppmlplltdllhqhpqhqqbpptgpgjgqjgjffvfdvdttsrsllhzlzrrdrnrjrddqbbjrrvrsstgsttjqjhjbhhnmndmmnrmnnrggmtgmmhshjjfqjjtqtstpstppggtzzrsrwwqffvzvzvqqggqsqtstszttpvtvvvddcncvncvchhnsnpsnnlmnnmqnqjjfwfccmwmbwbswbswwghhzrrptptbbjbtjjgdjgjrgrwgwlglblbnlnbbwnnpbnbmbtmtvvhjjlwlhhszslldwlwdllhjhghqghhqpplhhtjhhnhqhlhjhmmlhlmmrpptvvcczfcccwgcccpgpspdpccfhchffbjbzzwppfbbstbtltpllcssnnctnnqcqhhclhccvlvlffnjjwbwfbfttwvvdvnnnsrstrtmtfthtzzcvzvhzzpmpfpmmmwggdbdqdbbjnbbdqbbrnnnprrwbbcwbbpjjprjjzzvwwvrrthhqvhvnhhzmzszrszsjssclcjjbhjbhjbhjbjhhzbbzttnrnssrbrjbrjjmsmffdlflfzfbzzmtztdthdhldhlddnccgbbmtbbsbzsbzzcsszpzfffprfpfzfrzzhvhffsmmqtjwgjbzhnmrslrmgfjpqcllcgsjdhrshqtlgmqqtfmswfzwtnrswtzdjzclcfmltqgdhcsgvzrdltgfbtqclpppvbqnbqmlhmdbsjbwbdllzpnrwfhmnlgvdwsdjsznnhqzhwntjvcpzdrfwmwwdrttdvzspmbmqggmlmsvwgcjgpvcmplqwfjgpghnfpbctnfhcgngcbdmzhlpcnjpmczzsgfgrdftrzgvmmpdmgcrpcdrjsgczpfjnwpdjpntdngdjwctvcbsjmfwvtsrlhvpswppmfwrwzsbsgbjvljzqjjldmnqnmwsmqnmhmqhhttppbpqlvdcvdbhmbnjzztjrdjdzlvmbdrghtftwdpcwwblsjbgnzwtpztmtmnrpsvzfzncqmrvhcbqcvqvnlngdcllrqlbhjttnmjmhfhdzmjmplcfdqpmwblzsnmpczwcnggcwdvgnjcrrtmpwwqdqpvtbzpdbfnbfcfllntqjlslcsznjvzvsbntrtzwhcbtdmbmwttvhdvdtvrcmprcrrjlgsqddrsmwsrbtbpjrmlbrnsdrjfhjnqjtgjmhzjbjnprvmhtjcdbztwqmrlfflfmcslshtwmwhgvbdslgjhzjlglhllsdphlzngjfwfrlwpnqfhghnqhzhgrszbcwjvlrtmshntszsqplvfbccjwctgtfmqgqjdlgdbwhgvctqtcgfdwvqdwqzddmsbrpftzpqztgzbnplvhftmgpdthnrdhqbltbrmhpcqsfccmqzwmrbnbgbjspslwpjhdqspssqdtnssmjmvzwwfstgzzjrmfczdlznwqpdhbsjqddvffcgfhfdqdrlwcsgcsszdtpqbbsthpwbhdfzmgmcdggfcwcmzfjnfbzbccjhvwhbwfslnqnrwhgrwtlnmrmncnjtbjbdlmqsczppgbcmsdrwlrpjbgrmnhqqfhhsdhmdmpvvpjrnzsvzctmqhpzcvcjfgtlfvqvnvlnprmgrsvrrvtjfndqfsvqdsfbcwlbglmfhfhcfgqdfmclnzhdtppgzzsqgjqncqrbdhlhdjqwjpmbdnfmgdgwbwmnlngnmrhcgqwzvmbjzdvsspjwwdtpnvpftdlqlzfgtscfczsvbrtrqqpgqlvmrtddqplbzsswbgpdzpqfvqpqbndblghmdhmnctdnjbgglmrlvmrmsfgntfdwvqcvvlvbcnwrctvjqhmnsjqccwltbfqpqpmwsfvmnnfqmlmlcchqcdtbvqwcpptvfwrwtbdrlsgnwpmjgnwlprzqjlwqmtmjglbrzlgfbsghwqdmwhrcmfwdmzmflsbngtgndftdpzsqvgqdsfdhplmfcmwpbtvcdmpghmfwqjvhdhfpmbrqpvnbhlftgdtprlztrgnlcldfpjqjqdfrvqtcnzrtjcgzgsslzghlnfhwwjwzdsmpsczclrfmnqjvfmvsqpntsnnnlrfswqtrppzhqgjzlzvrrbhhfhchhvgztpgctcsgssvttszsrdwzwrbmwmspgqhmmfnzqqdbmnbltdmrsvqgddltwczbbjcmplncspgqgmzrndhttsrbvqbpbvhshfqrpqgmmdbhmmtccjcmntmpqhrvhnfnlqqbctsnfzjbphhqwmztgbhqqlbctbsfcszbggzrlcdhwddtjgtqhppzgjsqcddwjsngjrcdflmgwgfnzhjtcwgbqvpwmpgcpdwvqgswwfzcnjgmdpffmqczmsqgpthpmsjlwnrcbzrfshvwftzllwrmfccmlpjnmpjdfpcvjgjpznllmqjwpcflgqgdljtbbjvjlvhhmtvzfnjfnnwrvtlfdbhqphrjghtmlsrplqscsnvjvqdslsbsfzzrjfmchplzgjgdqvzhfphvsjfvnqlgmjfzhrdlmmvfntnzdvrnwqshsmtjnqmwzgpbbzszrsqcvlzjwnmgjhmfqrbvgmfqpswctmvpfcghvdqgstglmzvpfhzfzvhqqdmvrvrttlpwwhqgddzqlrvvdffqtznvlfgjhhmvbmtzjqnnhqzrtbzpqcwpngrdcndcgzwhzgtfwbmwbrpvvczczhwcqwsqzqbqvqftcswtcbzdbpccjhtwbpnwlwwwqwscptlwshrdbmmdcgrmpnnwgjwzszwwdwctfspbfqvdjqtrflshrqlbfgpnrmbszwjpcdzbggphgplcgvwljprzmtncsvfwqchttndhpnzmtdvtjqtcsddtqvcmztmjgwqvjhflrjjtnvfpjrnlvzvwvrpbhrzslmrqqzqhnzqnvtqppmncddphbwwsjczmphsrlltzndtqjgdlqgpnlfcvwntstmrgcrjzmmllpwldnwmwzpvzctmhszspcvtgnqthszzsmtdnzwtfddfctpjhscbqgwfpqmzpvqrzvtbrdjzrqprdgbpmzzfbgqcvcdtsfrffcpqwtvdwvtcqlcsdrzntgrhrspznndslmnvptlphpdqgbblfhmgbpmmfwqzlhvzshhpzgfjldqclngbcbrmmnqqvqmwdnjsglsggqfgjldqfbsqgtrwmpdffqlcwwlfhlpqfgwtssnjwzhgvtwqzmhmgwzwmcggmpmrzqrcsmflqsrbnzvdmjcdbnscstqrqhvddsbjpzwsvzswqhcqmgzlvfcnzjrrffzphmrvdbhqbrwpsfqvfqwhqhcgfvfsfttzcdsrjgjwcgvhllszmplmvgczqsbfldnbvrnqccbprjjdwhmqpdjjrnfdlhzdvlfmrldjlqclbjrrtjfsflphzdcdpfpr

112
2022/go/day07/day07.go Normal file
View 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
}
}

View 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

File diff suppressed because it is too large Load Diff

89
2022/go/day08/day08.go Normal file
View 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
}

View 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
View 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
View 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")
}
}

View 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

File diff suppressed because it is too large Load Diff

77
2022/go/day10/day10.go Normal file
View 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
View 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
View 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
View 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
View 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
View 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)
}

View 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()
}

View 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
}

View 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
View 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
}
}