Summary Files Commits Branches @commit @diff @stats
path: root / Year 2 / Functional Programming / Exam1-19.11.2022.rkt
blob: f72f87c535ae28d9eb35d3702836ee5a216e5d51 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
#lang racket
(require math/number-theory) ; Само ползвам prime?


;;; Задача 1

(define (primes-prod x)
  (define (calc current max prod)
    (cond [(> current max) prod]
          [(prime? current) (calc (add1 current) max (* prod current))]
          [else (calc (add1 current) max prod)]))
  (calc 2 (sqrt x) 1))

;; Примери
(primes-prod 12) ; → 6
(primes-prod 49) ; → 210
(primes-prod 1200) ; → 200560490130#lang racket


;;; Задача 2

(define (shuffle-merge xs ys)
  (define (calc left right result)
    (cond [(or (null? left) (null? right)) (append result left right)]
          [else (calc (cdr left) (cdr right) (append result (list (car left) (car right))))]))
  (calc xs ys '()))

;; Примери
(shuffle-merge '(1) '()) ; → '(1)
(shuffle-merge '(3 4 5) '(2)) ; → '(3 2 4 5)
(shuffle-merge '(3 4 5) '(9 2)) ; → '(3 9 4 2 5)
(shuffle-merge '(3 2 8) '(5 6 1 9 11)) ; → '(3 5 2 6 8 1 9 11)#lang racket


;;; Задача 3

(define (sum> l1 l2)
  (cond [(null? l1) #t]
        [(null? l2) #f]
        [else (> (+ (car l1) (cdr l1)) (+ (car l2) (cdr l2)))]))

(define (g-l-sum limit)
  (define (calc x y)
    (cond [(or (> (gcd x y) limit) (> (lcm x y) limit)) '()]
          [(= (+ (gcd x y) (lcm x y)) limit) (cons x y)]
          ;; Кодът тук избира най-малката възможна точкова двойка
          [else (define left (calc (add1 x) y))
                (define right (calc x (add1 y)))
                (cond [(sum> right left) left]
                      [else right])]))
  (calc 1 1))

;; Примери
(g-l-sum 2) ; → '(1 . 1)
(g-l-sum 14) ; → '(6 . 4)#lang racket


;;; Задача 4 

(define (steps-bm xss)
  (define (calc xss rowi)
    ;; Резултат = редове разстояние + колони разстояние
    (cond [(member 1 (car xss)) (+ (abs (- 3 rowi))
                                   (abs (- 2 (index-of (car xss) 1))))]
          [else (calc (cdr xss) (add1 rowi))]))
  (calc xss 1))

;; Примери
(steps-bm '((0 0 0 0 0)
            (0 0 0 0 1)
            (0 0 0 0 0)
            (0 0 0 0 0)
            (0 0 0 0 0)) ) ; → 3
(steps-bm '((0 0 0 0 0)
            (0 0 0 0 0)
            (0 1 0 0 0)
            (0 0 0 0 0)
            (0 0 0 0 0)) ) ; → 1
(steps-bm '((0 0 0 0 0)
            (0 0 0 0 0)
            (0 0 1 0 0)
            (0 0 0 0 0)
            (0 0 0 0 0)) ) ; → 0
(steps-bm '((0 0 0 0 0)
            (0 0 0 0 0)
            (0 0 0 0 0)
            (0 0 0 0 0)
            (0 0 0 0 1)) ) ; → 4