diff options
[FP/HW1] Reworked almost all functions for exercise 2
1 files changed, 31 insertions, 30 deletions
| -rw-r--r-- | Year 2/Functional Programming/hw1.rkt | 61 |
diff --git a/Year 2/Functional Programming/hw1.rkt b/Year 2/Functional Programming/hw1.rkt index 3f78abd..548e441 100644 --- a/Year 2/Functional Programming/hw1.rkt +++ b/Year 2/Functional Programming/hw1.rkt @@ -18,40 +18,41 @@ ;;; Задача 2 -(define (swap-last2-digits n) - (+ (* (quotient n 100) 100) - (* (remainder n 10) 10) - (quotient (remainder n 100) 10))) - -(define (rotate-left n) - (if (<= n 9) - n - (swap-last2-digits (+ (* (rotate-left (quotient n 10)) 10) - (remainder n 10))))) - -(define (pow10 n) - (if (= n 0) - 1 - (* 10 (pow10 (sub1 n))))) +(define (^10 n) + (define (calc-iter n val) + (if (= n 0) + val + (calc-iter (sub1 n) (* val 10)))) + (calc-iter n 1)) (define (numlen n) - (if (= n 0) - 0 - (add1 (numlen (quotient n 10))))) + (define (calc-iter n len) + (if (= n 0) + len + (calc-iter (quotient n 10) (add1 len)))) + (calc-iter n 0)) + +(define (rotate-left n) + (define 10^len-1 (^10 (sub1 (numlen n)))) + (+ (* (remainder n 10^len-1) 10) ; всичко без най-дясната цифра + (quotient n 10^len-1))) ; най-дясната цифра (define (rotate-left-preserved n d) - (define pbl (pow10 (- (numlen n) d))) - (+ (* (quotient n pbl) pbl) - (if (< (remainder n pbl) pbl) - (* (rotate-left (remainder n pbl)) 10) - (rotate-left (remainder n pbl))))) + (define 10^rotatelen (^10 (- (numlen n) d))) + (define to-rotate (remainder n 10^rotatelen)) + (if (<= n 9) + n + (+ (- n to-rotate) ; запазените цифри са запазени, другите са нули + (if (< to-rotate (quotient 10^rotatelen 10)) ; ако to-rotate "започва" с нули + (- (rotate-left (+ to-rotate 10^rotatelen)) 1) ; "долепяме" 1ца до левия край временно, за да може да се звърти + (rotate-left to-rotate))))) (define (max-rot n) - (define nrlen (sub1 (numlen n))) - (define (helper i current biggest) - (if (>= i nrlen) + (define len-1 (sub1 (numlen n))) + (define (calc-iter preserved current biggest) + (if (= preserved len-1) ; при равенство ще има само една цифра която ще може да бъде завъртяна biggest - (helper (add1 i) - (rotate-left-preserved current (add1 i)) - (if (> current biggest) current biggest)))) - (helper 0 (rotate-left n) 0)) + (calc-iter (add1 preserved) + (rotate-left-preserved current (add1 preserved)) + (if (> current biggest) current biggest)))) + (calc-iter 0 (rotate-left n) 0)) |
