Stocker la chaîne dans une image est hors propos à cause de la demande initiale de cryptage numérique circulaire.
Néanmoins je confirme la possibilité du stockage d'une chaîne dans une Image.
- Spoiler:
Moi je stocke et relit des images dans des chaînes à la résolution de 6 à 8 bits par token. Ce travail n'est que l'association de tokens à des nombre suivi d'un travail binaire de sprite. J'ai vaincu Persalteas au jeu de l'image du concours d'Halloween d'Espace-TI avec entre autre ça.
Le cryptage circulaire est simple à coder, surtout en TI-Basic, malgré l'étape circulaire. Je désigne par circulaire ou modulo ou encore wrapping le fait de ramener 27 à 1 quand on ajoute 1 à 26.
La conversion de la chaîne de caractères en nombres est plus pénible en TI-Basic.
- Code:
ClrList L1 // cela suffira, pas besoin de dimensionner
Input Str1
Prompt A
"ABCD...Z->Str2
//bijection de chaque token à un nombre
length(Str1->L
For(X,1,L
sub(Str1,X,1) // un token
inString(Str2,Ans) // valeur associée au token
A+Ans // somme
Ans-26int((Ans-1)/26) // circulaire (modulo 26 des lettres), que tu codes comme tu veux
Ans->L1(X) //stockage de l'image de la valeur associée au token
End
" "->Str1
//bijection de la liste à la chaîne
For(X,1,L
Str1+sub(Str2,L1(X),1->Str1 // concatène
End
Str1 //résultat
J'optimise avec les opérations et fonctions des listes.
- Code:
Input Str1
Prompt A
"ABCD...Z->Str2
length(Str1->L
A+seq(inString(Str2,sub(Str1,X,1)),X,1,L->L1 // extraction de chaque caractère puis ajoute A à chacun
L1-26int((L1-1)/26->L1 // circulaire (modulo 26 des lettres) de chaque terme de L1
" "->Str1
For(X,1,L
Str1+sub(Str2,L1(X),1->Str1 // concatène
End
Str1 //résultat
Evidemment on peut optimiser encore avec Ans au lieu de quelques instances de L1 mais comme ça tout le monde voit que c'est une liste.
On peut optimiser des choses différentes sachant que les bornes de fin des For() et seq() ne sont calculé qu'une seule fois en TI-Basic. Par exemple lire la longueur sans L ou encore utiliser une seule variable pour X et L.
EDIT : correction de la ligne du seq(). Deux fragments de code copiés n'étaient pas du tout à leur place dans le code.
Correction des modulos du calcul circulaire et ajout de la mention des 26 lettres.
Correction de la fin du seq() dont "L" manquait.