Я переименовал некоторые переменные:)
Legend
------
ausgabe = output
codieren = encode
verschluesseln = encrypt
umwandeln = convert
zahlenListe = numlist
... и добавил некоторые подписи и операторы цели.check-expect
s - это тесты в BSL (Beginning Student Language) Ракета.
;; String [Listof Character] [Listof Number] -> [Listof Number]
;; converts, then encrypts str by key1
(define (encode str output key1)
(encrypt (convert (string->list str) output) key1 '()))
(check-expect (encode "abc" '() (list 1 1 1)) (list 98 99 100))
;; [Listof Character] [Listof Character] -> [Listof Character]
;; converts each character in liste to an integer
(define (convert liste output)
(cond
[(null? liste) output]
[else (convert (rest liste)
(append output (list (char->integer (first liste)))))]))
;; [Listof Number] [Listof Number] [Listof Number] -> [Listof Number]
;; increments each number in numlist by key1
(define (encrypt numlist key1 output)
(cond
[(null? numlist) output]
[else (encrypt (rest numlist)
(rest key1)
(append output (list (+ (first numlist) (first key1)))))]))
Вы можете создавать аналогичные функции декодера (которые работают в обратном направлении):
;; [Listof Number] [Listof Number] [Listof Number] -> String
(define (decode code output key1)
(list->string (convert-back (decrypt code key1 output) '())))
(check-expect (decode (list 98 99 100) '() (list 1 1 1)) "abc")
;; [Listof Number][Listof Number] [Listof Number] -> [Listof Number]
(define (decrypt numlist key1 output)
(cond
[(null? numlist) output]
[else (decrypt (rest numlist)
(rest key1)
(append output (list (- (first numlist) (first key1)))))]))
(check-expect (decrypt (list 98 99 100) (list 1 1 1) '()) (list 97 98 99))
;; [Listof Number] [Listof Character] -> [Listof Character]
(define (convert-back liste output)
(cond
[(null? liste) output]
[else (convert-back (rest liste)
(append output (list (integer->char (first liste)))))]))
(check-expect (convert-back (list 97 98 99) '()) (list #\a #\b #\c))
И затем проверьте, возвращает ли кодирование и декодирование чего-либо по ключу одно и то же:
;; String [Listof Number] -> String
;; encodes and decodes a str by key
(define (encode-decode-identity str key)
(decode (encode str '() key) '() key))
(check-expect (encode-decode-identity "abc" (list 1 1 1)) "abc")
(check-expect (encode-decode-identity "Gödel" (list 3 0 1 -9 7)) "Gödel")
Посмотрите, как клавиша только что использовалась в двух двух функциях.
Примечаниечто наше закодированное сообщение было [Listof Number]
.Это может быть преобразовано в строку:
;; [Listof Number] String -> String
;; converts an encoding `code` to its string form
(define (code-to-string code output)
(cond [(null? code) output]
[else (code-to-string (rest code)
(string-append output (int->string (first code))))]))
(check-expect (code-to-string (list 98 99 100) "") "bcd")
(check-expect (code-to-string (encode "Church" '() (list 4 2 3 -5 0 9)) "") "Gjxmcq")
... которая затем может быть использована для кодирования чего-либо несколько раз (как вы просили):
;; Number String [Listof Number] -> String
;; encodes str n times using key
(define (encode-n-times n str key)
(cond [(= n 0) str]
[else (encode-n-times (- n 1) (code-to-string (encode str '() key) "") key)]))
(check-expect (encode-n-times 3 "abc" (list 1 1 1)) "def")
Вместо "запускается ключ"с самого начала снова "составляются несколько приложений кодирования.