Skip to content

Challenge2019 Solution for problem 1&2 #117

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
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
/node_modules
62 changes: 62 additions & 0 deletions Problem1/problem1.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
/* Problem statement:
Given a list of content size and Theatre ID,
Find the partner for each delivery where cost of delivery is minimum.
If delivery is not possible, mark that delivery impossible.
*/
const parsedData = require('../parsedFiles/parsedFiles');
const fs = require('fs');

async function minimumCost() {

// Erasing the contents of output1.csv file
fs.writeFile('../challenge2019/outputs/output1.csv', '', (error) => {
if (error) throw error;
});

const partnersArray = await parsedData.partnersArr();
const inputArray = await parsedData.inputArr();

let partnerId = '';
let deliveryStatus = false;
let finalCSV = [];
let finalCost = '';

// Iterating the input theatres to find the minimun delivery cost
for (let count = 0; count < inputArray.length; count++) {
let currentTheatre = partnersArray.filter((value) => value.theatreId == inputArray[count].theatreId);

for (let index = 0; index < currentTheatre.length; index++) {
// Checking whether the delievery size falls between the mentioned size slabs
if ((inputArray[count].deliverySize <= currentTheatre[index].maxSlab && inputArray[count].deliverySize >= currentTheatre[index].minSlab)) {
deliveryStatus = true;
let tempCost = (inputArray[count].deliverySize * currentTheatre[index].costPerGb) > (currentTheatre[index].minCost) ? (inputArray[count].deliverySize * currentTheatre[index].costPerGb) : (currentTheatre[index].minCost);
if (finalCost != "") {
if (finalCost > tempCost) {
finalCost = tempCost;
partnerId = currentTheatre[index].partnerId
}
}
else {
finalCost = tempCost;
partnerId = currentTheatre[index].partnerId
}
}
}
// Pushing each object into an array
if (count == 0) {
finalCSV.push(`Challenge 1 Solution \n${inputArray[count].deliveryId},${deliveryStatus},${partnerId},${finalCost}`)
}
else {
finalCSV.push(`\n${inputArray[count].deliveryId},${deliveryStatus},${partnerId != "" ? partnerId : '""'},${finalCost != "" ? finalCost : '""'}`)
}

// Resetting the variables.
finalCost = "";
partnerId = "";
deliveryStatus = false;
}
// Appending the final array to output1.csv file
fs.appendFileSync("../challenge2019/outputs/output1.csv", finalCSV + "\n");
}

module.exports = { minimumCost }
90 changes: 90 additions & 0 deletions Problem2/problem2.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,90 @@
/*
Given a list of content size and Theatre ID,
Assign deliveries to partners in such a way that all deliveries are possible (Higher Priority)
and overall cost of delivery is minimum (i.e. First make sure no delivery is impossible and
then minimise the sum of cost of all the delivery).
If delivery is not possible to a theatre, mark that delivery impossible.
Take partner capacity into consideration as well.
*/

const parsedData = require('../parsedFiles/parsedFiles');
const fs = require('fs');

async function minimumCapacity() {

// Erasing the contents of output2.csv file
fs.writeFile('../challenge2019/outputs/output2.csv', '', (error) => {
if (error) throw error;
});

const partnersArray = await parsedData.partnersArr();
const inputArray = await parsedData.inputArr();
const capacitiesArray = await parsedData.capacitiesArr();

let partnerId = '';
let deliveryStatus = false;
let csvData = [];
let finalCSV = '';
let finalCost = '';

//Sorting the input file based on the deliverySize
inputArray.sort((a, b) => parseInt(b.deliverySize) - parseInt(a.deliverySize));

for (let count = 0; count < inputArray.length; count++) {
let currentTheatre = partnersArray.filter((value) => value.theatreId == inputArray[count].theatreId);
for (let index = 0; index < currentTheatre.length; index++) {
partnerCapacity = capacitiesArray.filter((value) => value.partnerId == currentTheatre[index].partnerId)[0].capacityInGb;

// Condition to check if the delivery size falls between the slabs and does not exceed the partner capacity
if (inputArray[count].deliverySize <= currentTheatre[index].maxSlab && inputArray[count].deliverySize >= currentTheatre[index].minSlab && partnerCapacity >= inputArray[count].deliverySize) {
deliveryStatus = true;
let tempCost = (inputArray[count].deliverySize * currentTheatre[index].costPerGb) > currentTheatre[index].minCost ? (inputArray[count].deliverySize * currentTheatre[index].costPerGb) : currentTheatre[index].minCost;

if (finalCost != "") {
if (finalCost > tempCost) {
finalCost = tempCost;
partnerId = currentTheatre[index].partnerId
}
}
else {
finalCost = tempCost;
partnerId = currentTheatre[index].partnerId
}
}
}

//Checking if delivery is possible and updating the new capacity by subtracting the currently covered capacity
if (deliveryStatus) {
let filteredCapArr = capacitiesArray.filter((value) => value.partnerId == partnerId);
for (let rows = 0; rows < filteredCapArr.length; rows++) {
filteredCapArr[rows].capacityInGb = filteredCapArr[rows].capacityInGb - inputArray[count].deliverySize;
}
}

//
csvData.push(`${inputArray[count].deliveryId},${deliveryStatus},${partnerId != "" ? partnerId : '""'},${finalCost != "" ? finalCost : '""'}`)
//Resetting the variables
finalCost = '';
partnerId = '';
deliveryStatus = false;

//Sorting the data in the array and storing it in another variable and appending to the output2.csv file.
csvData.sort();

//Resetting each time to get a new row
finalCSV = '';
for (let data = 0; data < csvData.length; data++) {
if (data == 0) {
finalCSV += `Challenge 2 Solution \n${csvData[data]} \n`
}
else {
finalCSV += `${csvData[data]}\n`
}
}
}
// Appending the final array to output2.csv file
fs.appendFileSync("../challenge2019/outputs/output2.csv", finalCSV + "\n");
}

module.exports = { minimumCapacity }

9 changes: 9 additions & 0 deletions index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
const solution1 = require('./Problem1/problem1')
const solution2 = require('./Problem2/problem2')

async function solution() {
await solution1.minimumCost()
await solution2.minimumCapacity()
};

solution();
4 changes: 0 additions & 4 deletions output1.csv

This file was deleted.

4 changes: 0 additions & 4 deletions output2.csv

This file was deleted.

5 changes: 5 additions & 0 deletions outputs/output1.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
Challenge 1 Solution
D1,true,P1,2000,
D2,true,P1,3250,
D3,true,P3,15300,
D4,false,"",""
6 changes: 6 additions & 0 deletions outputs/output2.csv
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
Challenge 2 Solution
D1,true,P2,3000
D2,true,P1,3250
D3,true,P3,15300
D4,false,"",""

53 changes: 53 additions & 0 deletions package-lock.json

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

15 changes: 15 additions & 0 deletions package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,15 @@
{
"name": "qube2019",
"version": "1.0.0",
"description": "This project contains the solutions for 2 problems in the Qube 2019 coding challenge",
"main": "index.js",
"scripts": {
"test": "echo \"Error: no test specified\" && exit 1"
},
"keywords": [],
"author": "Junaid Althaf",
"license": "ISC",
"dependencies": {
"csv-parser": "^3.0.0"
}
}
File renamed without changes.
File renamed without changes.
92 changes: 92 additions & 0 deletions parsedFiles/parsedFiles.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
const csv = require('csv-parser')
const fs = require('fs')

let partnersArray = []
let capacitiesArray = []
let inputArray = []

//Parsing the data from partners.csv
async function partnersArr() {
return new Promise((resolve, reject) => {
fs.createReadStream('./parsedFiles/partners.csv')
.pipe(csv({ headers: false, skipLines: 1 }))
.on('data', (data) => {
try {
const minRange = data['1'].split('-')[0].trim();
const maxRange = data['1'].split('-')[1].trim();
partnersArray.push({
"theatreId": data[0].trim(),
"minSlab": parseInt(minRange),
"maxSlab": parseInt(maxRange),
"minCost": parseInt(data[2].trim()),
"costPerGb": parseInt(data[3].trim()),
"partnerId": data[4].trim(),
})
}
catch (err) {
console.error("Error parsing csv file : " + err)
reject(err)
}
})
.on('end', () => {
resolve(partnersArray)
});
partnersArray = []
})
}

//Parsing the data from capacities.csv
async function capacitiesArr() {
return new Promise((resolve, reject) => {
fs.createReadStream('./parsedFiles/capacities.csv')
.pipe(csv({ headers: false, skipLines: 1 }))
.on('data', (data) => {
try {
capacitiesArray.push({
"partnerId": data[0].trim(),
"capacityInGb": parseInt(data[1])
})
}
catch (err) {
console.error("Error parsing csv file : " + err)
reject(err)
}
})
.on('end', () => {
resolve(capacitiesArray)
});
capacitiesArray = []
})
}

//Parsing the data from input.csv
async function inputArr() {
return new Promise((resolve, reject) => {
fs.createReadStream('./parsedFiles/input.csv')
.pipe(csv({ headers: false }))
.on('data', (data) => {
try {
inputArray.push({
"deliveryId": data[0].trim(),
"deliverySize": parseInt(data[1]),
"theatreId": data[2].trim()
})
}
catch (err) {
console.error("Error parsing csv file : " + err)
reject(err)
}
})
.on('end', () => {
resolve(inputArray)
});
inputArray = []
})
}


module.exports = {
partnersArr,
capacitiesArr,
inputArr
}
34 changes: 17 additions & 17 deletions partners.csv → parsedFiles/partners.csv
Original file line number Diff line number Diff line change
@@ -1,17 +1,17 @@
Theatre,Size Slab (in GB),Minimum cost,Cost Per GB,Partner ID
T1 ,0-100 ,1500 ,20 ,P1
T1 ,100-200 ,2000 ,13 ,P1
T1 ,200-300 ,2500 ,12 ,P1
T1 ,300-400 ,3000 ,10 ,P1
T2 ,0-100 ,1500 ,20 ,P1
T2 ,100-200 ,2000 ,15 ,P1
T2 ,200-300 ,2500 ,12 ,P1
T2 ,300-400 ,3000 ,10 ,P1
T1 ,0-200 ,1000 ,20 ,P2
T1 ,200-400 ,2500 ,15 ,P2
T2 ,0-200 ,2500 ,20 ,P2
T2 ,200-400 ,3500 ,10 ,P2
T1 ,100-200 ,800 ,25 ,P3
T1 ,200-600 ,1200 ,30 ,P3
T2 ,100-200 ,900 ,15 ,P3
T2 ,200-400 ,1000 ,12 ,P3
Theatre,Size Slab (in GB),Minimum cost,Cost Per GB,Partner ID
T1 ,0-100 ,1500 ,20 ,P1
T1 ,100-200 ,2000 ,13 ,P1
T1 ,200-300 ,2500 ,12 ,P1
T1 ,300-400 ,3000 ,10 ,P1
T2 ,0-100 ,1500 ,20 ,P1
T2 ,100-200 ,2000 ,15 ,P1
T2 ,200-300 ,2500 ,12 ,P1
T2 ,300-400 ,3000 ,10 ,P1
T1 ,0-200 ,1000 ,20 ,P2
T1 ,200-400 ,2500 ,15 ,P2
T2 ,0-200 ,2500 ,20 ,P2
T2 ,200-400 ,3500 ,10 ,P2
T1 ,100-200 ,800 ,25 ,P3
T1 ,200-600 ,1200 ,30 ,P3
T2 ,100-200 ,900 ,15 ,P3
T2 ,200-400 ,1000 ,12 ,P3