Search code examples
javascriptarraysminimum

Minimum number of digit changes to get two arrays to have the same value


I am pretty new to coding and I'm trying my best, but after hours and hours of research i still cant figure this out. I'm trying to make these two separate arrays the same with the minimum number of moves. I can only ++ or -- one number at a time.

This is the challenge:

No reordering of the digits is allowed For example, consider two arrays: Andrea's [123, 543] and Maria's [321, 279]. For the first digit, Andrea can increment the 1 twice to achieve 3. The 2's are equal already. Finally, she decrements her 3 twice to equal 1. It took 4 moves to reach her goal. For the second integer, she decrements 5 three times, increments 4 three times and 3 six times. It took 12 moves to convert the second array element. In total, it took 16 moves to convert both values comprising the complete array.

let a = [1234, 4321]
let m = [2345, 3214]

function minimumMoves(a, m) {
    // Write your code here
    let numMoves = 0;
    let num1 = '' ;
    let num2 = '' ;
    let digit1 = '';
    let digit2= '';
    for (let i = 0; i < a.length; i++)
    {
        num1 = a[i]; 
        while (num1 != 0) {
            digit1 = num1 % 10; 
            digit2 = num2 % 10; 
            num1 = Math.trunc(num1 / 10); 
            num2 = Math.trunc(num2 / 10);
            numMoves = numMoves + Math.abs(digit1 - digit2);

        }
    }
    return numMoves
}

Solution

  • Check this code out:

    a = [1234, 4321]
    b = [2345, 3214]
    
    function minimumMoves(a, m) {
        let numMoves1 = 0, numMoves2 = 0;
        let num1 = '', num2 = '';
        let digit1 = '', digit2 = '';
        //Forward
        for (let i = 0 ; i < a.length ; i++)
        {
            num1 = a[i];
            num2 = m[i];
            for (let j = 0 ; j < a.length ; j++)
            {
                digit1 = num1 % 10;
                digit2 = num2 % 10;
                numMoves1 += Math.abs(digit1-digit2);
                num1 = (num1 - digit1) / 10;
                num2 = (num2 - digit2) / 10;
            }
        }
        //Backward
        for (let i = 0 ; i < a.length ; i++)
        {
            num1 = m[i];
            num2 = a[i];
            for (let j = 0 ; j < a.length ; j++)
            {
                digit1 = num1 % 10;
                digit2 = num2 % 10;
                numMoves2 += Math.abs(digit1-digit2);
                num1 = (num1 - digit1) / 10;
                num2 = (num2 - digit2) / 10;
            }
        }
        if (numMoves1>numMoves2)
        {
            //Answer is numMoves1
        } else if (numMoves1<numMoves2)
        {
            //Answer is numMoves2
        } else {
            //Answer is any one, i.e, either numMoves1 or numMoves2
        }
    }
    

    If you need quick verification for this code, navigate Here.

    And then paste this code:

    /******************************************************************************
    
                                Online Java Compiler.
                    Code, Compile, Run and Debug java program online.
    Write your code in this editor and press "Run" button to execute it.
    
    *******************************************************************************/
    
    public class Main
    {
        public static void main(String[] args) {
            Integer[] a = {1234, 4321};
            Integer[] m = {2345, 3214};
            Integer numMoves1 = 0, numMoves2 = 0;
            Integer num1 = 0, num2 = 0;
            Integer digit1 = 0, digit2 = 0;
            //Forward
            for (Integer i = 0 ; i < a.length ; i++)
            {
                num1 = a[i];
                num2 = m[i];
                for (Integer j = 0 ; j < a.length ; j++)
                {
                    digit1 = num1 % 10;
                    digit2 = num2 % 10;
                    numMoves1 += Math.abs(digit1-digit2);
                    num1 = (num1 - digit1) / 10;
                    num2 = (num2 - digit2) / 10;
                }
            }
            //Backward
            for (Integer i = 0 ; i < a.length ; i++)
            {
                num1 = m[i];
                num2 = a[i];
                for (Integer j = 0 ; j < a.length ; j++)
                {
                    digit1 = num1 % 10;
                    digit2 = num2 % 10;
                    numMoves2 += Math.abs(digit1-digit2);
                    num1 = (num1 - digit1) / 10;
                    num2 = (num2 - digit2) / 10;
                }
            }
            if (numMoves1>numMoves2)
            {
                //Answer is numMoves1
            } else if (numMoves1<numMoves2)
            {
                //Answer is numMoves2
            } else
            {
                //Answer is any one, i.e, either numMoves1 or numMoves2
            }
            System.out.println(numMoves1 + " & " + numMoves2);
        }
    }
    

    I hope this algorithm helps ;)