Started 2022 with go
This commit is contained in:
parent
567c8487b5
commit
7098b525f0
93
2022/go/01/answer.go
Normal file
93
2022/go/01/answer.go
Normal file
@ -0,0 +1,93 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"fmt"
|
||||||
|
"os"
|
||||||
|
"sort"
|
||||||
|
"strconv"
|
||||||
|
|
||||||
|
log "github.com/sirupsen/logrus"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Input struct {
|
||||||
|
calories [][]int
|
||||||
|
}
|
||||||
|
|
||||||
|
func input(filename string) *Input {
|
||||||
|
file, err := os.Open(filename)
|
||||||
|
check(err, fmt.Sprintf("Couldn't open %q", filename))
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
input := &Input{}
|
||||||
|
input.calories = append(input.calories, make([]int, 0))
|
||||||
|
|
||||||
|
scanner := bufio.NewScanner(file)
|
||||||
|
|
||||||
|
scanner.Split(bufio.ScanLines)
|
||||||
|
|
||||||
|
for scanner.Scan() {
|
||||||
|
var line string = scanner.Text()
|
||||||
|
if len(line) == 0 {
|
||||||
|
input.calories = append(input.calories, make([]int, 0))
|
||||||
|
} else {
|
||||||
|
cal, err := strconv.Atoi(line)
|
||||||
|
check(err, fmt.Sprintf("Couldn't convert %q to int", line))
|
||||||
|
input.calories[len(input.calories)-1] = append(input.calories[len(input.calories)-1], cal)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return input
|
||||||
|
}
|
||||||
|
|
||||||
|
func map_slice[S, T any](ss []S, mapper func(S) T) []T {
|
||||||
|
var ret []T = make([]T, 0, len(ss))
|
||||||
|
for _, s := range ss {
|
||||||
|
ret = append(ret, mapper(s))
|
||||||
|
}
|
||||||
|
return ret
|
||||||
|
}
|
||||||
|
|
||||||
|
func max(arr []int) int {
|
||||||
|
var max int = 0
|
||||||
|
for _, e := range arr {
|
||||||
|
if e > max {
|
||||||
|
max = e
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return max
|
||||||
|
}
|
||||||
|
|
||||||
|
func sum(arr []int) int {
|
||||||
|
res := 0
|
||||||
|
for _, e := range arr {
|
||||||
|
res += e
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
func result(inp *Input, part int8) string {
|
||||||
|
var res string
|
||||||
|
if part == 1 {
|
||||||
|
var max int = max(
|
||||||
|
map_slice(inp.calories, func(s []int) int { return sum(s) }),
|
||||||
|
)
|
||||||
|
res = fmt.Sprint(max)
|
||||||
|
} else {
|
||||||
|
sums := map_slice(inp.calories, func(s []int) int { return sum(s) })
|
||||||
|
sort.Ints(sums)
|
||||||
|
res = fmt.Sprint(sum(sums[len(sums)-3:]))
|
||||||
|
}
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
func check(e error, message string) {
|
||||||
|
if e != nil {
|
||||||
|
log.Error(message)
|
||||||
|
panic(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
fmt.Println(result(input("sample1"), 1))
|
||||||
|
}
|
44
2022/go/01/answer_test.go
Normal file
44
2022/go/01/answer_test.go
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestInputSample1(t *testing.T) {
|
||||||
|
filename := "sample1"
|
||||||
|
expected := &Input{
|
||||||
|
calories: [][]int{
|
||||||
|
{1000, 2000, 3000},
|
||||||
|
{4000},
|
||||||
|
{5000, 6000},
|
||||||
|
{7000, 8000, 9000},
|
||||||
|
{10000},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
var got *Input = input(filename)
|
||||||
|
|
||||||
|
if !reflect.DeepEqual(*got, *expected) {
|
||||||
|
t.Errorf("input(%q) = %v, want %v", filename, got, expected)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestResult(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
part int8
|
||||||
|
filename string
|
||||||
|
expected string
|
||||||
|
}{
|
||||||
|
{1, "sample1", "24000"},
|
||||||
|
{1, "input", "71924"},
|
||||||
|
{2, "sample1", "45000"},
|
||||||
|
{2, "input", "210406"},
|
||||||
|
}
|
||||||
|
for _, test := range tests {
|
||||||
|
var got string = result(input(test.filename), test.part)
|
||||||
|
|
||||||
|
if got != test.expected {
|
||||||
|
t.Errorf("result = %q, want %q", got, test.expected)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
7
2022/go/01/go.mod
Normal file
7
2022/go/01/go.mod
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
module aoc/1
|
||||||
|
|
||||||
|
go 1.20
|
||||||
|
|
||||||
|
require github.com/sirupsen/logrus v1.9.3
|
||||||
|
|
||||||
|
require golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 // indirect
|
15
2022/go/01/go.sum
Normal file
15
2022/go/01/go.sum
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
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/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
|
||||||
|
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
|
||||||
|
github.com/sirupsen/logrus v1.9.3 h1:dueUQJ1C2q9oE3F7wvmSGAaVtTmUizReu6fjN8uqzbQ=
|
||||||
|
github.com/sirupsen/logrus v1.9.3/go.mod h1:naHLuLoDiP4jHNo9R0sCBMtWGeIprob74mVsIT4qYEQ=
|
||||||
|
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
|
||||||
|
github.com/stretchr/testify v1.7.0 h1:nwc3DEeHmmLAfoZucVR881uASk0Mfjw8xYJ99tb5CcY=
|
||||||
|
github.com/stretchr/testify v1.7.0/go.mod h1:6Fq8oRcR53rry900zMqJjRRixrwX3KX962/h/Wwjteg=
|
||||||
|
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8 h1:0A+M6Uqn+Eje4kHMK80dtF3JCXC4ykBgQG4Fe06QRhQ=
|
||||||
|
golang.org/x/sys v0.0.0-20220715151400-c0bba94af5f8/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg=
|
||||||
|
gopkg.in/check.v1 v0.0.0-20161208181325-20d25e280405/go.mod h1:Co6ibVJAznAaIkqp8huTwlJQCZ016jof/cbN4VW5Yz0=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c h1:dUUwHk2QECo/6vqA44rthZ8ie2QXMNeKRTHCNY2nXvo=
|
||||||
|
gopkg.in/yaml.v3 v3.0.0-20200313102051-9f266ea9e77c/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=
|
2251
2022/go/01/input
Normal file
2251
2022/go/01/input
Normal file
File diff suppressed because it is too large
Load Diff
14
2022/go/01/sample1
Normal file
14
2022/go/01/sample1
Normal file
@ -0,0 +1,14 @@
|
|||||||
|
1000
|
||||||
|
2000
|
||||||
|
3000
|
||||||
|
|
||||||
|
4000
|
||||||
|
|
||||||
|
5000
|
||||||
|
6000
|
||||||
|
|
||||||
|
7000
|
||||||
|
8000
|
||||||
|
9000
|
||||||
|
|
||||||
|
10000
|
91
2022/go/02/answer.go
Normal file
91
2022/go/02/answer.go
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
ROCK int = iota
|
||||||
|
PAPER
|
||||||
|
SCISSOR
|
||||||
|
)
|
||||||
|
|
||||||
|
const (
|
||||||
|
LOSS int = 3 * iota
|
||||||
|
DRAW
|
||||||
|
WIN
|
||||||
|
)
|
||||||
|
|
||||||
|
type Turn struct {
|
||||||
|
them int
|
||||||
|
me int
|
||||||
|
}
|
||||||
|
type Input struct {
|
||||||
|
turns []Turn
|
||||||
|
}
|
||||||
|
|
||||||
|
var str_to_RPS = map[string]int{
|
||||||
|
"A": ROCK,
|
||||||
|
"B": PAPER,
|
||||||
|
"C": SCISSOR,
|
||||||
|
|
||||||
|
"X": ROCK,
|
||||||
|
"Y": PAPER,
|
||||||
|
"Z": SCISSOR,
|
||||||
|
}
|
||||||
|
|
||||||
|
func input(filename string) *Input {
|
||||||
|
file, err := os.Open(filename)
|
||||||
|
check(err)
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
input := &Input{
|
||||||
|
turns: []Turn{},
|
||||||
|
}
|
||||||
|
|
||||||
|
scanner := bufio.NewScanner(file)
|
||||||
|
|
||||||
|
scanner.Split(bufio.ScanLines)
|
||||||
|
|
||||||
|
for scanner.Scan() {
|
||||||
|
line := scanner.Text()
|
||||||
|
hands := strings.Split(line, " ")
|
||||||
|
input.turns = append(input.turns, Turn{str_to_RPS[hands[0]], str_to_RPS[hands[1]]})
|
||||||
|
}
|
||||||
|
|
||||||
|
return input
|
||||||
|
}
|
||||||
|
|
||||||
|
func result(inp *Input, part int8) string {
|
||||||
|
var res string
|
||||||
|
score := 0
|
||||||
|
for _, turn := range inp.turns {
|
||||||
|
score += turn.me + 1
|
||||||
|
if turn.me == (turn.them+1)%3 {
|
||||||
|
score += WIN
|
||||||
|
} else if turn.me == turn.them {
|
||||||
|
score += DRAW
|
||||||
|
}
|
||||||
|
}
|
||||||
|
res = fmt.Sprint(score)
|
||||||
|
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
func check(e error) {
|
||||||
|
if e != nil {
|
||||||
|
panic(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
result := result(input("sample1"), 1)
|
||||||
|
log.SetFlags(log.Lshortfile)
|
||||||
|
|
||||||
|
log.Println(result)
|
||||||
|
fmt.Println(result)
|
||||||
|
}
|
44
2022/go/02/answer_test.go
Normal file
44
2022/go/02/answer_test.go
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestInputSample1(t *testing.T) {
|
||||||
|
filename := "sample1"
|
||||||
|
expected := &Input{
|
||||||
|
turns: []Turn{
|
||||||
|
{ROCK, PAPER},
|
||||||
|
{PAPER, ROCK},
|
||||||
|
{SCISSOR, SCISSOR},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
var got *Input = input(filename)
|
||||||
|
|
||||||
|
if !reflect.DeepEqual(expected, got) {
|
||||||
|
t.Errorf("input(%q) = %v, want %v", filename, got, expected)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestResult(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
part int8
|
||||||
|
filename string
|
||||||
|
expected string
|
||||||
|
}{
|
||||||
|
{1, "sample1", "15"},
|
||||||
|
{1, "input", "12855"},
|
||||||
|
|
||||||
|
// {2, "sample1", ""},
|
||||||
|
// {2, "input", ""},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range tests {
|
||||||
|
var got string = result(input(test.filename), test.part)
|
||||||
|
|
||||||
|
if got != test.expected {
|
||||||
|
t.Errorf("result = %q, want %q", got, test.expected)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
3
2022/go/02/go.mod
Normal file
3
2022/go/02/go.mod
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
module aoc/2
|
||||||
|
|
||||||
|
go 1.20
|
0
2022/go/02/go.sum
Normal file
0
2022/go/02/go.sum
Normal file
2500
2022/go/02/input
Normal file
2500
2022/go/02/input
Normal file
File diff suppressed because it is too large
Load Diff
3
2022/go/02/sample1
Normal file
3
2022/go/02/sample1
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
A Y
|
||||||
|
B X
|
||||||
|
C Z
|
95
2022/go/03/answer.go
Normal file
95
2022/go/03/answer.go
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Sack struct {
|
||||||
|
first string
|
||||||
|
second string
|
||||||
|
}
|
||||||
|
type Input struct {
|
||||||
|
sacks []Sack
|
||||||
|
}
|
||||||
|
|
||||||
|
func input(filename string) *Input {
|
||||||
|
file, err := os.Open(filename)
|
||||||
|
check(err)
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
input := &Input{
|
||||||
|
sacks: []Sack{},
|
||||||
|
}
|
||||||
|
|
||||||
|
scanner := bufio.NewScanner(file)
|
||||||
|
|
||||||
|
scanner.Split(bufio.ScanLines)
|
||||||
|
|
||||||
|
for scanner.Scan() {
|
||||||
|
line := strings.Trim(scanner.Text(), "\n")
|
||||||
|
input.sacks = append(input.sacks, Sack{
|
||||||
|
line[:len(line)/2],
|
||||||
|
line[len(line)/2:],
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
return input
|
||||||
|
}
|
||||||
|
|
||||||
|
func priority(c rune) int {
|
||||||
|
score := 0
|
||||||
|
if c >= 'a' && c <= 'z' {
|
||||||
|
score += int(c-'a') + 1
|
||||||
|
} else if c >= 'A' && c <= 'Z' {
|
||||||
|
score += int(c-'A') + 27
|
||||||
|
}
|
||||||
|
return score
|
||||||
|
}
|
||||||
|
|
||||||
|
func result(inp *Input, part int8) string {
|
||||||
|
var res string
|
||||||
|
|
||||||
|
score := 0
|
||||||
|
if part == 1 {
|
||||||
|
for _, sack := range inp.sacks {
|
||||||
|
for _, char := range sack.first {
|
||||||
|
if strings.Contains(sack.second, string(char)) {
|
||||||
|
score += priority(char)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
for i := 0; i < len(inp.sacks); i += 3 {
|
||||||
|
sack := inp.sacks[i]
|
||||||
|
for _, char := range sack.first + sack.second {
|
||||||
|
if strings.Contains(inp.sacks[i+1].first+inp.sacks[i+1].second, string(char)) &&
|
||||||
|
strings.Contains(inp.sacks[i+2].first+inp.sacks[i+2].second, string(char)) {
|
||||||
|
score += priority(char)
|
||||||
|
break
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
res = fmt.Sprint(score)
|
||||||
|
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
func check(e error) {
|
||||||
|
if e != nil {
|
||||||
|
panic(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
result := result(input("sample1"), 1)
|
||||||
|
|
||||||
|
log.Println(result)
|
||||||
|
fmt.Println(result)
|
||||||
|
}
|
71
2022/go/03/answer_test.go
Normal file
71
2022/go/03/answer_test.go
Normal file
@ -0,0 +1,71 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestPriority(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
c rune
|
||||||
|
expected int
|
||||||
|
}{
|
||||||
|
{'a', 1},
|
||||||
|
{'b', 2},
|
||||||
|
{'p', 16},
|
||||||
|
{'L', 38},
|
||||||
|
{'P', 42},
|
||||||
|
{'v', 22},
|
||||||
|
{'t', 20},
|
||||||
|
{'s', 19},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range tests {
|
||||||
|
var got int = priority(test.c)
|
||||||
|
|
||||||
|
if got != test.expected {
|
||||||
|
t.Errorf("priority(%q) = %v, want %v", test.c, got, test.expected)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestInputSample1(t *testing.T) {
|
||||||
|
filename := "sample1"
|
||||||
|
expected := &Input{
|
||||||
|
sacks: []Sack{
|
||||||
|
{"vJrwpWtwJgWr", "hcsFMMfFFhFp"},
|
||||||
|
{"jqHRNqRjqzjGDLGL", "rsFMfFZSrLrFZsSL"},
|
||||||
|
{"PmmdzqPrV", "vPwwTWBwg"},
|
||||||
|
{"wMqvLMZHhHMvwLH", "jbvcjnnSBnvTQFn"},
|
||||||
|
{"ttgJtRGJ", "QctTZtZT"},
|
||||||
|
{"CrZsJsPPZsGz", "wwsLwLmpwMDw"},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
var got *Input = input(filename)
|
||||||
|
|
||||||
|
if !reflect.DeepEqual(expected, got) {
|
||||||
|
t.Errorf("input(%q) = %v, want %v", filename, got, expected)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestResult(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
part int8
|
||||||
|
filename string
|
||||||
|
expected string
|
||||||
|
}{
|
||||||
|
{1, "sample1", "157"},
|
||||||
|
{1, "input", "7727"},
|
||||||
|
|
||||||
|
{2, "sample1", "70"},
|
||||||
|
{2, "input", "2609"},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range tests {
|
||||||
|
var got string = result(input(test.filename), test.part)
|
||||||
|
|
||||||
|
if got != test.expected {
|
||||||
|
t.Errorf("result = %q, want %q", got, test.expected)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
3
2022/go/03/go.mod
Normal file
3
2022/go/03/go.mod
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
module aoc/3
|
||||||
|
|
||||||
|
go 1.20
|
300
2022/go/03/input
Normal file
300
2022/go/03/input
Normal file
@ -0,0 +1,300 @@
|
|||||||
|
wgqJtbJMqZVTwWPZZT
|
||||||
|
LHcTGHQhzrTzBsZFPHFZWFFs
|
||||||
|
RnLRClzGzRGLGLGCNRjTMjJfgmffSffMqNgp
|
||||||
|
WPLgsfLmLgqZvZgSRR
|
||||||
|
RbwHdbDdQFFFMvvMjbhqhZZS
|
||||||
|
lzTdldBDszfGcRsr
|
||||||
|
ZjnhJjMjnbdnbHdFLmmfFLmnCCWFFl
|
||||||
|
PpNwtRsNsZSsRwCfzQQBfQszCBsC
|
||||||
|
PpwcqqVZRtbggggjcgJJ
|
||||||
|
ntczBcVcgnHzgBHnVntcBBFhgsmmmssqWNWNWqLvNhsqTN
|
||||||
|
bSSGdSDZbGSGdDmLmGTvTGmLFFhm
|
||||||
|
PlFbDpJDPbPdPbZQZDZlSCDBfMVRwBzBtBQzfzRHVMVRtH
|
||||||
|
fDVrmmrvcmCcVpfcfGlswpPwsttMpjJMPPjjtP
|
||||||
|
RgSTdndFLbJqqPssWWjPWjPjHS
|
||||||
|
FqgzQnTqJRRQqLLhTCDhDCDmcmlvvlhcVm
|
||||||
|
nnqVtHbfVHZVmtlvmHtZtrFSFTRRFhRccTbrLsLSGr
|
||||||
|
cCNJQJPJQgjjMQdDrGGsRhTFGFRFSpMS
|
||||||
|
gzdCwWdjNPgzcJgjwdZtVlHHmvvmZlvffHnz
|
||||||
|
FFgsgwNwWvggQsMWDwvQQvQcccdcJZDtJGBtVGGGtcVlzt
|
||||||
|
rjfTrbjpjRSRTbTpzldjjHBtJGBdltJG
|
||||||
|
RbrPTfpCfmbpmnfRRCvMvQWNBwFFgMsgBL
|
||||||
|
zzLHgjjjdFHWbGBjjzcbgQRmSvqsSpmRsRSQSmRMWv
|
||||||
|
ZfJVrwPhZhZlhQQqBSQSNSqM
|
||||||
|
tnCfrDCltfPzHFFLBgngHz
|
||||||
|
DCpwrrMhwCrCMVCpGFqpVDnWWTWBtnTWvWfvbbTdFWRv
|
||||||
|
lmhhcsQPmTtTnnPBTB
|
||||||
|
QmcjNJsJzHNljZsNqDCGGhwqCqhgDDZV
|
||||||
|
hLfRnSLfhcndCCPfJJjzJfzt
|
||||||
|
pHNWwDpGGNJBZjjNNj
|
||||||
|
gmgwwHpWTpmGDmDTggqHmmDSsnnhvcqScdVVSVcjLrRcnq
|
||||||
|
CdlTJgnQJVCllNVWTPZBmPPGhGRmghPRGs
|
||||||
|
wHDrSwtHbmhRvHVZ
|
||||||
|
DzzwrtVFjLNnMTCTLCWW
|
||||||
|
SppdsnGpNVnZZZLPMlMPGq
|
||||||
|
mdcfvTTbBddLJgZJLlcFqJ
|
||||||
|
fzTvfwjjfzzCbvvjvQjWvNHVNNVWrRtdnVNppNprDp
|
||||||
|
lmlCGTmNbZlbSFlbNGfnzWfWzCdWWfVdwRCf
|
||||||
|
jDHtHHvLjQtqrsqpjBBLprRzwfwJfzzhRnczhWQVwzVR
|
||||||
|
rqpPtpPjDqpqDLtLrPGGFSFgPlNZZSGMPnMZ
|
||||||
|
pSHShqgSMzVpphFnJMFMBtssdjRJ
|
||||||
|
PZDbZfmCDgDfDNQPwCflCQNJsjRBRBFsdBWBsJRjsbsFJF
|
||||||
|
DQvCwwZrPPlffDmQCDwZQPmPhqVTcGhSHSLTpSGhLHzpGghr
|
||||||
|
gPqgqqmmmPgsqvGmsMCCnfZZfvBpWZhVrrZdHBvH
|
||||||
|
TSlcttTjRTDlDDTRhZVdrHHpWVnfVrtd
|
||||||
|
SFJzFzcJjcRJwGGqJMMCwW
|
||||||
|
gzWNLSjRLzlNqqQMLhvQccGGmcQm
|
||||||
|
fFrttPdTFTrpVwGpbdVQQp
|
||||||
|
HnTBGfHTGzWWqCqngn
|
||||||
|
SddrLdVpjjVSgRBszFswzwlV
|
||||||
|
mtPMbMqPMvqHHHDTTglBvsFshFFg
|
||||||
|
bmBHbtPctMtbMNMtbPtPqHmMjpdZdcJGrjSWWZGjJZnjndWj
|
||||||
|
nljWJHRHGrDcMBbDLZHV
|
||||||
|
wdvwmhghhbtBMcLtwZ
|
||||||
|
gvQvvghTfPSmpmQljGFRjQbFGCsJbC
|
||||||
|
BmphBWmDBBQfpVgQZpjg
|
||||||
|
rqqGrrrqlnqqHqjNnVDSSSgQQffj
|
||||||
|
FqLrbsLFsbLbLqHlMrmwwPDcCmMMmJBwDJcC
|
||||||
|
wZccfslqZPFFjrFbFfQQ
|
||||||
|
vvTvVWCJJZVBWCSvnVJJrhjQVMjVjzbgMQbjpphh
|
||||||
|
BBmNWBvZRvSqwsGwssPcmc
|
||||||
|
LGpnfcnzfzQdNFNHqHJptq
|
||||||
|
RBNNvZSBRbRCCDJqHrDZqHFZtw
|
||||||
|
SRNhRsNhWSNWsRRvgjngQnnMTnTgQjGMff
|
||||||
|
twtZmwqBHtmqnnmlGLfcfvQQ
|
||||||
|
dgMSPSMdQGclRRdF
|
||||||
|
pVMrDgThDDlPWPWbBZtZqqttBqjqjT
|
||||||
|
PPSWCGSzpCCQwNsNPFhTNVbB
|
||||||
|
vqcgJngqLLcZLvBhNTVlbsvdFF
|
||||||
|
DDmHgRjHZhHtGfWpQH
|
||||||
|
sBLbwWWBvsBsqLqStRjcGGRnggjGcntJDn
|
||||||
|
NCMQPMQPMQNzGGRRgRJRGzcG
|
||||||
|
dHQNfPCFTQfFfVVNvwwJvSWSqWqrSqdS
|
||||||
|
prDBnnDpFDprnDPBDQBvpBZttcSqSZSZcScFJSHcZJtz
|
||||||
|
VhMVdLsjdqVWJSWZZZcHst
|
||||||
|
hLVdGLfqjGjlfhCfCLjTTmrlpQBPBmvnrgDgpp
|
||||||
|
SSSTJmmgbGwtmRZHCCZRCH
|
||||||
|
FWcPQrrWqflzSWpRHZCZHRSt
|
||||||
|
PSQzzdcQTghdndDJ
|
||||||
|
cLlrNPvljRhRgTlM
|
||||||
|
VmDBGnVdmJDnDBndnnVwDRvMgRsTbTzMMsgZghzzsB
|
||||||
|
SpHvmGnSDJnwvDQqfrCPLpPLCfpF
|
||||||
|
PppbRCCgpzzQCgCSgZTlNNTWnNNDNlRnGl
|
||||||
|
hwMhLtBcBdjjNzWzlclcNGTs
|
||||||
|
FjJFHJwhfwLHMLJLwPmqfQPgVCmQgCmCzC
|
||||||
|
jTtMqFjMBqBmTntTztBTnTZBRZRLpLJgDgJNhghJrNNhhLJh
|
||||||
|
DCDdvdGsVDVsflVdQSsfSwhRJlgppgpRpbWLgJbJpgbR
|
||||||
|
wfSHSsdSVvQSwfwQPQPqHtFDcMzmtjBntqMTqn
|
||||||
|
HQhQWLCSHCSCjnjQdSJdCSQgTTmZPTVZmqnTpPtnpmRmpp
|
||||||
|
vDrzhvGzfchvlGvMFMrqVqPgZVVtZtVRgZgm
|
||||||
|
bcvMfwvDsDfbvfwDbbdhCShWCBLLJWjHsHjj
|
||||||
|
zLSsJNCjsjLCNLCgGcwBPPdwBwqwqz
|
||||||
|
WMFZprZDbrddWRVRRDvlPPBcPhhlBqqHPGPhhffg
|
||||||
|
VdbFvZWWWZZDFTLtCmNntjTnLSnn
|
||||||
|
JLVhhwRbhVwcLFJFhhJcccqwsvpRlllvpWvZSBSSSRsNWpzl
|
||||||
|
jgzfPffgZNspgZQS
|
||||||
|
fjCmDCGnfmTfFqrFnhqbFzqt
|
||||||
|
SfMRRNHSNNLfRfHcRRsqwdCCsssTqBCvgBLv
|
||||||
|
llDDWQnFGtQnmtGQDWQFsgdHVBddndHsgqTsCTsg
|
||||||
|
GzGjpWmWbmQmbpGGmGjHSrZcMfZSRPJPfcMRcb
|
||||||
|
PDdMdRTRrLDSwzJvfSvJ
|
||||||
|
FnjQnsqsFTnStvplhhzzFS
|
||||||
|
TBHHCsgVRRcMHbLR
|
||||||
|
GcLdGBJvBvLJHccJBvqHpGzDFfzwfzjwhDwrSFpfpDSn
|
||||||
|
mZZrTTQVmQmlsMPVblZQVZmfCwjzzjChzCCbDSzhFjfnSb
|
||||||
|
gZlRlZNPlmlgTTPmNRvJWcqrNLdvHWLBcHtH
|
||||||
|
jWWbBwgwWwwtvvSCtHvgWsMFmscHzTGMmcssGFTTGz
|
||||||
|
ZrLtpLnlfQJqnfJtpLnZlrqdNNGqcDNNFFTNDzzMMTMsMNMs
|
||||||
|
LJQrnZnfLZnlrZflJJRVRQbbwBgCtCVjWgjBjjgbPjBB
|
||||||
|
fqQVfRqSqmpnlLnm
|
||||||
|
jFcjMJTjhwwggjFtgzCHmCzCmGzGlzpn
|
||||||
|
wstMFFjWDfQRvmDPSB
|
||||||
|
PgTFGPgcBZPcHPFBZRjGPgwCnmwCsmSdQdThmMMMQCQS
|
||||||
|
JbpvWtvfHblWDHJDzmndSdMQnSwCdhMdQD
|
||||||
|
rfvWlLlbtfJvvLJpqWbbqZRRGPVFNHVFgZNVFBgH
|
||||||
|
TRMrrGBLMLPtbssTGtBHwZmdQQbdNzzZZNZZdwjd
|
||||||
|
CVlVhCnclvhWSFFfQrWNrjmpNfwmjZ
|
||||||
|
rlqFlclChhCvnlDvgVvRRtPtqTGJHRMBRTPPqM
|
||||||
|
gZzCrQGQdrQvZHPTHWDbTgWPJM
|
||||||
|
nSpLlcnnVjsSVLLnLSnhLSsJPTTWFsqfbPMFMqJDbfqM
|
||||||
|
VwwnpwLnlPdQCwPPCC
|
||||||
|
lRlrnlrsrMlhVsRnVhGPvCFNcPBDBvccrCGr
|
||||||
|
RZQTzWTRdDNvBDdNcC
|
||||||
|
TqjZbWRHmlMJgnmsng
|
||||||
|
scQmLfQBQQvvZfLsmmvDJwpgSNSDDdcJSSwTGD
|
||||||
|
PHlMbtzCCnlbztMRzlPNNdNwGpDpwgwptNLGpw
|
||||||
|
rRHnLbhCzbbCHnHjMbzzjzFZmfQqWZQqvmhmfVZmqFBW
|
||||||
|
fLTQWTMQtjcCGCJCbf
|
||||||
|
gGsmsVSzmjCFHJCJgg
|
||||||
|
SPRsSwSvBsPRPsqzwSVqzmhVWtLWhTDNLlTDtLTWGpNMtDLt
|
||||||
|
mbzRbchRRQzzssLdhLggLddJ
|
||||||
|
DCqDNNNWvDvjcPLsJcLLdv
|
||||||
|
cpFCVNnVBHtbfFRtMRFf
|
||||||
|
PFRcCCPtsDDDtjVspgwmgTNpTgTpspsw
|
||||||
|
BqqqdJdHdMgSfMmZpZND
|
||||||
|
vDHJGdLbLzBJdGnDdrBqVtCzWPPhthtPFzzPCFtV
|
||||||
|
HvhvHdFdvJDfHdZdpfhrmGPljPRrGPPVDGrWWC
|
||||||
|
NMMsRBMzcRRMMBSzcnbmNGrCVCWrCqPClmPqlG
|
||||||
|
zLBbwMzQnRSQMThtZFLvpdgHtJfF
|
||||||
|
DpcJcJPmMcLSHHZCfpnH
|
||||||
|
BsBFvvqTFlbhgdbBBblfZLCLzfHWfjnjLCnCrh
|
||||||
|
dTsNgqFvNgsGlZJRtVtMPmtDmG
|
||||||
|
LdGQqzPGCCjJTJdTLJQJtFcFRSctcrFNFltPFtcc
|
||||||
|
HphMMbbMdBMHbBhhgHMnhvwFFvtrlSNRNgcRllcvcc
|
||||||
|
spHMhBnHnnsmWdnsnMBMdVGGmzjzLmZLDQCCCCZjqjTD
|
||||||
|
DDZMzcTRgDMLzqCffhfWfcWnfj
|
||||||
|
NsHVVJmswwSSwNPPNjnhqhnCCnhNvjfTnv
|
||||||
|
rSSddrGSGrlMrpTpQT
|
||||||
|
bbbfCfrLHMMMWVWC
|
||||||
|
SqsvNZqQvvqcjNvqZsMMwgFgFplTHQVRFgWH
|
||||||
|
BSZWWqBZBjmPGJGLbBtf
|
||||||
|
RNCNfzfRHmzHwSdRdGfzRJPqFcFcDFGccZZqtLtGLtgl
|
||||||
|
pjhVMhvhbjvPcDJvcZqt
|
||||||
|
bsQMTsjppmSdTnHSJH
|
||||||
|
PtLwpSwdSJwQnGvvqtvMhZ
|
||||||
|
TlFcHlTjVjsDTQnCQhbZGCVVnb
|
||||||
|
cjljTslTrlzzHDNRfNgLSNBJfBwNfG
|
||||||
|
HvsZZqqqwWZswWHTmHsvvfhSfBfDffjchfBbhD
|
||||||
|
MCpnCVpQClRNnlNQVQClfDhScmjBfLhmLDGbBNbS
|
||||||
|
gmtpJpQQllJnWdZWwJWFwJJT
|
||||||
|
TzBvBwwdhgRPGHlRHh
|
||||||
|
NLWttJsrLWttppLpsGlsmVbVGRljGDRgjV
|
||||||
|
MlllnNFnnQqCdzqq
|
||||||
|
vptzrJhMMGGMptJPhJGJPvdFTFcSsTBVsczBScTSFFfn
|
||||||
|
gbRjWgRjCqjZnfHCHnTSVBHF
|
||||||
|
mRwqNbmqlbbjqRNlLbNrDJntNDGtDhNpGMrpvJ
|
||||||
|
GPWZLgWqLHHGbgbbGPPmqHqfcjjRHJJBDRBRjBBjMHjwvwQc
|
||||||
|
dhpFSpzVSSMSlDBvMQ
|
||||||
|
TndsVNztVTspnsdpshtmZLPCGGNPfgqbWWfDGb
|
||||||
|
CbqDjjCdClqgrfJvrv
|
||||||
|
NGNPtGGzzHztPWWnlgJvfBnWBFgp
|
||||||
|
hGzNHhsmGccwHPHZHcwdCCdbTVRTvSmTCjbLCb
|
||||||
|
sqnqsHGpJbqnrbshpshHmmmCWZZmWwfTjTjHmfLZ
|
||||||
|
dPggRgSDDttMFgctgdDtDcDcRWJBmjTWwmRLBLfmwBBjZWTB
|
||||||
|
PFcVPlJPglbqhhrnnlNz
|
||||||
|
wZdDNDdPPfhqwWqbsF
|
||||||
|
VTngRzpnzMLvzTCLlhvDfltqqDttqFqs
|
||||||
|
mggTVpCDDSNjBmPZrd
|
||||||
|
cSdqJSTTTJcSJpCdQbqTCPPdjdDtGzwzjDwjwwwwzD
|
||||||
|
rVvsBBVgsVBhHhfljtgbPgGtWjPtwt
|
||||||
|
fvHsVZHVnRHpSJJRmbbSLT
|
||||||
|
lDDPRRjwLGlvVRDRPlwwwPvmpSfhVWSzhqfzqpHpVpVHfqSH
|
||||||
|
qBnqBNsBBChhCSfZ
|
||||||
|
nTQbQnNNQJTLvlmTPLqqmG
|
||||||
|
TTCJhDrmDpRVhvhHfffwzwfz
|
||||||
|
dmmdmglWcqvHvWsHzB
|
||||||
|
gdQMZbtlgQlZcMSttCNmVVrLSTTJ
|
||||||
|
PLZLqhZZzZLBjjjGrrPjMH
|
||||||
|
CcQcCcfRlWDjdrMrBrHC
|
||||||
|
WlWFMcFpcRFmsWFcmflqSJzTqzwLvshggsZJwz
|
||||||
|
LgqRDDDHHGTpgpJrQrQhhhCqrwPw
|
||||||
|
ZSBWjjFshCFlQDrJ
|
||||||
|
SjWnnbWtWnsztgGDDbDTGgHHGp
|
||||||
|
llfvMlvzjzGzGRfvMSGRfSdStrCtQNCZrrFdJJLnNtLZ
|
||||||
|
shhhshPHsTTqsBHTVTwTwZZnCtQrQnJtQCCJBCCZdZ
|
||||||
|
TPHTPTHmDnljplfpGfGm
|
||||||
|
qcNTmvvSvTNrWhRrTdthzW
|
||||||
|
bDVJphpMMJwJpMHtrrttWsgwtzRW
|
||||||
|
bFpGJbllPfplVQmnhvvcSmCFqq
|
||||||
|
GTPJGMQTPQMqZjHTBmnndBVddHrrzNrz
|
||||||
|
bbcRFgDpptRbffwmzmrvLmcZvmLmLv
|
||||||
|
WCwgWbpgwtgfpfMlQGPhSPZWTZPl
|
||||||
|
DsPCswsMPBMwPDCVJPnTPPWFGJNJmbJW
|
||||||
|
RvvddfvftdtvNzghGSbFnWTntJSttGbG
|
||||||
|
LNgRddgRlgzcgCDjjjHjcBCwcM
|
||||||
|
gnVtgBnpwBgShBgcwhJJhjCMMMDmLRjDRMjrDMMMDMqMRF
|
||||||
|
slsblHPNHlbTNbsPvszHQWbzqrZLMRmFMFmdFmrtDFdMLNZD
|
||||||
|
bPzfvbfsvvlHtlzPHllHGTlTppCJpgcngcpwnwCGGJnnShwV
|
||||||
|
cgQRgtzDbHPcgHzQWpTjTLdjjNNpNLsDss
|
||||||
|
nwccZBmwcJqmJnjsTvmlTSsdlTNs
|
||||||
|
CCGFCBVrBwwGBhqVnZBrqWMMQzHfQcHzzzPtfztGfg
|
||||||
|
lhnwnhlbgbngbcfDgJLJQqDdVd
|
||||||
|
FSrvtMFZVJJJVtcq
|
||||||
|
jZNNNNjmjSPjFTJmGGzswwzHwHpBsbPblhhW
|
||||||
|
tnDWHntzDtzQBZLMLzNLDDcRFFjhJBmcFRCTjRchcRvT
|
||||||
|
sqwsPlbGfSbPGSVbJfpjjhcTFmCRjjvmTTvRdw
|
||||||
|
lJqSqPVbgGSGrVSqJqflbWZQNDMLHnrQQWNDMtQMQz
|
||||||
|
lpltwwJqsWVLPtVt
|
||||||
|
DGHsDdZQzHLSLZcFRrFS
|
||||||
|
BGsGCnHmMlMwCfwT
|
||||||
|
nrRNzRMPrrPnNwNzTSFSTNtqZdtMttvQqQmjdjvZpgjZ
|
||||||
|
GWVhGcGhHhGcffbZGDmmtttQvpdtbpppdj
|
||||||
|
HGlHBhHGJfJJhCfZzLTTNnNrTnCNwT
|
||||||
|
jBpCZStjBwWrQCMrhw
|
||||||
|
TvcHBzHdPPzdvFTzzJlvzdQfThrhhrhfQTWMQfWMqfwf
|
||||||
|
bzGJJBJcJvdvBPFzddGgjZSbZZngRZNNnnsjRs
|
||||||
|
dqPqbpPFJfsFfMcNQNNtNmzrNQJn
|
||||||
|
VVBDWvwZWDLwGlDhLGWWVcmQtSNmLmtSdSSTmrcQQm
|
||||||
|
lZlhwDCdhhHllvWvjMHbgMpgffMggpPb
|
||||||
|
SWSFLLFWDSWDNFzmmLMfGlfsdfnJMBfwMGVnBf
|
||||||
|
vPtgZcctcTQQZRRcgCtZwRfqBVGqnVTBGVnqlsdBJnqV
|
||||||
|
RcjgwbbgNSbFbhDb
|
||||||
|
JrRZLrHvjQFPLnnBPQ
|
||||||
|
DhwbtHbzpcpFTgtQ
|
||||||
|
zlDwlHlzWSwDqhMMbSJVZVvrCrCZJZNZdJ
|
||||||
|
fgNCZSDtDfDZTrTfqWghQGzGQshgpGGFQg
|
||||||
|
RFvLnvFjnVjmLQGPQWLmWh
|
||||||
|
MdwwVMFbMdRHFbccbCZJtbDJrqqJZNJZCZ
|
||||||
|
fdZVBMMdfdfBCzhTzMdMCgCrGGrpQJmSmGJGmpJQVpLmqV
|
||||||
|
RbFnhNsvlDsFHttllGmqGpPLvJpmPJSqLL
|
||||||
|
tjNsDnNwbNjttNNZTzhMWzcZcMTwMd
|
||||||
|
DjSSMShjRjPCbDFCdCSDbpBBswfNWZBZZrBVBPNfVmVf
|
||||||
|
zltLjLqqGlzQntqqGztqcgncZrVrmNfNwWBVrVmrgwrfswsW
|
||||||
|
qcTqHLlnJzGznLJtHGhMbhjFhMMpFbpbThpp
|
||||||
|
ZVFZcctFQzsCtbZFnPPHqmqpwmvPmp
|
||||||
|
NrjGfMgcLLcfdLqpmRwRRqJJmdPw
|
||||||
|
LMNDgMBGlgGDLMNDGljctVbVWZTTCWChhTttsl
|
||||||
|
RMGRRhhgzgZMtHdGTtvDwDJFCDvvwdvwqFFv
|
||||||
|
rfrrjLNmmSnSjVSmNNPPbJVbqvqsqvhvFqCq
|
||||||
|
flrpnSlrSNfjrNjSphNSWlHRGzTgtQGHQtttBTRBRQHW
|
||||||
|
tplDDprhbvprvrJDprCpbsvHRfzSzTtzmRqSTznRRBRnSfFF
|
||||||
|
MVwWjVNVQGfcMnTmRnBm
|
||||||
|
VQwGLNLjWNWPGjZbsDBppBZhhDvBlZ
|
||||||
|
RVVrGVVchRZsnzRzBWZb
|
||||||
|
FQHWWCHwQmWmlqfCHSwJnsbNJnNsvttntBtb
|
||||||
|
QQSFgqgqLMLPPdWdMVhWDT
|
||||||
|
cZrMjncTdfJpPJbr
|
||||||
|
WHNqnQwwCwvlqHtCtHNslNlvLLPDfSVdVPVDVSfVSbftffVf
|
||||||
|
NCwwwQwllwnvgsvZzgzFZzBzjGGGMM
|
||||||
|
MvHpfzcTcZzpphhbsDSTStsltqSDtS
|
||||||
|
PRmnwCrWnWQrmNMRNnlNGbqlbDltdlbDtNtD
|
||||||
|
CRJnmRVWJfgMLvcz
|
||||||
|
HPFbHrrwLdVdgbDZqcphCqSZBhLZ
|
||||||
|
tQRfRRGtvTNNSGTMjjmDCRhmqpBChqhsRDZh
|
||||||
|
vjSfMzGQNQQnMtNTTWNNjgblFdFHwgdJJHHPwddgnr
|
||||||
|
BggPRVBPPgfCBmJTjTTqpTNpZBwMbr
|
||||||
|
lclLLllsQLFlsbMqNrMwTpwpcM
|
||||||
|
SvbDzSDbWFJfWPPgdnfR
|
||||||
|
GbpSSbGDNbSSJbDZNZbDppGtMntHLHvHCTLCJMHnRCMLTT
|
||||||
|
cdwddjBfPsmPPQqQqscnHgRMtngvtjjgCCTMzM
|
||||||
|
WvwPvWvflBwdQPlNVVhbDGpFhNGhbl
|
||||||
|
WZRGmRvpCRFTZMQQQMCdddDDcD
|
||||||
|
lqgqsgvjVtbMDzzbtcDQ
|
||||||
|
NsNNgjNNjsNhnSvRmnpGRmSTSG
|
||||||
|
nTgFtDTDDLrFBStdGdcHcbvGSc
|
||||||
|
QPzfPCMzWCjfMPJhWGlRbRWRWrRRdVVH
|
||||||
|
zhCrCQCjPrpNNBsNspNnwq
|
||||||
|
zTJpqFzbTzsWsVbbfLGfSSCDNSBCHfMLHG
|
||||||
|
rZcvtmhctrvmlPPmmmrhhmBLCHDCCLLDlqMlGMNDMwDC
|
||||||
|
rRhRhnnQPZhtZcZtdttZgqFWWVjssqQpppWpFpJW
|
||||||
|
NWPhdWJPWVzVqQrqmSsPbrPP
|
||||||
|
cZDRjGsffGsCDfffgjGgRQSrTcTmSlTrbnqmSSrlln
|
||||||
|
fFGCjGCjLDLFRgfDHZvzLVWtvsWWBtzJNWMB
|
||||||
|
qMVbtnmMMTpCppsR
|
||||||
|
NffHGrWzWWgDBfTRhChCnSCWcnjT
|
||||||
|
QrlQBPBrlPHrrQlrHFLqPnLvVvbVmVVJtq
|
||||||
|
MVMpHMZLVCpMrfWjvWnfrJ
|
||||||
|
hlblzDDzwlSlGtRhRlSdrfGGWnWWfFPjJjnfqWGF
|
||||||
|
lmlhBRlDhhhDRRhwDmBpHJmsNCHmCgNHJCJLsc
|
||||||
|
jvsLgmqLgHvbPPVbNjSCjC
|
||||||
|
pwTcRpRWLRMLJJFwBBGWcFWNVlDDCSTVttNPblZZCVVDlP
|
||||||
|
GcdhccpcpRpGRhGmfsHHzLQQHrmsnh
|
||||||
|
FMmSRgtMltMnVgnmNvlrsJrsZWjspvsZJp
|
||||||
|
QbdhqwqbNqdHbTdcbcpsrpvjfWfLJLfwJrWp
|
||||||
|
DQBBQqQGccdTPGqqBNtFGRSMRSFGtnVSnnmM
|
||||||
|
fPjGrfFrrprprdrbQPZwlcZwZmlJwH
|
||||||
|
qvNnvWnvWDvSvqNtWSLWStqbcJBQwQJwQZHLBZbcmJbblb
|
||||||
|
DMtvqSvvDtntCRfwzGCgdzzFjG
|
||||||
|
TfdZgtmfDgqgvlLFFsFHvcvZ
|
||||||
|
pphWQMVjQVVBWWjRlHlHnlcLDDhcnF
|
||||||
|
JQwwWVPBwMJpJwpWwGBWNzrDzSSzfgTPqTSTTtSPgt
|
6
2022/go/03/sample1
Normal file
6
2022/go/03/sample1
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
vJrwpWtwJgWrhcsFMMfFFhFp
|
||||||
|
jqHRNqRjqzjGDLGLrsFMfFZSrLrFZsSL
|
||||||
|
PmmdzqPrVvPwwTWBwg
|
||||||
|
wMqvLMZHhHMvwLHjbvcjnnSBnvTQFn
|
||||||
|
ttgJtRGJQctTZtZT
|
||||||
|
CrZsJsPPZsGzwwsLwLmpwMDw
|
90
2022/go/04/answer.go
Normal file
90
2022/go/04/answer.go
Normal file
@ -0,0 +1,90 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
"strconv"
|
||||||
|
"strings"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Range struct {
|
||||||
|
low, high int
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Range) contians(other *Range) bool {
|
||||||
|
return r.low <= other.low && other.high <= r.high
|
||||||
|
}
|
||||||
|
|
||||||
|
func (r *Range) overlaps(other *Range) bool {
|
||||||
|
return (r.low <= other.low && other.low <= r.high) ||
|
||||||
|
(r.low <= other.high && other.high <= r.high)
|
||||||
|
}
|
||||||
|
|
||||||
|
func fromString(s string) Range {
|
||||||
|
parts := strings.Split(s, "-")
|
||||||
|
low, err := strconv.Atoi(parts[0])
|
||||||
|
check(err, "Can't convert %q to int", parts[0])
|
||||||
|
high, err := strconv.Atoi(parts[1])
|
||||||
|
check(err, "Can't convert %q to int", parts[1])
|
||||||
|
return Range{low, high}
|
||||||
|
}
|
||||||
|
|
||||||
|
type Input struct {
|
||||||
|
ranges []struct{ a, b Range }
|
||||||
|
}
|
||||||
|
|
||||||
|
func input(filename string) *Input {
|
||||||
|
file, err := os.Open(filename)
|
||||||
|
check(err, "Couldn't open %q", filename)
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
input := &Input{}
|
||||||
|
|
||||||
|
scanner := bufio.NewScanner(file)
|
||||||
|
|
||||||
|
scanner.Split(bufio.ScanLines)
|
||||||
|
|
||||||
|
for scanner.Scan() {
|
||||||
|
line := scanner.Text()
|
||||||
|
sets := strings.Split(line, ",")
|
||||||
|
input.ranges = append(input.ranges, struct{ a, b Range }{fromString(sets[0]), fromString(sets[1])})
|
||||||
|
}
|
||||||
|
|
||||||
|
return input
|
||||||
|
}
|
||||||
|
|
||||||
|
func result(inp *Input, part int8) string {
|
||||||
|
var res string
|
||||||
|
score := 0
|
||||||
|
|
||||||
|
for _, pair := range inp.ranges {
|
||||||
|
if part == 1 {
|
||||||
|
if pair.a.contians(&pair.b) || pair.b.contians(&pair.a) {
|
||||||
|
score++
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if pair.a.overlaps(&pair.b) || pair.b.overlaps(&pair.a) {
|
||||||
|
score++
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
res = fmt.Sprint(score)
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
func check(e error, msg string, vals ...any) {
|
||||||
|
if e != nil {
|
||||||
|
log.Printf("ERROR: "+msg, vals)
|
||||||
|
panic(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
result := result(input("sample1"), 1)
|
||||||
|
|
||||||
|
log.Println(result)
|
||||||
|
fmt.Println(result)
|
||||||
|
}
|
47
2022/go/04/answer_test.go
Normal file
47
2022/go/04/answer_test.go
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestInputSample1(t *testing.T) {
|
||||||
|
filename := "sample1"
|
||||||
|
expected := &Input{
|
||||||
|
ranges: []struct{ a, b Range }{
|
||||||
|
{Range{2, 4}, Range{6, 8}},
|
||||||
|
{Range{2, 3}, Range{4, 5}},
|
||||||
|
{Range{5, 7}, Range{7, 9}},
|
||||||
|
{Range{2, 8}, Range{3, 7}},
|
||||||
|
{Range{6, 6}, Range{4, 6}},
|
||||||
|
{Range{2, 6}, Range{4, 8}},
|
||||||
|
},
|
||||||
|
}
|
||||||
|
var got *Input = input(filename)
|
||||||
|
|
||||||
|
if !reflect.DeepEqual(expected, got) {
|
||||||
|
t.Errorf("input(%q) = %v, want %v", filename, got, expected)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestResult(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
part int8
|
||||||
|
filename string
|
||||||
|
expected string
|
||||||
|
}{
|
||||||
|
{1, "sample1", "2"},
|
||||||
|
{1, "input", "530"},
|
||||||
|
|
||||||
|
{2, "sample1", "4"},
|
||||||
|
{2, "input", "903"},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range tests {
|
||||||
|
var got string = result(input(test.filename), test.part)
|
||||||
|
|
||||||
|
if got != test.expected {
|
||||||
|
t.Errorf("result = %q, want %q", got, test.expected)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
3
2022/go/04/go.mod
Normal file
3
2022/go/04/go.mod
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
module aoc/4
|
||||||
|
|
||||||
|
go 1.20
|
1000
2022/go/04/input
Normal file
1000
2022/go/04/input
Normal file
File diff suppressed because it is too large
Load Diff
6
2022/go/04/sample1
Normal file
6
2022/go/04/sample1
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
2-4,6-8
|
||||||
|
2-3,4-5
|
||||||
|
5-7,7-9
|
||||||
|
2-8,3-7
|
||||||
|
6-6,4-6
|
||||||
|
2-6,4-8
|
31
2022/go/Makefile
Normal file
31
2022/go/Makefile
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
COOKIE = 53616c7465645f5fb99dda36ae761920e1f0d561f3761dbaab58f2dcfe046a477f89881d95a683f92a0ac924a6e42c9ab614591a5716915c5de56fe977aa0881
|
||||||
|
|
||||||
|
.ONESHELL:
|
||||||
|
|
||||||
|
.PHONY = new create init get_input get_sample
|
||||||
|
NUMBER := $$(($(shell ls -D | grep "^[0-2][0-9]$$" | wc -l) + 1))
|
||||||
|
NUMBER_DIR := $(shell printf "%02d" $(NUMBER))
|
||||||
|
# NUMBER := $(shell ls -D | wc -l)
|
||||||
|
|
||||||
|
# https://adventofcode.com/2022/day/1/input
|
||||||
|
|
||||||
|
new: create init get_input get_sample
|
||||||
|
|
||||||
|
create:
|
||||||
|
@echo "Creating $(NUMBER)..."
|
||||||
|
@cp -r template/ $(NUMBER_DIR)/
|
||||||
|
|
||||||
|
init:
|
||||||
|
@echo "Initiliazing go module..."
|
||||||
|
@cd $(NUMBER_DIR)
|
||||||
|
@rm go.mod
|
||||||
|
@go mod init aoc/$(NUMBER)
|
||||||
|
@go mod tidy
|
||||||
|
|
||||||
|
get_input:
|
||||||
|
@echo "Getting input..."
|
||||||
|
@wget -q -O $(NUMBER_DIR)/input --header "Cookie: session=$(COOKIE)" https://adventofcode.com/2022/day/$(NUMBER)/input
|
||||||
|
|
||||||
|
get_sample:
|
||||||
|
@echo "Getting sample... Is it in your clipboard? I surely hope so..."
|
||||||
|
@xclip -o > $(NUMBER_DIR)/sample1
|
52
2022/go/template/answer.go
Normal file
52
2022/go/template/answer.go
Normal file
@ -0,0 +1,52 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"bufio"
|
||||||
|
"fmt"
|
||||||
|
"log"
|
||||||
|
"os"
|
||||||
|
)
|
||||||
|
|
||||||
|
type Input struct{}
|
||||||
|
|
||||||
|
func input(filename string) *Input {
|
||||||
|
file, err := os.Open(filename)
|
||||||
|
check(err, "Couldn't open %q", filename)
|
||||||
|
defer file.Close()
|
||||||
|
|
||||||
|
input := &Input{}
|
||||||
|
|
||||||
|
scanner := bufio.NewScanner(file)
|
||||||
|
|
||||||
|
scanner.Split(bufio.ScanLines)
|
||||||
|
|
||||||
|
for scanner.Scan() {
|
||||||
|
line := scanner.Text()
|
||||||
|
}
|
||||||
|
|
||||||
|
return input
|
||||||
|
}
|
||||||
|
|
||||||
|
func result(inp *Input, part int8) string {
|
||||||
|
var res string
|
||||||
|
|
||||||
|
if part == 1 {
|
||||||
|
} else {
|
||||||
|
}
|
||||||
|
|
||||||
|
return res
|
||||||
|
}
|
||||||
|
|
||||||
|
func check(e error, msg string, vals ...any) {
|
||||||
|
if e != nil {
|
||||||
|
log.Printf("ERROR: "+msg, vals)
|
||||||
|
panic(e)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func main() {
|
||||||
|
result := result(input("sample1"), 1)
|
||||||
|
|
||||||
|
log.Println(result)
|
||||||
|
fmt.Println(result)
|
||||||
|
}
|
38
2022/go/template/answer_test.go
Normal file
38
2022/go/template/answer_test.go
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
package main
|
||||||
|
|
||||||
|
import (
|
||||||
|
"reflect"
|
||||||
|
"testing"
|
||||||
|
)
|
||||||
|
|
||||||
|
func TestInputSample1(t *testing.T) {
|
||||||
|
filename := "sample1"
|
||||||
|
expected := &Input{}
|
||||||
|
var got *Input = input(filename)
|
||||||
|
|
||||||
|
if !reflect.DeepEqual(expected, got) {
|
||||||
|
t.Errorf("input(%q) = %v, want %v", filename, got, expected)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
func TestResult(t *testing.T) {
|
||||||
|
tests := []struct {
|
||||||
|
part int8
|
||||||
|
filename string
|
||||||
|
expected string
|
||||||
|
}{
|
||||||
|
{1, "sample1", ""},
|
||||||
|
{1, "input", ""},
|
||||||
|
|
||||||
|
// {2, "sample1", ""},
|
||||||
|
// {2, "input", ""},
|
||||||
|
}
|
||||||
|
|
||||||
|
for _, test := range tests {
|
||||||
|
var got string = result(input(test.filename), test.part)
|
||||||
|
|
||||||
|
if got != test.expected {
|
||||||
|
t.Errorf("result = %q, want %q", got, test.expected)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
3
2022/go/template/go.mod
Normal file
3
2022/go/template/go.mod
Normal file
@ -0,0 +1,3 @@
|
|||||||
|
module aoc/template
|
||||||
|
|
||||||
|
go 1.20
|
Loading…
Reference in New Issue
Block a user