summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDimitri Sokolyuk <demon@dim13.org>2019-07-07 12:02:20 +0200
committerDimitri Sokolyuk <demon@dim13.org>2019-07-07 12:02:20 +0200
commit31a1eaa9c0d694b9913a637dd4e5472c22152886 (patch)
tree76db2043320990396259bd0283ca8d90657ca9b7
parent9c5b94182e4da43ae7e981285e190f6c5881d3bf (diff)
wip
-rw-r--r--go/book-store/book_store.go53
1 files changed, 19 insertions, 34 deletions
diff --git a/go/book-store/book_store.go b/go/book-store/book_store.go
index faadeb5..c568324 100644
--- a/go/book-store/book_store.go
+++ b/go/book-store/book_store.go
@@ -1,48 +1,33 @@
package bookstore
-var (
- discounts = []int{0, 0, 5, 10, 20, 25} // percent
- bookPrice = 800 // cents
-)
+const bookPrice = 800 // cents
-func countMax(books []int) (int, map[int]int) {
- m := make(map[int]int)
+type basket struct {
+ books map[int]int // type:count
+}
+
+func newBasket(books []int) basket {
+ b := basket{books: make(map[int]int)}
for _, v := range books {
- m[v]++
+ b.books[v]++
}
- var max int
- for _, v := range m {
- if v > max {
- max = v
- }
- }
- return max, m
+ return b
}
-func calcPrice(baskets [][]int) int {
- var sum int
- for _, v := range baskets {
- percent := discounts[len(v)]
- price := bookPrice - bookPrice*percent/100
- sum += len(v) * price
- }
- return sum
+// discount in percent
+func (b basket) discount() int {
+ discounts := []int{0, 0, 5, 10, 20, 25} // percent
+ return discounts[len(b.books)]
}
-func distributeFullCountBooks(baskets [][]int, m map[int]int, n int) {
- for k, v := range m {
- if v == n {
- for i := range baskets {
- baskets[i] = append(baskets[i], k)
- }
- delete(m, k)
- }
+func (b basket) price() int {
+ var price int
+ for _, v := range b.books {
+ price += v * (bookPrice - bookPrice*b.discount()/100)
}
+ return price
}
func Cost(books []int) int {
- n, m := countMax(books)
- baskets := make([][]int, n)
- distributeFullCountBooks(baskets, m, n)
- return calcPrice(baskets)
+ return newBasket(books).price()
}