loading...

Daily Challenge #295 - Sort Leaderboards

thepracticaldev profile image dev.to staff ・1 min read

In this challenge, you'll be given a leaderboard in the form of an array, as well as a list of strings. Using the information in the list, sort the leaderboard.

Example

array:

['John',
 'Brian',
 'Jim',
 'Dave',
 'Fred']

list:
['Dave +1', 'Fred +4', 'Brian -1']

The steps for our example would be:

# Dave up 1
['John',
 'Brian',
 'Dave',
 'Jim',
 'Fred']
# Fred up 4
['Fred',
 'John',
 'Brian',
 'Dave',
 'Jim']
# Brian down 1
['Fred',
 'John',
 'Dave',
 'Brian',
 'Jim']

Then, we return the completed leaderboard:

['Fred',
 'John',
 'Dave',
 'Brian',
 'Jim']

Strings will never ask you to move a name higher or lower than possible. The strings in the list will always be a name in the leaderboard, followed by a space and a positive or negative number.

Tests

leaderboardSort(['John', 'Brian', 'Jim', 'Dave', 'Fred'], ['Dave +1', 'Fred +4', 'Brian -1'])
leaderboardSort(['Bob', 'Larry', 'Kevin', 'Jack', 'Max'], ['Max +3', 'Kevin -1', 'Kevin +3'])

Good luck!


This challenge comes from topping on CodeWars. Thank you to CodeWars, who has licensed redistribution of this challenge under the 2-Clause BSD License!

Want to propose a challenge idea for a future post? Email yo+challenge@dev.to with your suggestions!

Discussion

pic
Editor guide
Collapse
_bkeren profile image
''

JS

const leaderboardSort = (list, stepList) =>
{
    stepList.forEach(stepInfo => {
        let [name, step] = stepInfo.split(" ")
        step = +step
        const nameIndex = list.indexOf(name)
        list.splice(nameIndex,1)
        list.splice(nameIndex-step,0,name)
    })
    return list
}
Collapse
citizen428 profile image
Michael Kohl

Ruby, does not modify the passed in array but returns a new one instead:

def leaderboard_sort(board, steps)
  steps.each_with_object(board.dup) do |s, b|
    name, step = s.split
    name_idx = b.index(name)
    b.delete_at(name_idx)
    b.insert(name_idx - step.to_i, name)
  end
end
Collapse
caleb_rudder profile image
Caleb Rudder

Javascript!

function leaderboardSort(leaderBoard, moveList){
    moveList.forEach(element => {
        let moveInfo = element.split(' ');
        let player = moveInfo[0];
        let moveAmmount = moveInfo[1];
        let currentIndex = leaderBoard.indexOf(player);
        let newIndex = currentIndex - moveAmmount;

        if(newIndex < currentIndex){
            for(let i = currentIndex; i > newIndex; i--){
                leaderBoard[i] = leaderBoard[i-1];
            }
            leaderBoard[newIndex] = player;
        }else{
            for(let i = currentIndex; i < newIndex; i++){
                //move everything up one
                leaderBoard[i] = leaderBoard[i+1];
            }
            leaderBoard[newIndex] = player;
        }

    });
    return leaderBoard;
}