Summary Files Commits Branches @commit @diff @stats
path: root / Year 2 / Functional Programming
diff options
context:
space:
mode:
Commitfaa737bc5c9edd86f752a3b70716014f25dfee71 (patch)
Author
 Syndamia <kamen@syndamia.com>
2022-11-07 20:17:43 +0200
Committer
 Syndamia <kamen@syndamia.com>
2022-11-07 20:17:43 +0200
Filesba1c9a4723fdd0812346a252ca1f62b3ea19a495 /Year 2/Functional Programming
uni-projects-faa737bc5c9edd86f752a3b70716014f25dfee71.tar
uni-projects-faa737bc5c9edd86f752a3b70716014f25dfee71.tar.gz
uni-projects-faa737bc5c9edd86f752a3b70716014f25dfee71.zip
Parenta5449c15668a78944780ebb289b2451f84a0c978 (diff)
[FP/H2] Solved exercise 1 and half-solved exercise 2
1 files changed, 52 insertions, 0 deletions
-rw-r--r--Year 2/Functional Programming/hw2.rkt52
diff --git a/Year 2/Functional Programming/hw2.rkt b/Year 2/Functional Programming/hw2.rkt
new file mode 100644
index 0000000..a2db476
--- /dev/null
+++ b/Year 2/Functional Programming/hw2.rkt
@@ -0,0 +1,52 @@
+#lang racket
+
+;;; Задача 1
+
+(define (pair-compose fs xs)
+ (cond [(= (length fs) 0) 0]
+ [(= (length fs) 1) (lambda (y) ((car fs) (car xs) y))]
+ [else (lambda (y) (+ ((first fs) (first xs) ((second fs) (second xs) y))
+ ((pair-compose (cdr (cdr fs)) (cdr (cdr xs))) y) ))]))
+
+;; Примери
+(define fs (list *
+ (lambda (x y) (* x x x y))
+ (lambda (x y) (+ x 1 y))
+ (lambda (x y) (- x (+ 1 y)))
+ (lambda (x y) (* x y 2))))
+(define xs '(1 2 3 4 5))
+((pair-compose fs xs) 5) ; → 92
+
+;;; Задача 2
+
+(define (inside-range? point range)
+ (and (<= (car range) point) (>= (cdr range) point)))
+
+(define (range-covers? range ranges)
+ (cond [(null? ranges) #f]
+ [(or (inside-range? (car range) (car ranges)) (inside-range? (cdr range) (car ranges))) #t]
+ [else (range-covers? range (cdr ranges))]))
+
+(define (woodcutters xs)
+ (define (calc xs fallen count)
+ (define leftRange (cons (- (car (car xs)) (cdr (car xs))) (car (car xs))))
+ (define rightRange (cons (cdr (car xs)) (+ (car (car xs)) (cdr (car xs)))))
+ (define currentRange (cond [(not (range-covers? leftRange fallen)) leftRange]
+ [(not (range-covers? rightRange fallen)) rightRange]
+ [else '()]))
+ (if (= (length xs) 0)
+ count
+ (max (calc (cdr xs)
+ (list* currentRange fallen)
+ (if (null? currentRange) count (add1 count))))))
+ (calc xs '() 0))
+
+(woodcutters '((1 . 2) (2 . 1) (5 . 10) (10 . 9) (19 . 1))) ; → 3
+;(woodcutters '((1 . 2) (2 . 1) (5 . 10) (10 . 9) (20 . 1))) ; → 4
+;(woodcutters '((10 . 4) (15 . 1) (19 . 3) (20 . 1))) ; → 4
+;(woodcutters '((1 . 7) (3 . 11) (6 . 12) (7 . 6) (8 . 5) (9 . 11)
+;(15 . 3) (16 . 10) (22 . 2) (23 . 3) (25 . 7) (27 . 3) (34 . 5)
+;(35 . 10) (37 . 3) (39 . 4) (40 . 5) (41 . 1) (44 . 1) (47 . 7)
+;(48 . 11) (50 . 6) (52 . 5) (57 . 2) (58 . 7) (60 . 4) (62 . 1)
+;(67 . 3) (68 . 12) (69 . 8) (70 . 1) (71 . 5) (72 . 5)
+;(73 . 6) (74 . 4) ) ) ; → 10