آزمون

آسانسوری در یک ساختمان با تعداد طبقات M وجود دارد، ظرفیت قابل حمل توسط این آسانسور حداکثر X نفر و حداکثر Y کیلوگرم وزن است.
نیاز به برنامه ای داریم تا با دریافت مقادیر M و X و Y و اطلاعات افرادی که قصد استفاده از این آسانسور را دارند شامل وزن و طبقه مورد نظر هر فرد ، محاسبه کند که آسانسور چند بار باید در طبقات مختلف توقف کرده و سپس به طبقه همکف بازگردد.
دقت کنید آسانسور باید افراد را به ترتیب اولویت در طبقه مورد نظر پیاده کند.
مثال

M = 5 تعداد طبقات
X = 2 حداکثر ظرفیت افراد
Y = 200 حداکثر مجموع وزن افراد
A = [60,80,40] آرایه ای شامل وزن افراد
B = [2,3,5] آرایه ای شامل طبقه مورد نظر هر فرد

 با توجه به ورودی های بالا آسانسور در ابتدا میتواند تنها 2 نفر از 3 نفر را از طبقه همکف منتقل کرده و ابتدا به طبقه 2 و سپس به طبقه 3 برود ، سپس به طبقه همکف بازگردد و نفر سوم وارد آسانسور شده و او را به طبقه 5 ببرد و سپس مجددا به طبقه همکف باگردد بنابراین تعدا توقف های لازم آسانسور 5 بار می باشد و خروجی برنامه شما باید 5 باشد

زمان پاسخگویی : 90 دقیقه | زبان کدنویسی : javascript

منبع

پاسخ
/**
 * Remove duplicate items from an array
 * @param {Array} arr
 * @returns {Array}
 */
function uniq(arr) {
    return arr.reduce((prev, curr) => {
        if (prev.indexOf(curr) === -1) {
            prev = prev.concat(curr);
        }
        return prev;
    }, []);
}

/**
 * Solution to our problem
 * 
 * @param {Array.}  A Array of passengers weights
 * @param {Array.}  B Array of passenger destination floors
 * @param {Number}          M Number of floors in the building 
 * @param {Number}          X Elevator max passenger capacity
 * @param {Number}          Y Elevator max weight capacity
 * @returns {Number}        Number of total stops
 */
function solution(A, B, M, X, Y) {
    let trip = 0,
        tripWeight = 0,
        rounds = [];

    for (let i = 0, len = A.length; i < len; i += 1) {
        // If there's an unclosed trip, let’s see if we can get more people in
        if (typeof rounds[trip] !== 'undefined') {
            // Check if we have filled the capacity for the current trip,
            // if so, then close the existing trip and create a new one
            if (rounds[trip].length === X || tripWeight + A[i] > Y) {
                // Increase trip count
                trip++;
                // Reset current weight
                tripWeight = 0;
            }
        }

        // Create an empty array for the current trip
        rounds[trip] = rounds[trip] || [];
        // Push passengers destination to current trip
        rounds[trip].push(B[i]);  
        // Increase current load
        tripWeight += A[i];
    }

    // Remove duplicate floors from each trip, since
    // the elevator will make 1 stop for pessengers that
    // go to the same floor. Then add 1 (return to ground floor)
    rounds = rounds.map(round => uniq(round).length + 1);

    // To get number of total stops, we sum up
    // destination count in each trip.
    return rounds.reduce((prev, curr) => prev + curr, 0);
}

console.log(
    solution(
        [60, 80, 40],   // Weights
        [2, 3, 5],      // Destinations
        5,              // Floors
        2,              // Max passengers
        200             // Max weight
    )
); // -> 5