Skip to content

Solution to Problem Statement 1 #108

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
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
122 changes: 122 additions & 0 deletions main.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,122 @@
package main

import (
"encoding/csv"
"fmt"
"io"
"log"
"math"
"os"
"strconv"
"strings"
)

func calculateMinimumCost(record []string, contentSize int, minCost float64, deliveryPartner string) (float64, string) {
sizeSlab := strings.Split(strings.TrimSpace(record[1]), "-")
minRange, err := strconv.Atoi(sizeSlab[0])
if err != nil {
log.Fatal(err)
}
maxRange, err := strconv.Atoi(sizeSlab[1])
if err != nil {
log.Fatal(err)
}
// Checking if delivery is possible or not
if contentSize >= minRange && contentSize <= maxRange {
a, err := strconv.Atoi(strings.TrimSpace(record[2]))
if err != nil {
log.Fatal(err)
}
b, err := strconv.Atoi(strings.TrimSpace(record[3]))
if err != nil {
log.Fatal(err)
}
c := math.Max(float64(a), float64(b)*float64(contentSize))
// Calculating minimum cost
if minCost > c {
// Assigning delivery partner
deliveryPartner = record[4]
minCost = c
}
}
return minCost, deliveryPartner
}

func main() {
f2, err := os.Open("input.csv")
if err != nil {
log.Fatal(err)
}
defer f2.Close()
p := csv.NewReader(f2)
allRecords := [][]string{}

for {
f, err := os.Open("partners.csv")
if err != nil {
log.Fatal(err)
}
defer f.Close()

r := csv.NewReader(f)
// Skip the first row
if _, err := r.Read(); err != nil {
fmt.Println("Error", err)
}
var minCost float64 = math.Pow10(10)
var deliveryPartner string
outputRecord := []string{}
// Reading the input from input.csv
input, err := p.Read()
if err == io.EOF {
break
}
if err != nil {
log.Fatal(err)
}
contentSize, err := strconv.Atoi(strings.TrimSpace(input[1]))
if err != nil {
log.Fatal(err)
}
for {
// Reading each record from partners.csv
record, err := r.Read()
if err == io.EOF {
break
}
if err != nil {
log.Fatal(err)
}
minCost, deliveryPartner = calculateMinimumCost(record, contentSize, minCost, deliveryPartner)
}
if minCost == math.Pow10(10) {
// Delivery not possible
outputRecord = append(outputRecord, input[0])
outputRecord = append(outputRecord, "false")
outputRecord = append(outputRecord, deliveryPartner)
outputRecord = append(outputRecord, "")
allRecords = append(allRecords, outputRecord)
} else {
// Delivery possible
outputRecord = append(outputRecord, input[0])
outputRecord = append(outputRecord, "true")
outputRecord = append(outputRecord, deliveryPartner)
outputRecord = append(outputRecord, strconv.Itoa(int(minCost)))
allRecords = append(allRecords, outputRecord)
}
}
// Create or if exists open output file
f3, err := os.OpenFile("output.csv", os.O_RDWR|os.O_CREATE, 0755)
if err != nil {
log.Fatalln("failed to open file", err)
}
defer f3.Close()
// Writing to the output.csv file
w := csv.NewWriter(f3)
defer w.Flush()
for _, record := range allRecords {
if err := w.Write(record); err != nil {
log.Fatalln("Error writing record to file!")
}
}
}