首页 > 解决方案 > DrRacket - 字母的数字等价物

问题描述

我正在编写一个函数,将每个字母替换为稍后在字母圈周围恰好 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])

标签: racket

解决方案


您可以使用char-ci>=?. 例如。

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

现在与数字char>=?相同>=,并且(char>=? #\A #\b) ; ==> #tci代表不区分大小写的 so (char>=? #\A #\b) ; ==> #f

PS:我认为你只能使用一个谓词,它可以使用 just if。它要么等于或大于,#\n要么不是。您还可以if通过始终添加来执行内部数学运算(integer->char (+ (char->integer c) (if (char-ci>=? ...) -13 13))


推荐阅读