Skip to content

solved #126

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
9 changes: 9 additions & 0 deletions constants/constants.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
package constants

const (
PARTNERS_FILE = "partners.csv"
CAPACITY_FILE = "capacities.csv"
INPUT_FILE = "input.csv"
OUTPUT1_FILE = "output1.csv"
OUTPUT2_FILE = "output2.csv"
)
3 changes: 3 additions & 0 deletions go.mod
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
module qube

go 1.16
32 changes: 32 additions & 0 deletions main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
package main

import (
"fmt"
"qube/service"
)

func main() {
partners := service.ReadPartners()

delivery := service.ReadDelivery()

result, err := service.ProblemStatement1(partners, delivery)

if err != nil {
fmt.Println(err.Error())
return
}

service.PrintProblemStatement1(result)

capacities := service.ReadCapacity()

result2, err := service.ProblemStatement2(partners, delivery, capacities)

if err != nil {
fmt.Println(err.Error())
return
}

service.PrintProblemStatement2(result2)
}
28 changes: 28 additions & 0 deletions model/model.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,28 @@
package model

type Partner struct {
MinGB int
MaxGB int
MinCost int
PerGB int
Partner string
}

type Delivery struct {
Name string
Theatre string
Amount int
}

type Result struct {
Name string
Partner string
Cost int
}

type Result2 struct {
Name string
Amount int
Partner string
Cost int
}
4 changes: 2 additions & 2 deletions output2.csv
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
D1,true ,P2,3000
D2,true ,P1,3250
D1,true ,P1,2000
D2,true ,P2,3500
D3,true ,P3,15300
D4,false,"",""
174 changes: 174 additions & 0 deletions service/input.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,174 @@
package service

import (
"bufio"
"os"
"qube/constants"
"qube/model"
"strconv"
"strings"
"unicode"
)

func ReadCapacity() map[string]int {
var capacities map[string]int = make(map[string]int)
readFile, err := os.Open(constants.CAPACITY_FILE)

if err != nil {
panic(err)
}

defer readFile.Close()

fileScanner := bufio.NewScanner(readFile)

fileScanner.Split(bufio.ScanLines)

for fileScanner.Scan() {
data := strings.Split(SpaceStringsBuilder(fileScanner.Text()), ",")

amount, err := parseInt(data[1])

if err != nil {
continue
}

capacities[data[0]] = amount
}

return capacities
}

func ReadDelivery() []model.Delivery {
var delivery []model.Delivery
readFile, err := os.Open(constants.INPUT_FILE)

if err != nil {
panic(err)
}

defer readFile.Close()

fileScanner := bufio.NewScanner(readFile)

fileScanner.Split(bufio.ScanLines)

for fileScanner.Scan() {
data := strings.Split(SpaceStringsBuilder(fileScanner.Text()), ",")

newDelivery, err := parseDelivery(data)

if err != nil {
continue
}

delivery = append(delivery, *newDelivery)
}

return delivery
}

func ReadPartners() map[string][]model.Partner {
var partners map[string][]model.Partner = make(map[string][]model.Partner)

readFile, err := os.Open(constants.PARTNERS_FILE)

if err != nil {
panic(err)
}

defer readFile.Close()

fileScanner := bufio.NewScanner(readFile)

fileScanner.Split(bufio.ScanLines)

for fileScanner.Scan() {
data := strings.Split(SpaceStringsBuilder(fileScanner.Text()), ",")

_, ok := partners[data[0]]

if !ok {
partners[data[0]] = make([]model.Partner, 0)
}

newPartner, err := parsePartner(data)

if err != nil {
continue
}

partners[data[0]] = append(partners[data[0]], *newPartner)
}

return partners
}

func parseDelivery(data []string) (*model.Delivery, error) {
amount, err := parseInt(data[1])

if err != nil {
return nil, err
}

return &model.Delivery{
Name: data[0],
Amount: amount,
Theatre: data[2],
}, nil
}

func parsePartner(data []string) (*model.Partner, error) {
minCost, err := parseInt(data[2])

if err != nil {
return nil, err
}

perGB, err := parseInt(data[3])

if err != nil {
return nil, err
}

minGB, err := parseInt(strings.Split(data[1], "-")[0])

if err != nil {
return nil, err
}

maxGB, err := parseInt(strings.Split(data[1], "-")[1])

if err != nil {
return nil, err
}

return &model.Partner{
MinCost: minCost,
PerGB: perGB,
Partner: data[4],
MinGB: minGB,
MaxGB: maxGB,
}, nil
}

func parseInt(number string) (int, error) {
num, err := strconv.Atoi(number)

if err != nil {
return 0, err
}

return num, nil
}

func SpaceStringsBuilder(str string) string {
var b strings.Builder
b.Grow(len(str))
for _, ch := range str {
if !unicode.IsSpace(ch) {
b.WriteRune(ch)
}
}
return b.String()
}
53 changes: 53 additions & 0 deletions service/print.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,53 @@
package service

import (
"bufio"
"fmt"
"os"
"qube/constants"
"qube/model"
)

func PrintProblemStatement1(result []model.Result) {
f, err := os.Create(constants.OUTPUT1_FILE)

if err != nil {
panic(err)
}

defer f.Close()

w := bufio.NewWriter(f)

for _, elem := range result {
if elem.Cost == -1 {
fmt.Fprintf(w, "%v,false,\"\",\"\"\n", elem.Name)
} else {
fmt.Fprintf(w, "%v,true ,%v,%v\n", elem.Name, elem.Partner, elem.Cost)
}
}

w.Flush()
}

func PrintProblemStatement2(result []model.Result2) {
f, err := os.Create(constants.OUTPUT2_FILE)

if err != nil {
panic(err)
}

defer f.Close()

w := bufio.NewWriter(f)

for _, elem := range result {
if elem.Cost == -1 {
fmt.Fprintf(w, "%v,false,\"\",\"\"\n", elem.Name)
} else {
fmt.Fprintf(w, "%v,true ,%v,%v\n", elem.Name, elem.Partner, elem.Cost)
}
}

w.Flush()
}
Loading