Skip to content

Instantly share code, notes, and snippets.

@danielberndt
Created October 20, 2023 08:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save danielberndt/19857421171dbb07a3681f0ea6634049 to your computer and use it in GitHub Desktop.
Save danielberndt/19857421171dbb07a3681f0ea6634049 to your computer and use it in GitHub Desktop.
Sequences
const lettersToSequence = (
letters: string,
{startVal = 0, implicitZero = false}: {startVal: number; implicitZero: boolean} = {
startVal: 0,
implicitZero: false,
}
) => {
const length = letters.length;
const letterToIndex = letters.split("").reduce((memo, letter, index) => {
memo[letter] = index;
return memo;
}, {} as {[l: string]: number});
return {
intToSeq(intVal: number) {
const seq = [];
let q = intVal + startVal;
if (implicitZero) q += 1;
let r;
do {
if (implicitZero) q += -1;
r = q % length;
q = Math.floor(q / length);
seq.unshift(letters[r]);
} while (q);
return seq.join("");
},
seqToInt(seq: string) {
let intVal = letterToIndex[seq[0]] || 0;
for (let i = 1; i < seq.length; i += 1) {
if (implicitZero) intVal += 1;
intVal *= length;
intVal += letterToIndex[seq[i]];
}
return intVal - startVal;
},
letters,
};
};
export const alphaSeq = lettersToSequence(
"0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
);
export const pronounceSafeSeq = lettersToSequence("123456789acefghijkoqrsuvwxyz", {
startVal: 28 * 29 - 1,
implicitZero: true,
});
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment