Summary Files Commits Branches @commit @diff @stats
path: root / Year 2 / Functional Programming
diff options
context:
space:
mode:
Commit48cdff17bb05b1774c20601698fd57e719030f87 (patch)
Author
 Syndamia <kamen@syndamia.com>
2022-10-19 18:22:00 +0300
Committer
 Syndamia <kamen@syndamia.com>
2022-10-19 18:22:00 +0300
Files6f7d27ed9fed81cb81b0360a7e1d36f6686cc129 /Year 2/Functional Programming
uni-projects-48cdff17bb05b1774c20601698fd57e719030f87.tar
uni-projects-48cdff17bb05b1774c20601698fd57e719030f87.tar.gz
uni-projects-48cdff17bb05b1774c20601698fd57e719030f87.zip
Parentb5dadc58da0b69abf79da0df859271fc075ffd72 (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.rkt61
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))