DrRacket - числовые эквиваленты букв - PullRequest
1 голос
/ 15 октября 2019

Я пишу функцию, которая заменяет каждую букву на ту, которая была найдена ровно через 13 пробелов вокруг алфавитного круга, и не изменяет буквенные символы. Для букв AN и an мне нужно только добавить 13 к соответствующему целому числу и затем преобразовать его в символ. Это то, что меня смущает - для букв NZ и nz соответствующее целое число после декодирования должно быть вычтено на 13, и я не знаю, как написать выражение вопроса. Я пытался использовать char <=? и символ> =? но произошла ошибка.

(define (rot-13 msg)
  (list->string (list-rot-13 (string->list msg))))

(define (list-rot-13 loc)
  (cond
    [(empty? loc) empty]
    [else
     (cons (convert-char (first loc)) (list-rot-13 (rest loc)))]))

(define (convert-char c)
  (cond
    [... (integer->char (- (char->integer c) 13))]
    [... (integer->char (+ (char->integer c) 13))]
    [else c])

1 Ответ

2 голосов
/ 15 октября 2019

Вы можете использовать char-ci>=?. Например.

(char-ci>=? #\l #\n) ; ==> #f
(char-ci>=? #\n #\n) ; ==> #t
(char-ci>=? #\p #\n) ; ==> #t

Теперь char>=? совпадает с >= для чисел и (char>=? #\A #\b) ; ==> #t. ci означает нечувствительность к регистру, поэтому (char>=? #\A #\b) ; ==> #f.

PS: Я думаю, что вы можете сделать только с одним предикатом, и он будет работать только с if. Либо он равен или больше #\n, либо нет. Вы также можете выполнить if внутри математической операции, всегда добавляя (integer->char (+ (char->integer c) (if (char-ci>=? ...) -13 13))

...