Pour trouver une lettre à partir de sa position dans l’alphabet, nous pouvons faire exactement l’inverse que pour la transformation de lettre en nombre. 🎉
/**
* Returns the letter according to the alphabet position
*
* @param {number} position - The position in the alphabet
* @return {string} letter - A letter
*/
function getLetterByAlphabeticPosition(position) {
return (position + 9).toString(36);
}
Cette implémentation fonctionne très bien sur un jeu de données valide, mais produit des résultats inattendu sur les nombres inférieurs à 1 et supérieurs 26.
getLetterByAlphabeticPosition(1); // ✔ "a"
getLetterByAlphabeticPosition(26); // ✔ "z"
getLetterByAlphabeticPosition(27); // ⨯ 10
getLetterByAlphabeticPosition(0); // ⨯ 9
getLetterByAlphabeticPosition(-25); // ⨯ -g
getLetterByAlphabeticPosition(-26); // ⨯ -h
const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");
/**
* Returns the letter according to the alphabet position
*
* @param {number} position - The position in the alphabet
* @return {string} letter - A letter
*/
function getLetterByAlphabeticPosition(position) {
if (position < 1 || position > alphabet.length) {
return false;
}
return alphabet[position - 1];
}
getLetterByAlphabeticPosition(1); // ✔ "A"
getLetterByAlphabeticPosition(26); // ✔ "Z"
getLetterByAlphabeticPosition(27); // ✔ false
getLetterByAlphabeticPosition(0); // ✔ false
getLetterByAlphabeticPosition(-25); // ✔ false
getLetterByAlphabeticPosition(-26); // ✔ false
Le problème restant sera de gérer des débordements cycliques, si 26
donne Z
alors il faudrait
que 27
donne A
! Avec un code Vigenere, ou un code Cesar,
on boucle si on arrive au bout de l’alphabet.
Pour cela, nous allons utiliser l’opération mathématique modulo. Nous allons utiliser une implémentation améliorée et étudiée dans des articles précédents pour :
Voici ma solution pour convertir un nombre en lettre tout en gérant des débordements cycliques.
/**
* Returns the letter according to the alphabet position
* handles cyclic overflows, Ex: 1->A, 26->Z, 27->A, 0->Z
*
* @param {number} position - The position in the alphabet
* @return {string} letter - A letter
*/
function numberToLetter(position) {
return getLetterByAlphabeticPosition(
moduloClamp(position, 1, alphabet.length)
);
}
const alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ".split("");
// See https://tzi.fr/js/convertir-nombres-en-lettres/
function getLetterByAlphabeticPosition(position) {
if (position < 1 || position > alphabet.length) {
return false;
}
return alphabet[position - 1];
}
// See https://tzi.fr/js/modulos-min-max
function moduloClamp(number, min, max) {
return positiveModulo(number - min, max + 1 - min) + min;
}
// See https://tzi.fr/js/modulos-positifs
function positiveModulo(number, divisor) {
return ((number % divisor) + divisor) % divisor;
}
numberToLetter(1); // ✔ "A"
numberToLetter(2); // ✔ "B"
numberToLetter(26); // ✔ "Z"
numberToLetter(27); // ✔ "A"
numberToLetter(0); // ✔ "Z"
numberToLetter(-25); // ✔ "A"
numberToLetter(-26); // ✔ "Z"
console.log(numberToLetter(1));
console.log(numberToLetter(0));
console.log(numberToLetter(-1));