2014-10-01 36 views
1

我想創建一個程序,消費xyz,數字以遞減順序,併產生1089.我必須採取xyz,反轉數字,確定xyz之間的差異,它是相反的並將其稱爲diff,添加diff並將其反轉,然後得到1089的答案。我一直在嘗試幾個小時,但我無法弄清楚如何創建代碼。到目前爲止,我只嘗試了一些功能,但仍然無法實現。我在做什麼錯?:魔法1089在計劃使用Dr.Retet

1)

(define h 100) 
(define t 10) 
(define o 1) 

(define (front xyz) 
    (number->string (substring xyz 0 1))) 

(define (mid xyz) 
    (number->string (substring xyz 1 2))) 

(define (back xyz) 
    (number->string (substring xyz 2 3))) 

(define (reversexyz xyz) 
    (string->number (+ (* (back xyz) h) (* (mid xyz) t) (* (front xyz) o)))) 

(define (diff abc) 
    (- xyz (reversexyz))) 

(define (frontdiff abc) 
    (number->string (substring frontdiff 0 1))) 

(define (middiff abc) 
    (number->string (substring middiff 1 2))) 

(define (backdiff abc) 
    (number->string (substring backdiff 2 3))) 

(define (reversediff xyz) 
    (number->string (+ (* (backdiff abc) h) (* (middiff abc) t) (* (frontdiff abc) o)))) 

(define (magic xyz) 
    (+ diff reversediff)) 

回答

1

基於this explanation這應該是那麼容易,因爲:

(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