1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49
| const encoder = {
alphabet: new Map([
['W', { position: 0, width: 2, group: 0 }], ['Q', { position: 2, width: 2, group: 0 }],
['B', { position: 4, width: 3, group: 0 }], ['C', { position: 7, width: 4, group: 0 }],
['N', { position: 11, width: 5, group: 0 }], ['E', { position: 16, width: 6, group: 0 }],
['K', { position: 0, width: 3, group: 1 }], ['V', { position: 3, width: 3, group: 1 }],
['G', { position: 6, width: 3, group: 1 }], ['U', { position: 9, width: 4, group: 1 }],
['R', { position: 13, width: 4, group: 1 }],
['J', { position: 0, width: 2, group: 2 }], ['Z', { position: 2, width: 3, group: 2 }],
['D', { position: 5, width: 3, group: 2 }], ['L', { position: 8, width: 4, group: 2 }],
['I', { position: 12, width: 6, group: 2 }],
['X', { position: 0, width: 2, group: 3 }], ['H', { position: 2, width: 3, group: 3 }],
['P', { position: 5, width: 3, group: 3 }], ['O', { position: 8, width: 5, group: 3 }],
['A', { position: 13, width: 5, group: 3 }],
['Y', { position: 0, width: 2, group: 4 }], ['F', { position: 2, width: 3, group: 4 }],
['M', { position: 5, width: 4, group: 4 }], ['T', { position: 9, width: 5, group: 4 }],
['S', { position: 14, width: 7, group: 4 }]
]),
proceed: function(letters) {
let result = [0, 0, 0, 0, 0];
for (const letter of letters) {
const bitsRange = this.alphabet.get(letter);
const mask = (2**bitsRange.width - 1) << bitsRange.position; // 2**5 - 1 => 11111 << 3 => 11111_000
// on extrait la plage de bits de la lettre grâce au masque: 0111_00011_001 & 11111_000 = 00011_000
let range = result[bitsRange.group] & mask;
// on décale d'un bit vers la gauche et on "allume" le 1er bit: 00011_000 => 00110_000 => 00111_000
range = (range << 1) | (1 << bitsRange.position);
// par sécurité on applique de nouveau le masque pour éliminer un éventuel bit sortant de la plage
// suite au décalage: 0000_11111_000 => 0001_11110_000 => 0001_11111_000 & 11111_000 = 0000_11111_000
range &= mask;
// on met à jour la plage avec la nouvelle via un OR: 0111_00011_001 | 00111_000 = 0111_00111_001
result[bitsRange.group] |= range;
}
return result;
}
}; |
Partager