diff options
| Commit | faa737bc5c9edd86f752a3b70716014f25dfee71 (patch) | |
|---|---|---|
| Author | 2022-11-07 20:17:43 +0200 | |
| Committer | 2022-11-07 20:17:43 +0200 | |
| Files | ba1c9a4723fdd0812346a252ca1f62b3ea19a495 | |
| uni-projects-faa737bc5c9edd86f752a3b70716014f25dfee71.tar uni-projects-faa737bc5c9edd86f752a3b70716014f25dfee71.tar.gz uni-projects-faa737bc5c9edd86f752a3b70716014f25dfee71.zip | ||
| Parent | a5449c15668a78944780ebb289b2451f84a0c978 (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.rkt | 52 |
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 |
