#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