From 168475bbe15e517611d85d179f587bdf1ffc5efd Mon Sep 17 00:00:00 2001 From: Vasko Zdravevski Date: Thu, 6 Sep 2018 13:16:49 -0600 Subject: [PATCH 1/5] day 16 slice version --- day16/problem.go | 34 ++++++++++++++++++++++++++++++++++ day16/problem_test.go | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 72 insertions(+) create mode 100644 day16/problem.go create mode 100644 day16/problem_test.go diff --git a/day16/problem.go b/day16/problem.go new file mode 100644 index 0000000..da7b7fd --- /dev/null +++ b/day16/problem.go @@ -0,0 +1,34 @@ +package day16 + +// OrderLog represents the behavior of an order log regardless of impl. +type OrderLog interface { + Record(orderID interface{}) + GetLast(index int) interface{} +} + +type orderLogSlice struct { + log []interface{} + pos int + size int +} + +// NewOrderLogSlice returns a new OrderLog based on a slice. +func NewOrderLogSlice(size int) OrderLog { + return &orderLogSlice{log: make([]interface{}, size), pos: -1, size: size} +} + +func (ol *orderLogSlice) Record(orderID interface{}) { + ol.pos++ + if ol.pos >= ol.size { + ol.pos = 0 + } + ol.log[ol.pos] = orderID +} + +func (ol *orderLogSlice) GetLast(index int) interface{} { + i := ol.pos - (index - 1) + if i < 0 { + i += ol.size + } + return ol.log[i] +} diff --git a/day16/problem_test.go b/day16/problem_test.go new file mode 100644 index 0000000..0e81dea --- /dev/null +++ b/day16/problem_test.go @@ -0,0 +1,38 @@ +package day16 + +import "testing" + +var testcases = []struct { + size int + orders []interface{} + getLast []int + expected []interface{} +}{ + {5, []interface{}{5, 4, "abc", 10, "def", "ged"}, + []int{1, 2, 3, 4, 5}, + []interface{}{"ged", "def", 10, "abc", 4}}, +} + +func TestOrderLogSlice(t *testing.T) { + t.Parallel() + for _, tc := range testcases { + r := NewOrderLogSlice(tc.size) + for _, v := range tc.orders { + r.Record(v) + } + for i, v := range tc.getLast { + if result := r.GetLast(v); result != tc.expected[i] { + t.Errorf("Expected %v but got %v", tc.expected[i], result) + } + } + } +} + +func TestOrderLogRing(t *testing.T) { +} + +func BenchmarkOrderLogSlice(b *testing.B) { +} + +func BenchmarkOrderLogRing(b *testing.B) { +} From 77769002592b9fba8d8dfe4a321ddcd0474dd129 Mon Sep 17 00:00:00 2001 From: Vasko Zdravevski Date: Thu, 6 Sep 2018 13:42:18 -0600 Subject: [PATCH 2/5] day 16 add ring implementation --- day16/problem.go | 20 ++++++++++++++++++++ day16/problem_test.go | 12 ++++++++++++ 2 files changed, 32 insertions(+) diff --git a/day16/problem.go b/day16/problem.go index da7b7fd..cbde100 100644 --- a/day16/problem.go +++ b/day16/problem.go @@ -1,5 +1,7 @@ package day16 +import "container/ring" + // OrderLog represents the behavior of an order log regardless of impl. type OrderLog interface { Record(orderID interface{}) @@ -32,3 +34,21 @@ func (ol *orderLogSlice) GetLast(index int) interface{} { } return ol.log[i] } + +type orderLogRing struct { + log *ring.Ring +} + +// NewOrderLogRing returns a new OrderLog based on a circular ring. +func NewOrderLogRing(size int) OrderLog { + return &orderLogRing{ring.New(size)} +} + +func (ol *orderLogRing) Record(orderID interface{}) { + ol.log = ol.log.Next() + ol.log.Value = orderID +} + +func (ol *orderLogRing) GetLast(index int) interface{} { + return ol.log.Move(-(index - 1)).Value +} diff --git a/day16/problem_test.go b/day16/problem_test.go index 0e81dea..48f63e8 100644 --- a/day16/problem_test.go +++ b/day16/problem_test.go @@ -29,6 +29,18 @@ func TestOrderLogSlice(t *testing.T) { } func TestOrderLogRing(t *testing.T) { + t.Parallel() + for _, tc := range testcases { + r := NewOrderLogRing(tc.size) + for _, v := range tc.orders { + r.Record(v) + } + for i, v := range tc.getLast { + if result := r.GetLast(v); result != tc.expected[i] { + t.Errorf("Expected %v but got %v", tc.expected[i], result) + } + } + } } func BenchmarkOrderLogSlice(b *testing.B) { From 32e1cf255b88b96c83f9b2e2f0633570a2c5e210 Mon Sep 17 00:00:00 2001 From: Vasko Zdravevski Date: Thu, 6 Sep 2018 13:43:38 -0600 Subject: [PATCH 3/5] add test case for returning nils --- day16/problem_test.go | 3 +++ 1 file changed, 3 insertions(+) diff --git a/day16/problem_test.go b/day16/problem_test.go index 48f63e8..c61b6c8 100644 --- a/day16/problem_test.go +++ b/day16/problem_test.go @@ -11,6 +11,9 @@ var testcases = []struct { {5, []interface{}{5, 4, "abc", 10, "def", "ged"}, []int{1, 2, 3, 4, 5}, []interface{}{"ged", "def", 10, "abc", 4}}, + {5, []interface{}{"abc"}, + []int{1, 2, 3, 4, 5}, + []interface{}{"abc", nil, nil, nil, nil}}, } func TestOrderLogSlice(t *testing.T) { From 34c5b685ab73738b71e45a12d13b3da3e3e38bfb Mon Sep 17 00:00:00 2001 From: Vasko Zdravevski Date: Thu, 6 Sep 2018 13:48:52 -0600 Subject: [PATCH 4/5] day 16 add benchmarks --- day16/problem_test.go | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/day16/problem_test.go b/day16/problem_test.go index c61b6c8..e635d0b 100644 --- a/day16/problem_test.go +++ b/day16/problem_test.go @@ -47,7 +47,29 @@ func TestOrderLogRing(t *testing.T) { } func BenchmarkOrderLogSlice(b *testing.B) { + for i := 0; i < b.N; i++ { + for _, tc := range testcases { + r := NewOrderLogSlice(tc.size) + for _, v := range tc.orders { + r.Record(v) + } + for _, v := range tc.getLast { + r.GetLast(v) + } + } + } } func BenchmarkOrderLogRing(b *testing.B) { + for i := 0; i < b.N; i++ { + for _, tc := range testcases { + r := NewOrderLogRing(tc.size) + for _, v := range tc.orders { + r.Record(v) + } + for _, v := range tc.getLast { + r.GetLast(v) + } + } + } } From 3d0bcab9cd44087e812af92201d9b4003ffbfd3b Mon Sep 17 00:00:00 2001 From: Vasko Zdravevski Date: Thu, 6 Sep 2018 13:49:34 -0600 Subject: [PATCH 5/5] day 16 update readme --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index 90dc2b1..6992c6d 100644 --- a/README.md +++ b/README.md @@ -26,3 +26,4 @@ problems from * [Day 13](https://github.com/vaskoz/dailycodingproblem-go/issues/29) * [Day 14](https://github.com/vaskoz/dailycodingproblem-go/issues/31) * [Day 15](https://github.com/vaskoz/dailycodingproblem-go/issues/33) +* [Day 16](https://github.com/vaskoz/dailycodingproblem-go/issues/35)