======C7R.scm======
<code shell>#!/usr/bin/env racket
#lang racket/base</code>
zadání (slepá mapa) viz [[C7.scm]], 2014-jan-17 (honz4)
======1. abs-min======
V [[PAPR1:L7#s7_3|sekci 7.3]] jsme rozšířili proceduru min2 na proceduru libovolného počtu argumentů.
Stejným způsobem rozšiřte proceduru na výběr čísla s extrémní absolutní hodnotou abs-min.
<hidden potrebujeme abs-min a menší-rovno s +infty>
<code scheme>
(define +oo '+oo)
</code>
y=oo || (x!=oo && x <= y) ;Ceckovy zapis <= s nekonecnem
<code scheme>
(define <=oo
(lambda (x y)
(or (equal? y +oo)
(and (not (equal? x +oo))
(<= x y)))))
(map <=oo '(1 2 3 1 +oo +oo) '(2 1 3 +oo 1 +oo))
;zabudujeme +oo i do abs?
(define (abs+oo x) (if (equal? x +oo) x (abs x)))
(define abs-min2 ;abs zabudovano v <=oo ???
(lambda (x y)
(if (<=oo (abs+oo x) (abs+oo y)) x y))) ;vracime 'originalni' x y
(define abs-min2__
(lambda (x y)
(if (<=oo x y) x y)))
(abs-min2 -10 8) ;=> 8
(define abs-min
(lambda numbers
(foldr
abs-min2
+oo
numbers)))
(abs-min -10 -8 2 5 6) ;=> 2
</code>
</hidden>
======2. nondecreasing======
Napište predikát, který pro posloupnost zjistí, zda je neklesající.
Posloupnost bude reprezentovaná seznamem, jehož prvky jsou čísla.
Viz příklady aplikace:
<code scheme>
(nondecreasing? '()) ;⇒ #t
(nondecreasing? '(1 2 3 4)) ;⇒ #t
(nondecreasing? '(1 2 4 3)) ;⇒ #f
(nondecreasing? '(1 4 2 3)) ;⇒ #f
(nondecreasing? '(4 1 2 3)) ;⇒ #f</code>
<hidden predikát, který pro posloupnost zjistí, zda je neklesající>
<code scheme>
(define nondecr1
(lambda (l)
(car (foldl
(lambda (e t)
(cons (and (car t) (>= e (cdr t))) e))
'(#t . -999999) ;lepe: >= s -infinity?
l))))
(nondecr1 '(1 2 3 4))
(nondecr1 '(1 2 4 3))
(nondecr1 '(1 2 4 3 5))
(nondecr1 '(1 2 4 4 5))
</code>
TODO: reimplementovat: terminator staruje #f, pak si pamatuje predchozi, nebo nastavi #t
</hidden>
======3. after, before======
Napište procedury after a before, jejichž argumenty budou element elem a seznam l .
Procedura after bude vracet seznam prvku za posledním výskytem prvku elem (včetně) v seznamu l.
Procedura before zase seznam prvků před prvním výskytem prvku elem (včetně) v seznamu l.
Viz příklady použití:
<code scheme>
(after 10 '(1 2 3 4 3 5 6)) ;⇒ ()
(after 3 '(1 2 3 4 3 5 6)) ;⇒ (3 5 6)
(after 6 '(1 2 3 4 3 5 6)) ;⇒ (6)
(before 10 '(1 2 3 4 3 5 6)) ;⇒ (1 2 3 4 5 6)
(before 1 '(1 2 3 4 3 5 6)) ;⇒ (1)
(before 3 '(1 2 3 4 3 5 6)) ;⇒ (1 2 3)</code>
<hidden procedury after, before>
<code scheme>
(define (after x l) ;za poslednim => po prvni od konce vcetne
(let ((result (foldr
(lambda (e t) ;(display t) (newline)
(if (car t)
t ;uz nasli, vracime porad to stejne
(cons (equal? e x) (cons e (cdr t)))))
'(#f . ())
l)))
(if (car result) (cdr result) '())))
(after 10 '(1 2 3 10 14 15))
(define (before x l)
(let ((result (foldl
(lambda (e t) ;(display t) (newline)
(if (car t)
t ;uz nasli, vracime porad to stejne
(cons (equal? e x) (cons e (cdr t)))))
'(#f . ())
l)))
(if (car result) (reverse (cdr result)) '())))
(before 10 '(1 2 3 10 14 15))
</code>
</hidden>