Skip to content

Commit 17afb91

Browse files
authored
Merge pull request #5 from oleg-balunenko/day02
Day02
2 parents 4bae1ae + 2b2b36a commit 17afb91

File tree

196 files changed

+37160
-8484
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

196 files changed

+37160
-8484
lines changed

.golangci.yml

+1
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ linters:
22
enable-all: true
33
disable:
44
- gochecknoglobals
5+
- gochecknoinits
56

67
linters-settings:
78
errcheck:

cmd/aoc-cli/main.go

+58-13
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,12 @@ package main
33
import (
44
"flag"
55
"fmt"
6-
"log"
76
"os"
87
"path/filepath"
98
"strings"
109

10+
log "github.com/sirupsen/logrus"
11+
1112
"github.com/manifoldco/promptui"
1213
"github.com/pkg/errors"
1314

@@ -20,20 +21,51 @@ const (
2021
exit = "exit"
2122
)
2223

24+
var (
25+
logLevel = flag.String("log_level", "INFO", "Set level of output logs")
26+
)
27+
2328
func main() {
2429
defer func() {
2530
fmt.Println("Exiting...")
2631
}()
2732

33+
flag.Parse()
34+
2835
printVersion()
2936

30-
flag.Parse()
37+
setLogger()
3138

3239
if err := menu(); err != nil {
3340
log.Fatal(err)
3441
}
3542
}
3643

44+
func setLogger() {
45+
l, err := log.ParseLevel(*logLevel)
46+
if err != nil {
47+
l = log.InfoLevel
48+
}
49+
50+
log.SetLevel(l)
51+
52+
formatter := &log.TextFormatter{
53+
ForceColors: true,
54+
DisableColors: false,
55+
EnvironmentOverrideColors: false,
56+
DisableTimestamp: true,
57+
FullTimestamp: false,
58+
TimestampFormat: "",
59+
DisableSorting: false,
60+
SortingFunc: nil,
61+
DisableLevelTruncation: true,
62+
QuoteEmptyFields: true,
63+
FieldMap: nil,
64+
CallerPrettyfier: nil,
65+
}
66+
log.SetFormatter(formatter)
67+
}
68+
3769
func menu() error {
3870
path, err := inputPath()
3971
if err != nil {
@@ -49,7 +81,7 @@ func menu() error {
4981
prompt := promptui.Select{
5082
Label: "Puzzles menu (input 'exit' for exit)",
5183
Items: append(solvers, exit),
52-
Size: 0,
84+
Size: 20,
5385
IsVimMode: false,
5486
HideHelp: false,
5587
HideSelected: false,
@@ -62,19 +94,31 @@ func menu() error {
6294
Stdout: nil,
6395
}
6496

97+
return handleChoices(prompt, path)
98+
}
99+
100+
func handleChoices(opt promptui.Select, inputDir string) error {
65101
for {
66-
_, result, err := prompt.Run()
102+
_, choice, err := opt.Run()
67103
if err != nil {
68104
return errors.Wrap(err, "prompt failed")
69105
}
70106

71-
if isExit(result) {
107+
if isExit(choice) {
72108
return nil
73109
}
74110

75-
if err := run(result, path); err != nil {
76-
return errors.Wrap(err, "failed run puzzle")
111+
res, err := run(choice, inputDir)
112+
if err != nil {
113+
log.Error(err)
114+
continue
77115
}
116+
117+
log.WithFields(log.Fields{
118+
"name": res.Name,
119+
"part1": res.Part1,
120+
"part2": res.Part2,
121+
}).Info("Puzzle answers")
78122
}
79123
}
80124

@@ -115,19 +159,20 @@ func inputPath() (string, error) {
115159
return path, nil
116160
}
117161

118-
func run(puzzle string, inputdir string) error {
162+
func run(puzzle string, inputdir string) (puzzles.Result, error) {
119163
s, err := puzzles.GetSolver(puzzle)
120164
if err != nil {
121-
return errors.Wrap(err, "failed to get solver")
165+
return puzzles.Result{}, errors.Wrap(err, "failed to get solver")
122166
}
123167

124168
input := filepath.Clean(
125-
filepath.Join(inputdir, fmt.Sprintf("%s.txt", puzzle)),
169+
filepath.Join(inputdir, fmt.Sprintf("%s.txt", s.Name())),
126170
)
127171

128-
if err := puzzles.Run(s, input); err != nil {
129-
return errors.Wrap(err, "failed to run puzzle solver")
172+
res, err := puzzles.Run(s, input)
173+
if err != nil {
174+
return puzzles.Result{}, errors.Wrapf(err, "failed to run [%s]", s.Name())
130175
}
131176

132-
return nil
177+
return res, nil
133178
}

go.mod

+1
Original file line numberDiff line numberDiff line change
@@ -5,5 +5,6 @@ go 1.13
55
require (
66
github.com/manifoldco/promptui v0.6.0
77
github.com/pkg/errors v0.8.1
8+
github.com/sirupsen/logrus v1.4.2
89
github.com/stretchr/testify v1.4.0
910
)

go.sum

+8
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@ github.com/gordonklaus/ineffassign v0.0.0-20180909121442-1003c8bd00dc h1:cJlkeAx
2121
github.com/gordonklaus/ineffassign v0.0.0-20180909121442-1003c8bd00dc/go.mod h1:cuNKsD1zp2v6XfE/orVX2QE1LC+i254ceGcVeDT3pTU=
2222
github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a h1:FaWFmfWdAUKbSCtOU2QjDaorUexogfaMgbipgYATUMU=
2323
github.com/juju/ansiterm v0.0.0-20180109212912-720a0952cc2a/go.mod h1:UJSiEoRfvx3hP73CvoARgeLjaIOjybY9vj8PUPPFGeU=
24+
github.com/konsorten/go-windows-terminal-sequences v1.0.1 h1:mweAR1A6xJ3oS2pRaGiHgQ4OO8tzTaLawm8vnODuwDk=
25+
github.com/konsorten/go-windows-terminal-sequences v1.0.1/go.mod h1:T0+1ngSBFLxvqU3pZ+m/2kptfBszLMUkC4ZK/EgS/cQ=
2426
github.com/kr/pretty v0.1.0 h1:L/CwN0zerZDmRFUapSPitk6f+Q3+0za1rQkzVuMiMFI=
2527
github.com/kr/pretty v0.1.0/go.mod h1:dAy3ld7l9f0ibDNOQOHHMYYIIbhfbHSm3C4ZsoJORNo=
2628
github.com/kr/pty v1.1.1/go.mod h1:pFQYn66WHrOpPYNljwOMqo10TkYh1fy3cYio2l3bCsQ=
@@ -42,7 +44,11 @@ github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I=
4244
github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0=
4345
github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM=
4446
github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4=
47+
github.com/sirupsen/logrus v1.4.2 h1:SPIRibHv4MatM3XXNO2BJeFLZwZ2LvZgfQ5+UNI2im4=
48+
github.com/sirupsen/logrus v1.4.2/go.mod h1:tLMulIdttU9McNUspp0xgXVQah82FyeX6MwdIuYE2rE=
4549
github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
50+
github.com/stretchr/objx v0.1.1/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME=
51+
github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs=
4652
github.com/stretchr/testify v1.4.0 h1:2E4SXV/wtOkTonXsotYi4li6zVWxYlZuYNCXe9XRJyk=
4753
github.com/stretchr/testify v1.4.0/go.mod h1:j7eGeouHqKxXV5pUuKE4zz7dFj8WfuZ+81PSLYec5m4=
4854
github.com/tsenart/deadcode v0.0.0-20160724212837-210d2dc333e9 h1:vY5WqiEon0ZSTGM3ayVVi+twaHKHDFUVloaQ/wug9/c=
@@ -51,6 +57,8 @@ golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3 h1:x/bBzNauLQAlE3fLku/xy92Y
5157
golang.org/x/lint v0.0.0-20181026193005-c67002cb31c3/go.mod h1:UVdnD1Gm6xHRNCYTkRU2/jEulfH38KcIWyp/GAMgvoE=
5258
golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b h1:MQE+LT/ABUuuvEZ+YQAMSXindAdUh7slEmAkup74op4=
5359
golang.org/x/sys v0.0.0-20181122145206-62eef0e2fa9b/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY=
60+
golang.org/x/sys v0.0.0-20190422165155-953cdadca894 h1:Cz4ceDQGXuKRnVBDTS23GTn/pU5OE2C0WrNTOYK1Uuc=
61+
golang.org/x/sys v0.0.0-20190422165155-953cdadca894/go.mod h1:h1NjWce9XRLGQEsW7wpKNCjG9DtNlClVuFLEZdDNbEs=
5462
golang.org/x/tools v0.0.0-20181122213734-04b5d21e00f1 h1:bsEj/LXbv3BCtkp/rBj9Wi/0Nde4OMaraIZpndHAhdI=
5563
golang.org/x/tools v0.0.0-20181122213734-04b5d21e00f1/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ=
5664
gopkg.in/alecthomas/kingpin.v3-unstable v3.0.0-20171010053543-63abe20a23e2 h1:5zOHKFi4LqGWG+3d+isqpbPrN/2yhDJnlO+BhRiuR6U=

puzzles/solutions/2019/day01/solution_test.go

+15-65
Original file line numberDiff line numberDiff line change
@@ -182,79 +182,41 @@ func Test_calcPart2(t *testing.T) {
182182
close(in)
183183
}
184184

185-
func Test_solver_Part1(t *testing.T) {
186-
type fields struct {
187-
name string
188-
}
185+
func readerFromFile(tb testing.TB, fpath string) io.Reader {
186+
tb.Helper()
189187

188+
file, err := os.Open(fpath)
189+
require.NoError(tb, err)
190+
191+
return file
192+
}
193+
194+
func Test_calc(t *testing.T) {
190195
type args struct {
191196
inputPath string
197+
calcFn calcFunc
192198
}
193199

194200
tests := []struct {
195201
name string
196-
fields fields
197202
args args
198203
want string
199204
wantErr bool
200205
}{
201206
{
202-
name: "",
203-
fields: fields{
204-
name: "day01",
205-
},
207+
name: "part 1",
206208
args: args{
207209
inputPath: filepath.Join("testdata", "input.txt"),
210+
calcFn: calcPart1,
208211
},
209212
want: "34241",
210213
wantErr: false,
211214
},
212-
}
213-
214-
for _, tt := range tests {
215-
tt := tt
216-
217-
t.Run(tt.name, func(t *testing.T) {
218-
s := solution{
219-
name: tt.fields.name,
220-
}
221-
input := readerFromFile(t, tt.args.inputPath)
222-
223-
got, err := s.Part1(input)
224-
if tt.wantErr {
225-
assert.Error(t, err)
226-
return
227-
}
228-
229-
assert.NoError(t, err)
230-
assert.Equal(t, tt.want, got)
231-
})
232-
}
233-
}
234-
235-
func Test_solver_Part2(t *testing.T) {
236-
type fields struct {
237-
name string
238-
}
239-
240-
type args struct {
241-
inputPath string
242-
}
243-
244-
tests := []struct {
245-
name string
246-
fields fields
247-
args args
248-
want string
249-
wantErr bool
250-
}{
251215
{
252-
name: "",
253-
fields: fields{
254-
name: "day01",
255-
},
216+
name: "part 2",
256217
args: args{
257218
inputPath: filepath.Join("testdata", "input.txt"),
219+
calcFn: calcPart2,
258220
},
259221
want: "51316",
260222
wantErr: false,
@@ -265,12 +227,9 @@ func Test_solver_Part2(t *testing.T) {
265227
tt := tt
266228

267229
t.Run(tt.name, func(t *testing.T) {
268-
s := solution{
269-
name: tt.fields.name,
270-
}
271230
input := readerFromFile(t, tt.args.inputPath)
231+
got, err := calc(input, tt.args.calcFn)
272232

273-
got, err := s.Part2(input)
274233
if tt.wantErr {
275234
assert.Error(t, err)
276235
return
@@ -281,12 +240,3 @@ func Test_solver_Part2(t *testing.T) {
281240
})
282241
}
283242
}
284-
285-
func readerFromFile(tb testing.TB, fpath string) io.Reader {
286-
tb.Helper()
287-
288-
file, err := os.Open(fpath)
289-
require.NoError(tb, err)
290-
291-
return file
292-
}

0 commit comments

Comments
 (0)