diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..30bc162 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +/node_modules \ No newline at end of file diff --git a/README.md b/README.md index b162885..5ea87fa 100644 --- a/README.md +++ b/README.md @@ -99,7 +99,7 @@ Use `partners.csv` and `capacities.csv`. ``` D1, 100, T1 D2, 240, T1 -D3, 260, T1 +D2, 260, T1 ``` **OUTPUT**: diff --git a/index.js b/index.js new file mode 100644 index 0000000..40fad26 --- /dev/null +++ b/index.js @@ -0,0 +1,15 @@ +const problemStatement1 = require('./problem/problem1.js') +const problemStatement2 = require('./problem/problem2.js') +// const { maximumCapacity } = require('./problem2.js') + + + +const Problem = async()=>{ + + //Problem Solution 1 Call + await problemStatement1.minimumDeliveryCost() + //Problem Solution 1 Call + await problemStatement2.minimumCapacity() +} + +Problem() \ No newline at end of file diff --git a/capacities.csv b/inputs/capacities.csv similarity index 100% rename from capacities.csv rename to inputs/capacities.csv diff --git a/input.csv b/inputs/input.csv similarity index 100% rename from input.csv rename to inputs/input.csv diff --git a/partners.csv b/inputs/partners.csv similarity index 98% rename from partners.csv rename to inputs/partners.csv index 3ea8c59..3e09302 100644 --- a/partners.csv +++ b/inputs/partners.csv @@ -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 diff --git a/output1.csv b/output1.csv deleted file mode 100644 index 7c7b275..0000000 --- a/output1.csv +++ /dev/null @@ -1,4 +0,0 @@ -D1,true ,P1,2000 -D2,true ,P1,3250 -D3,true ,P3,15300 -D4,false,"","" diff --git a/output2.csv b/output2.csv deleted file mode 100644 index adcd15b..0000000 --- a/output2.csv +++ /dev/null @@ -1,4 +0,0 @@ -D1,true ,P2,3000 -D2,true ,P1,3250 -D3,true ,P3,15300 -D4,false,"","" diff --git a/outputs/output1.csv b/outputs/output1.csv new file mode 100644 index 0000000..6d31ec9 --- /dev/null +++ b/outputs/output1.csv @@ -0,0 +1,5 @@ +Problem Statement 1 Output +D1,true ,P1,2000, +D2,true ,P1,3250, +D3,true ,P3,15300, +D4,false ,"","" diff --git a/outputs/output2.csv b/outputs/output2.csv new file mode 100644 index 0000000..4be648c --- /dev/null +++ b/outputs/output2.csv @@ -0,0 +1,6 @@ +Problem Statement 2 Output +D1,true ,P2,3000 +D2,true ,P1,3250 +D3,true ,P3,15300 +D4,false ,"","" + diff --git a/package-lock.json b/package-lock.json new file mode 100644 index 0000000..503ec4c --- /dev/null +++ b/package-lock.json @@ -0,0 +1,231 @@ +{ + "name": "problem-statement-1", + "version": "1.0.0", + "lockfileVersion": 2, + "requires": true, + "packages": { + "": { + "name": "problem-statement-1", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "csv-parse": "^5.3.1", + "csv-parser": "^3.0.0", + "fast-csv": "^4.3.6" + }, + "devDependencies": {} + }, + "node_modules/@fast-csv/format": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", + "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", + "dependencies": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isboolean": "^3.0.3", + "lodash.isequal": "^4.5.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0" + } + }, + "node_modules/@fast-csv/parse": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", + "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", + "dependencies": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.groupby": "^4.6.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0", + "lodash.isundefined": "^3.0.1", + "lodash.uniq": "^4.5.0" + } + }, + "node_modules/@types/node": { + "version": "14.18.32", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.32.tgz", + "integrity": "sha512-Y6S38pFr04yb13qqHf8uk1nHE3lXgQ30WZbv1mLliV9pt0NjvqdWttLcrOYLnXbOafknVYRHZGoMSpR9UwfYow==" + }, + "node_modules/csv-parse": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-5.3.1.tgz", + "integrity": "sha512-R4Hv6eGJNzgcKdThZ6XORbSQ873HVcNke74QIq+LbwpT90LaZ8Xzl7KKiuIP16xq/P7ofzRt0h7S0xm+fVScsw==" + }, + "node_modules/csv-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/csv-parser/-/csv-parser-3.0.0.tgz", + "integrity": "sha512-s6OYSXAK3IdKqYO33y09jhypG/bSDHPuyCme/IdEHfWpLf/jKcpitVFyOC6UemgGk8v7Q5u2XE0vvwmanxhGlQ==", + "dependencies": { + "minimist": "^1.2.0" + }, + "bin": { + "csv-parser": "bin/csv-parser" + }, + "engines": { + "node": ">= 10" + } + }, + "node_modules/fast-csv": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", + "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", + "dependencies": { + "@fast-csv/format": "4.3.5", + "@fast-csv/parse": "4.3.6" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" + }, + "node_modules/lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==" + }, + "node_modules/lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "node_modules/lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "node_modules/lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" + }, + "node_modules/lodash.isnil": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", + "integrity": "sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==" + }, + "node_modules/lodash.isundefined": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", + "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==" + }, + "node_modules/lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "node_modules/minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + } + }, + "dependencies": { + "@fast-csv/format": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/@fast-csv/format/-/format-4.3.5.tgz", + "integrity": "sha512-8iRn6QF3I8Ak78lNAa+Gdl5MJJBM5vRHivFtMRUWINdevNo00K7OXxS2PshawLKTejVwieIlPmK5YlLu6w4u8A==", + "requires": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.isboolean": "^3.0.3", + "lodash.isequal": "^4.5.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0" + } + }, + "@fast-csv/parse": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/@fast-csv/parse/-/parse-4.3.6.tgz", + "integrity": "sha512-uRsLYksqpbDmWaSmzvJcuApSEe38+6NQZBUsuAyMZKqHxH0g1wcJgsKUvN3WC8tewaqFjBMMGrkHmC+T7k8LvA==", + "requires": { + "@types/node": "^14.0.1", + "lodash.escaperegexp": "^4.1.2", + "lodash.groupby": "^4.6.0", + "lodash.isfunction": "^3.0.9", + "lodash.isnil": "^4.0.0", + "lodash.isundefined": "^3.0.1", + "lodash.uniq": "^4.5.0" + } + }, + "@types/node": { + "version": "14.18.32", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.32.tgz", + "integrity": "sha512-Y6S38pFr04yb13qqHf8uk1nHE3lXgQ30WZbv1mLliV9pt0NjvqdWttLcrOYLnXbOafknVYRHZGoMSpR9UwfYow==" + }, + "csv-parse": { + "version": "5.3.1", + "resolved": "https://registry.npmjs.org/csv-parse/-/csv-parse-5.3.1.tgz", + "integrity": "sha512-R4Hv6eGJNzgcKdThZ6XORbSQ873HVcNke74QIq+LbwpT90LaZ8Xzl7KKiuIP16xq/P7ofzRt0h7S0xm+fVScsw==" + }, + "csv-parser": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/csv-parser/-/csv-parser-3.0.0.tgz", + "integrity": "sha512-s6OYSXAK3IdKqYO33y09jhypG/bSDHPuyCme/IdEHfWpLf/jKcpitVFyOC6UemgGk8v7Q5u2XE0vvwmanxhGlQ==", + "requires": { + "minimist": "^1.2.0" + } + }, + "fast-csv": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/fast-csv/-/fast-csv-4.3.6.tgz", + "integrity": "sha512-2RNSpuwwsJGP0frGsOmTb9oUF+VkFSM4SyLTDgwf2ciHWTarN0lQTC+F2f/t5J9QjW+c65VFIAAu85GsvMIusw==", + "requires": { + "@fast-csv/format": "4.3.5", + "@fast-csv/parse": "4.3.6" + } + }, + "lodash.escaperegexp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/lodash.escaperegexp/-/lodash.escaperegexp-4.1.2.tgz", + "integrity": "sha512-TM9YBvyC84ZxE3rgfefxUWiQKLilstD6k7PTGt6wfbtXF8ixIJLOL3VYyV/z+ZiPLsVxAsKAFVwWlWeb2Y8Yyw==" + }, + "lodash.groupby": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/lodash.groupby/-/lodash.groupby-4.6.0.tgz", + "integrity": "sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==" + }, + "lodash.isboolean": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", + "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==" + }, + "lodash.isequal": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", + "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==" + }, + "lodash.isfunction": { + "version": "3.0.9", + "resolved": "https://registry.npmjs.org/lodash.isfunction/-/lodash.isfunction-3.0.9.tgz", + "integrity": "sha512-AirXNj15uRIMMPihnkInB4i3NHeb4iBtNg9WRWuK2o31S+ePwwNmDPaTL3o7dTJ+VXNZim7rFs4rxN4YU1oUJw==" + }, + "lodash.isnil": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/lodash.isnil/-/lodash.isnil-4.0.0.tgz", + "integrity": "sha512-up2Mzq3545mwVnMhTDMdfoG1OurpA/s5t88JmQX809eH3C8491iu2sfKhTfhQtKY78oPNhiaHJUpT/dUDAAtng==" + }, + "lodash.isundefined": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/lodash.isundefined/-/lodash.isundefined-3.0.1.tgz", + "integrity": "sha512-MXB1is3s899/cD8jheYYE2V9qTHwKvt+npCwpD+1Sxm3Q3cECXCiYHjeHWXNwr6Q0SOBPrYUDxendrO6goVTEA==" + }, + "lodash.uniq": { + "version": "4.5.0", + "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", + "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" + }, + "minimist": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.7.tgz", + "integrity": "sha512-bzfL1YUZsP41gmu/qjrEk0Q6i2ix/cVeAhbCbqH9u3zYutS1cLg00qhrD0M2MVdCcx4Sc0UpP2eBWo9rotpq6g==" + } + } +} diff --git a/package.json b/package.json new file mode 100644 index 0000000..28c0020 --- /dev/null +++ b/package.json @@ -0,0 +1,17 @@ +{ + "name": "problem-statement-1", + "version": "1.0.0", + "description": "Qube delivers the movie content to theatres all around the world. There are multiple delivery partners to help us deliver the content.", + "main": "index.js", + "scripts": { + "test": "echo \"Error: no test specified\" && exit 1" + }, + "author": "Kumaran", + "license": "ISC", + "dependencies": { + "csv-parse": "^5.3.1", + "csv-parser": "^3.0.0", + "fast-csv": "^4.3.6" + }, + "devDependencies": {} +} diff --git a/parser/parser.js b/parser/parser.js new file mode 100644 index 0000000..fc1ad5e --- /dev/null +++ b/parser/parser.js @@ -0,0 +1,112 @@ +const csv = require('csv-parser') +const fs = require('fs') + +let PartnerList = [] +let InputList = [] +let capacitiesList = [] + +//Parsing the Partners CSV File +const GetPartnersDetails = async () => { + return new Promise((resolve, reject) => { + fs.createReadStream('./inputs/partners.csv') + .pipe(csv({ headers: false, skipLines: 1 })) + .on('data', (data) => { + try { + createPartnersList(data); + } + catch (err) { + console.error("Error parsing csv file : " + err) + reject(err) + } + }) + .on('end', () => { + resolve(PartnerList) + }); + PartnerList =[] + }) +} + + +//Spliting up the data by Key and Value for partners +const createPartnersList = (data) => { + PartnerList.push({ + "theatreID": data[0].trim(), + "slabMinSize": parseInt(data['1'].split('-')[0].trim()), + "slabMaxSize": parseInt(data['1'].split('-')[1].trim()), + "minimumCost": parseInt(data[2].trim()), + "costPerGB": parseInt(data[3].trim()), + "partnerID": data[4].trim(), + }) +} + + +//Parsing the Input CSV File +const getInputDetails = async () => { + return new Promise((resolve, reject) => { + fs.createReadStream('./inputs/input.csv') + .pipe(csv({headers:false})) + .on('data',(data) => { + try { + createInputList(data) + } + catch (err) { + console.error("Error parsing csv file : " + err) + reject(err) + } + }) + .on('end', () => { + resolve(InputList) + }); + InputList = [] + }) +} + + +//Spliting up the data by Key and Value for input +const createInputList = (data) => { + InputList.push({ + "deliveryID":data[0].trim(), + "deliverySize": parseInt(data[1].trim()), + "theatreID": data[2].trim(), + }) +} + +//Parsing the capacities CSV File +const getCapacitiesDetails = async () => { + return new Promise((resolve, reject) => { + fs.createReadStream('./inputs/capacities.csv') + .pipe(csv({headers:false, skipLines: 1})) + .on('data',(data) => { + try { + createCapacitiesList(data) + } + catch (err) { + console.error("Error parsing csv file : " + err) + reject(err) + } + }) + .on('end', () => { + resolve(capacitiesList) + }); + capacitiesList = [] + }) +} + + +//Spliting up the data by Key and Value for capacities +const createCapacitiesList = (data) => { + capacitiesList.push({ + "partnerID":data[0].trim(), + "capacityInGB": parseInt(data[1].trim()), + }) +} + + + +//Exporting all the Functions +module.exports = { + GetPartnersDetails, + getInputDetails, + getCapacitiesDetails +} + diff --git a/problem/problem1.js b/problem/problem1.js new file mode 100644 index 0000000..04859e8 --- /dev/null +++ b/problem/problem1.js @@ -0,0 +1,62 @@ + +const parser = require('../parser/parser.js') +const fs = require('fs') + +const minimumDeliveryCost = async () => { + + fs.writeFile('../challenge2019/outputs/output1.csv', '', (err) => { + if (err) throw err; + console.log('Erased Output1!'); + }); + + const partnersData = await parser.GetPartnersDetails() + const inputData = await parser.getInputDetails() + + let minimumCost = ""; + let partnerID = ""; + let deliveryStatus = false; + let fileContent = []; + + inputData.forEach((delivery, index) => { + let currentTheatre = partnersData.filter((value) => (value.theatreID === delivery.theatreID)) + + currentTheatre.forEach((currentPartner) => { + if (delivery.deliverySize <= currentPartner.slabMaxSize && delivery.deliverySize >= currentPartner.slabMinSize) { + deliveryStatus = true; + //if total cost comes less than minimum cost, minimum cost will be charged. + let totalCost = (delivery.deliverySize * currentPartner.costPerGB) > currentPartner.minimumCost ? (delivery.deliverySize * currentPartner.costPerGB) : currentPartner.minimumCost; + if (minimumCost != "") { + if (minimumCost > totalCost) { + minimumCost = totalCost + partnerID = currentPartner.partnerID + } + } else { + minimumCost = totalCost; + partnerID = currentPartner.partnerID + } + } + }) + + + if (index == 0) { + fileContent.push(`Problem Statement 1 Output \n${delivery.deliveryID},${deliveryStatus} ,${partnerID},${minimumCost}`) + } + else { + fileContent.push(`\n${delivery.deliveryID},${deliveryStatus} ,${partnerID != "" ? partnerID : '""'},${minimumCost != "" ? minimumCost : '""'}`) + } + + minimumCost = ""; + partnerID = ""; + deliveryStatus = false; + }) + + fs.appendFileSync("./outputs/output1.csv", fileContent + "\n"); + +} + + + +module.exports = { + minimumDeliveryCost +} + diff --git a/problem/problem2.js b/problem/problem2.js new file mode 100644 index 0000000..fc7c4eb --- /dev/null +++ b/problem/problem2.js @@ -0,0 +1,77 @@ +const parser = require('../parser/parser.js') +const fs = require('fs') + +const minimumCapacity = async () => { + + fs.writeFile('../challenge2019/outputs/output2.csv', '', (err) => { + if (err) throw err; + console.log('Erased Output2!'); + }); + + + const partnersData = await parser.GetPartnersDetails() + const inputData = await parser.getInputDetails() + const capacitiesData = await parser.getCapacitiesDetails() + + let minimumCost = ""; + let partnerID = ""; + let deliveryStatus = false; + let fileContent = ''; + let output = []; + + inputData.sort(function (a, b) { + return parseInt(b.deliverySize) - parseInt(a.deliverySize); + }); + + inputData.forEach((delivery, index) => { + let currentTheatre = partnersData.filter((value) => (value.theatreID === delivery.theatreID)) + currentTheatre.forEach((currentPartner, index) => { + // get the current partner capacity in Gb + let currentPartnerCapacity = capacitiesData.filter((value) => value.partnerID === currentPartner.partnerID)[0].capacityInGB; + // check partner capacity is greater than or equal to delivery. + if (delivery.deliverySize <= currentPartner.slabMaxSize && delivery.deliverySize >= currentPartner.slabMinSize && currentPartnerCapacity >= delivery.deliverySize) { + deliveryStatus = true; + //if total cost comes less than minimum cost, minimum cost will be charged. + let totalCost = (delivery.deliverySize * currentPartner.costPerGB) > currentPartner.minimumCost ? (delivery.deliverySize * currentPartner.costPerGB) : currentPartner.minimumCost; + if (minimumCost != "") { + if (minimumCost > totalCost) { + minimumCost = totalCost + partnerID = currentPartner.partnerID + } + } else { + minimumCost = totalCost; + partnerID = currentPartner.partnerID + } + } + + }) + if (deliveryStatus) { + capacitiesData.filter((value) => value.partnerID === partnerID).forEach((Val) => Val.capacityInGB = Val.capacityInGB - delivery.deliverySize) + } + + output.push(`${delivery.deliveryID},${deliveryStatus} ,${partnerID != "" ? partnerID : '""'},${minimumCost != "" ? minimumCost : '""'}`); + + minimumCost = ""; + partnerID = ""; + deliveryStatus = false; + }) + + output.sort(); + fileContent = ''; + output.forEach((data, index) => { + if (index == 0) { + fileContent += `Problem Statement 2 Output \n${data} \n` + } + else { + fileContent += `${data}\n` + } + }) + + + fs.appendFileSync("./outputs/output2.csv", fileContent + "\n"); + +} + +module.exports = { + minimumCapacity +} \ No newline at end of file diff --git a/types.ts b/types.ts new file mode 100644 index 0000000..e63adbb --- /dev/null +++ b/types.ts @@ -0,0 +1,14 @@ +export interface inputObject { + deliveryID:string, + deliverySize:Number, + theatreID:string +} + +export interface partnersObject { + theatreID:string, + slabMinSize:Number, + slabMaxSize:Number, + minimumCost:Number, + costPerGB:Number, + partnerID:string +}