Skip to content

Instantly share code, notes, and snippets.

@BenjaminHolland
Created May 13, 2018 20:34
Show Gist options
  • Save BenjaminHolland/693685853b5b1cc66ff934875229e231 to your computer and use it in GitHub Desktop.
Save BenjaminHolland/693685853b5b1cc66ff934875229e231 to your computer and use it in GitHub Desktop.
let input: [boolean] = [
true, true, true,
false, false,
true, true,
false,
true,
false,
true,
false, false]
//Edge Trigger Model
function solve2(input: [boolean]): [number, number][] {
let intervals: [number, number][] = new Array<[number, number]>();
let start: number = 0, end: number = 0;
input.push(input[0]);
for (let idx = 1; idx < input.length; idx++) {
//Are we at an edge?
if (input[idx] != input[idx - 1]) {
//Is the edge the start or end of a flippable interval?
if (input[idx] != input[0]) {
start = idx;
} else {
end = idx-1;
intervals.push([start,end])
}
}
}
return intervals;
}
//State Machine Model
function solve(input: [boolean]): [number, number][] {
let intervals: [number, number][] = new Array<[number, number]>();
let start: number = 0, end: number = 0;
for (let idx = 0; idx < input.length; idx++) {
//State: Not in an interval
//Trigger: Detected secondary data element.
//Response: start an interval.
if (start == 0 && input[idx] != input[0]) {
start = idx;
}
//State: In an interval and should stop.
//Trigger: Detected primary data element.
//Response: end and record the interval.
else if (start != 0 && input[idx] == input[0]) {
end = idx - 1;
intervals.push([start, end]);
start == 0;
}
}
if (start != 0) {
intervals.push([start, input.length - 1]);
}
return intervals;
}
console.log(solve2(input));
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment