Вы можете легко решить эту проблему без использования каких-либо массивов.
Ниже приведено мое базовое (Q) решение BASIC.
Функция MID$
извлекает один символ из строки, аASC
функция преобразует символ в его ASCII-код. Вычитание 65 дает число в диапазоне [0,25]. Зашифрованный номер превращается обратно в символ с помощью функции CHR$
. В дальнейшем оператор MID$
используется для возврата зашифрованного символа обратно в строку.
Из-за разной длины сообщения и ключа шифрования необходима отдельная переменная итерации (j%
) для многократного обходаkey string.
msg$ = "ENCRYPTION"
PRINT msg$
key$ = "CLINTON"
k% = LEN(key$)
j% = 1
FOR i% = 1 TO LEN(msg$)
a% = (ASC(MID$(msg$, i%, 1)) - 65) + (ASC(MID$(key$, j%, 1)) -65)
MID$(msg$, i%) = CHR$(65 + a% + 26 * (a% > 25))
j% = j% + 1 + k% * (j% = k%)
NEXT i%
PRINT msg$
Приведенный выше фрагмент может обойтись без одного - 65
и одного + 65
, но я оставил их для ясности.
Процесс дешифрования очень похож. 3 небольших изменения - это все, что требуется:
j% = 1
FOR i% = 1 TO LEN(msg$)
a% = (ASC(MID$(msg$, i%, 1)) - 65) - (ASC(MID$(key$, j%, 1)) -65)
MID$(msg$, i%) = CHR$(65 + a% - 26 * (a% < 0))
j% = j% + 1 + k% * (j% = k%)
NEXT i%
PRINT msg$
Запуск обоих фрагментов подряд приводит к:
ENCRYPTION
GYKERDGKZV
ENCRYPTION
А как насчет версии кода, которая может работать с пробелами, знаками препинания и символами ударения?
Код очень похож и даже немного проще:
msg$ = "This is any text that needs encrypting. So sayeth Sep Roland!"
PRINT msg$
key$ = "Blaise de Vigenère"
k% = LEN(key$)
j% = 1
FOR i% = 1 TO LEN(msg$)
a% = ASC(MID$(msg$, i%, 1)) + ASC(MID$(key$, j%, 1))
MID$(msg$, i%) = CHR$(a% + 256 * (a% > 255))
j% = j% + 1 + k% * (j% = k%)
NEXT i%
PRINT msg$
j% = 1
FOR i% = 1 TO LEN(msg$)
a% = ASC(MID$(msg$, i%, 1)) - ASC(MID$(key$, j%, 1))
MID$(msg$, i%) = CHR$(a% - 256 * (a% < 0))
j% = j% + 1 + k% * (j% = k%)
NEXT i%
PRINT msg$
Я не буду воспроизводить здесь какие-либо выходные данные, потому что это будет настоящая лава ...
Верны ли эти странные встроенные условия?
(a% + 26 * (a% > 25))
Рассмотрим эквивалентный простой код:
IF a% > 25 THEN
a% = a% - 26
ENDIF
Если переменная a%
больше 25, нам нужно вычесть 26.
Тем не менее форма (a% + 26 * (a% > 25))
использует добавление .
Это происходит потому, что условие TRUE оценивается как -1.
- Если
a% > 25
TRUE, мы получаем (a% + 26 * -1)
-> a% - 26
- Если
a% > 25
ЛОЖЬ, мы получаем (a% + 26 * 0)
-> a%