Skip to content

Instantly share code, notes, and snippets.

@BrianRosamilia
Created November 6, 2020 01:26
Show Gist options
  • Save BrianRosamilia/4740529d0139514edc3a5e87a731054d to your computer and use it in GitHub Desktop.
Save BrianRosamilia/4740529d0139514edc3a5e87a731054d to your computer and use it in GitHub Desktop.
/*
Given a river, determine whether it is crossable.
river = 'o~o~~o~~~o~~~~'
S 2 3 4 5 => true
river = 'ooo~o'
111 2
'o~o~~o~~ooo~~'
1 2 3 3
o rock
~ water
At any point your speed is k
Your next speed can be k - 1, k, or k + 1
starting speed is 1
*/
function crossRiver(river) {
let speed = 1;
let moves = [];
let visited = [];
let i = 0;
while (i < river.length) {
if (i + speed + 1 >= river.length || i + speed >= river.length) return true;
if (river[i + speed + 1] == 'o' && !visited[i + speed + 1]) {
i = i + speed + 1;
speed++;
moves.push(speed + 1);
visited[i] = true;
} else if (river[i + speed] == 'o' && !visited[i + speed]) {
i = i + speed;
moves.push(speed);
visited[i] = true;
} else if (river[i + speed - 1] == 'o' && !visited[i + speed - 1]) {
i = i + speed - 1;
speed--;
moves.push(speed - 1);
visited[i] = true;
} else if (moves.length) {
i = i - moves.pop();
} else {
return false;
}
};
return true;
}
console.log(crossRiver('o~o~~o~~oo~o~~~'));
console.log(crossRiver('o~o~~o~~~o~~~~'));
console.log(crossRiver('o~o~~o~~ooo~~'));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment