Skip to content

Submission: JavaScript (Single-Process) #2

Open
@mykeels

Description

@mykeels
  • Time ~5137ms
  • Hardware:
      Processor Name: Intel Core i5
      Processor Speed: 2.3 GHz
      Number of Processors: 1
      Total Number of Cores: 2
      L2 Cache (per Core): 256 KB
      L3 Cache: 4 MB
      Memory: 16 GB
  • Program:
const fs = require('fs')
const path = require('path')
const readline = require('readline')
const basePath = '<path-to-files-directory>'

const getFiles = () => {
    return new Promise((resolve, reject) => {
        fs.readdir(basePath, (err, folders) => {
            if (err) {
                reject(err)
            }
            else {
                resolve(
                    Promise.all(folders.map(dir => {
                        const dirPath = path.join(basePath, dir)
                        return new Promise((resolve, reject) => {
                            fs.readdir(dirPath, (err, files) => {
                                if (err) {
                                    reject(err)
                                }
                                else {
                                    resolve(files.map(file => path.join(dirPath, file)))
                                }
                            })
                        })
                    })).then(files => files.reduce((a, b) => a.concat(b)))
                )
            }
        })
    })
}

console.time('total')
let total = 0
getFiles()
    .then(function* (files) {
        for (let file of files) {
            yield new Promise((resolve, reject) => {
                const lineReader = readline.createInterface({
                    input: fs.createReadStream(file)
                })
                
                let fileSum = 0
    
                lineReader.on('line', line => {
                    let lineSum = 0
                    let current = 0
                    for(let i = 0; i < line.length; i++) {
                        let char = line[i]
                        if (char != ',' ) {
                            if (current === 0) {
                                current = +char
                            }
                            else {
                                current = (current * 10) + (+char)
                            }
                        }
                        if ((char === ',') || (i === (line.length - 1))) {
                            lineSum += current
                            current = 0
                        }
                    }
                    fileSum += lineSum
                })
    
                lineReader.on('close', () => {
                    total += fileSum
                    resolve(fileSum)
                })
            })
        }
    })
    .then(sums => {
        return Promise.all(sums)
    })
    .then(() => {
        console.log(total)
        console.timeEnd('total')
    })
    .catch(err => {
        console.error(err)
    })

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions