diff options
| Commit | 48cdff17bb05b1774c20601698fd57e719030f87 (patch) | |
|---|---|---|
| Author | 2022-10-19 18:22:00 +0300 | |
| Committer | 2022-10-19 18:22:00 +0300 | |
| Files | 6f7d27ed9fed81cb81b0360a7e1d36f6686cc129 | |
| uni-projects-48cdff17bb05b1774c20601698fd57e719030f87.tar uni-projects-48cdff17bb05b1774c20601698fd57e719030f87.tar.gz uni-projects-48cdff17bb05b1774c20601698fd57e719030f87.zip | ||
| Parent | b5dadc58da0b69abf79da0df859271fc075ffd72 (diff) | |
[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)) |
