javascriptarraysloopsconditional-statementsboolean

Toggle Boolean on 'flick'


Have a next task

Create a function that always returns True/true for every item in a given list. However, if an element is the word 'flick', switch to always returning the opposite boolean value.

Examples

['codewars', 'flick', 'code', 'wars'] // ➞ [True, False, False, False]

['flick', 'chocolate', 'adventure', 'sunshine'] // ➞ [False, False, False, False]

['bicycle', 'jarmony', 'flick', 'sheep', 'flick'] // ➞ [True, True, False, False, True]

["flick", "flick", "flick", "flick", "flick"]) // ➞ [false, true, false, true, false]

How I understand problem statment.

If an element in the array is 'flick', it toggles a switch. 'flick' may turn the switch to false, and the elements after it will follow this state. If the next 'flick' is encountered, it toggles the switch again to true, and the following elements will follow that state, and so on.

Here is how I solved this task.

function flickSwitch(arr) {
    let flag = true
    let array = [];
    for (let i = 0; i < arr.length; i++) {
        if (arr[i].toLowerCase() == 'flick') {
            flag = false;
            array.push(flag);
        } else {
            array.push(flag);
        }
    }
    return array;
}

console.log(flickSwitch(["codewars", "flick", "code", "wars"]));

And most of the tests passed successfully.

But if there are two 'flick' elements next to each other in the array, like ["codewars", "flick", "flick", "wars"], my solution breaks.

How can I solve this problem? Please help me!


Solution

  • The problem with the code you wrote is that when 'flick' is seen you set the flag to false but you want toggle so you need to replace `flag = !flag`
    boolean = !boolean always stores the opposite of the previous state.

    Modify your code

    function flickSwitch(arr) {
        let flag = true
        let array = [];
        for (let i = 0; i < arr.length; i++) {
            if (arr[i].toLowerCase() == 'flick') {
                flag = !flag;  // just here is changed
                array.push(flag);
            } else {
                array.push(flag);
            }
        }
        return array;
    }
    
    console.log(flickSwitch(["codewars", "flick", "code", "wars"]));