DEV Community

Lakshya Tyagi
Lakshya Tyagi

Posted on

JavaScript Code Daily Challenge #6

About

This is a series of JavaScript Code Daily Challenge. Each day I show a few solutions written in JavaScript. The questions are from coding practice/contest sites such as HackerRank, LeetCode, Codeforces, Atcoder and etc.

Between Two Sets
https://www.hackerrank.com/challenges/between-two-sets

'use strict';

const fs = require('fs');

process.stdin.resume();
process.stdin.setEncoding('utf-8');

let inputString = '';
let currentLine = 0;

process.stdin.on('data', function(inputStdin) {
    inputString += inputStdin;
});

process.stdin.on('end', function() {
    inputString = inputString.split('\n');

    main();
});

function readLine() {
    return inputString[currentLine++];
}
Enter fullscreen mode Exit fullscreen mode

Complete the 'getTotalX' function in comment.
The function is expected to return an INTEGER.

function getTotalX(a, b) {

}
Enter fullscreen mode Exit fullscreen mode
function main() {
    const ws = fs.createWriteStream(process.env.OUTPUT_PATH);

    const firstMultipleInput = readLine().replace(/\s+$/g, '').split(' ');

    const n = parseInt(firstMultipleInput[0], 10);

    const m = parseInt(firstMultipleInput[1], 10);

    const arr = readLine().replace(/\s+$/g, '').split(' ').map(arrTemp => parseInt(arrTemp, 10));

    const brr = readLine().replace(/\s+$/g, '').split(' ').map(brrTemp => parseInt(brrTemp, 10));

    const total = getTotalX(arr, brr);

    ws.write(total + '\n');

    ws.end();
}
Enter fullscreen mode Exit fullscreen mode

Top comments (5)

Collapse
 
darkwiiplayer profile image
𒎏Wii 🏳️‍⚧️ • Edited

Here's my (somewhat optimized) answer written in Lua:

Intuitively, I'd say this should run in O(n) time using O(1) memory.

local function gcd(a, b)
    return b == 0 and a or gcd(b, a%b)
end

local function lcm(a, b)
    return a * b / gcd(a, b)
end

local function fold(sequence, fn)
    local acc = sequence[1]
    for i=2,#sequence do
        acc = fn(acc, sequence[i])
    end
    return acc
end

local function getTotalX(A, B)
    local min = fold(A, lcm)
    local max = fold(B, gcd)

    local acc = 0
    for i=min,max,min do
        if (max % i) == 0 then
            acc = acc+1
        end
    end

    return acc
end
Enter fullscreen mode Exit fullscreen mode

EDIT: Here's the same algorithm but in Ruby

def getTotalX(a, b)
    min = a.inject(&:lcm)
    max = b.inject(&:gcd)

    (min..max).step(min).count{ |num| (max % num == 0)}
end
Enter fullscreen mode Exit fullscreen mode
Collapse
 
lakshyatyagi24 profile image
Lakshya Tyagi
function getTotalX(a, b) {
    let validCount = 0;

    for (let x = 1; x <= 100; x++) {
        if (a.every(int => (x % int == 0))) {
            if (b.every(int => (int % x == 0))) {
                validCount++;
            }
        }
    }

    return validCount;
}
Enter fullscreen mode Exit fullscreen mode
Collapse
 
darkwiiplayer profile image
𒎏Wii 🏳️‍⚧️

Where'd you get the 100 from?

Collapse
 
lakshyatyagi24 profile image
Lakshya Tyagi

Open the link given in the question and check the constraints

Alt Text

Thread Thread
 
darkwiiplayer profile image
𒎏Wii 🏳️‍⚧️

Ah, I see. Well, you can still choose a smaller number though.