Question

J'avais une question sur un programme que j'ai essayé de courir. Encrypt prend un message, la clé publique et la clé privée, et renvoie le message avec les lettres du message dans la clé publique changée en lettres de la clé privée.

Pour ex, (crypter "ABCD" "ABCD" "EfGH") devrait retourner "efgh" et (crypter "abcl" "ABCD" "efgh") devrait retourner "efgl" (la lettre du message qui n'était pas dans le public- La clé restera la même).

J'ai écrit quelques programmes d'aide pour résoudre ce problème, mais je continue à obtenir l'erreur "Exception dans la voiture, __ n'est pas une paire" quand j'essaie de l'exécuter .. mais je ne sais pas ce qui va. Si quelqu'un a des pointeurs, faites-le moi savoir. Merci!

(define encrypt
  (lambda (message public-key private-key)
    (cond
      [(list->string (encrypt-helper (string->list message)
      (string->list public-key) (string->list private-key)))])))

(define encrypt-helper
  (lambda (msg-ls public-ls private-ls)
    (cond
      [(null? public-ls) '()]
      [(null? private-ls) '()]
      [(and (null? public-ls) (null? private-ls)) msg-ls]
      [else (cons (encrypt-key (car msg-ls) (car public-ls) (car private-ls))
        (encrypt-helper (cdr msg-ls) (cdr public-ls) (cdr private-ls)))])))

;should encrypt all letters in msg-ls. not working correctly

(define encrypt-key
  (lambda (char pub-key priv-key)
    (cond
      [(null? pub-key) char]
      [(equal? char (car pub-key)) (car priv-key)]
      [else (encrypt-key char (cdr pub-key) (cdr priv-key))])))

;encrypts just one letter, ex: (encrypt-key 'a '(a) '(b)) => b
;works correctly
Était-ce utile?

La solution

Le problème est qu'à l'intérieur encrypt-helper, tu appelles

[else (cons (encrypt-key (car msg-ls) (car public-ls) (car private-ls)...

mais (car public-ls) (et (car private-ls)) est un atome, tandis qu'à l'intérieur encrypt-key Vous jouez également

[(equal? char (car pub-key) ...

Et tu ne peux pas car pub-key ici parce que parce que car fonctionne uniquement sur une liste, tandis que pub-key est un atome.

Dans l'exemple que vous donnez qui fonctionne, c'est-à-dire

(encrypt-key 'a '(a) '(b)) => b

Tu remarques que '(a) et '(b) sont spécifiés comme listes, pour exactement cette raison. Indice:

>(cons 'a ())
(a)
> 

Je vais le laisser là :)

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top