DEV Community

loading...

JavaScript Code Daily Challenge #6

lakshyatyagi24 profile image Lakshya Tyagi ・1 min read

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

Discussion

pic
Editor guide
Collapse
darkwiiplayer profile image
DarkWiiPlayer

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 Author
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
DarkWiiPlayer

Where'd you get the 100 from?

Collapse
lakshyatyagi24 profile image
Lakshya Tyagi Author

Open the link given in the question and check the constraints

Alt Text

Thread Thread
darkwiiplayer profile image
DarkWiiPlayer

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