String 使用Racket博士的方案中的Magic 1089

String 使用Racket博士的方案中的Magic 1089,string,numbers,scheme,racket,String,Numbers,Scheme,Racket,我正在尝试创建一个使用xyz的程序,数字按降序排列,并生成1089。我必须取xyz,倒转数字,确定xyz和它的倒数之间的差异,称之为diff,加上diff和它的倒数,然后得到1089的答案。我已经试了几个小时了,但是我不知道如何创建代码。到目前为止,我只尝试使用函数,但仍然无法使其工作。我做错了什么 (一) 基于此,应尽可能简单: (define (pad0 str) ; add leading 0's to a string, 3 characters wide (~a #:width 3

我正在尝试创建一个使用xyz的程序,数字按降序排列,并生成1089。我必须取xyz,倒转数字,确定xyz和它的倒数之间的差异,称之为diff,加上diff和它的倒数,然后得到1089的答案。我已经试了几个小时了,但是我不知道如何创建代码。到目前为止,我只尝试使用函数,但仍然无法使其工作。我做错了什么

(一)

基于此,应尽可能简单:

(define (pad0 str) ; add leading 0's to a string, 3 characters wide
  (~a #:width 3 #:align 'right #:left-pad-string "0" str))

(define (reverse-num n) ; reverse a number
  (string->number (list->string (reverse (string->list (pad0 (number->string n)))))))

(define (magic xyz) ; the magic happens here
  (define diff (abs (- (reverse-num xyz) xyz)))
  (+ diff (reverse-num diff)))
测试:

> (magic 123)
1089
> (magic 678)
1089
> (magic 321)
1089
> (magic 546)
1089
FWIW,经过此修改后,仍有90个介于100和999(含)之间的数字无法使用该算法:

> (for/sum ((i (in-range 100 1000)) #:when (not (= (magic i) 1089))) 1)
90
> (for/sum ((i (in-range 100 1000)) #:when (not (= (magic i) 1089))) 1)
90