/
examples.lisp
101 lines (90 loc) · 4.09 KB
/
examples.lisp
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
89
90
91
92
93
94
95
96
97
98
99
100
101
;;; examples.lis
(in-package :track-best/tests)
(nst:def-fixtures test-vertexes ()
(+octohedron-vertexes+ '(#( 1 0 0)
#(-1 0 0)
#( 0 1 0)
#( 0 -1 0)
#( 0 0 1)
#( 0 0 -1))))
(nst:def-fixtures taxicab-distance ()
(taxicab-distance-fn #'(lambda (a b)
(reduce #'+ (map 'list #'(lambda (x y)
(abs (- x y)))
a b)))))
(nst:def-fixtures city-altitudes ()
(+city-altitudes+'(("Alabama" ("Birmingham" 664)
("Mobile" 218)
("Montegomery" 221))
("Alaska" ("Anchorage" 144)
("Fairbanks" 531))
("Arizona" ("Grand Canyon" 6606)
("Phoenix" 1132)
("Tuscon" 2641)))))
(nst:def-test-group examples ()
(nst:def-test map-best (:equalp '(-25 16 -9))
(with-track-best (:keep 3 :return-best nil)
(dolist (v '(-5 -3 -1 0 2 4))
(track v (abs v)))
(map-best #'(lambda (item score)
(* item score)))))
(nst:def-test longest-substring (:drop-values (:equal " Friday"))
(let ((s1 "Keep playing cards on Friday. Get smart.")
(s2 "Thank G-d it's Friday!"))
(with-track-best ()
(dotimes (len (length s1))
(dotimes (offset (- (length s1) len -1))
(let ((needle (subseq s1 offset (+ offset len))))
(when (search needle s2 :test #'string=)
(track needle len))))))))
(nst:def-test (closest-vertex :fixtures (test-vertexes
taxicab-distance))
(:values (:equalp (list #(1 0 0)
#(0 1 0)
#(0 0 1)))
(:equal (list (+ 1/2 1/3 1/4)
(+ 1/2 2/3 1/4)
(+ 1/2 1/3 3/4))))
(with-track-best (:keep 3 :order-by-fn #'<)
(dolist (v +octohedron-vertexes+)
(track v (funcall taxicab-distance-fn v #(1/2 1/3 1/4))))))
(nst:def-test (farthest-vertex :fixtures (test-vertexes
taxicab-distance))
(:values (:equalp #(-1 0 0))
(:equal (+ 3/2 1/3 1/4)))
(with-track-best ()
(dolist (v +octohedron-vertexes+)
(track v (funcall taxicab-distance-fn v #(1/2 1/3 1/4))))))
(nst:def-test (lowest-highest-point :fixtures (city-altitudes))
(:values (:equalp '("Alaska" "Fairbanks"))
(:equal 531))
(with-track-best (:order-by-fn #'<)
(dolist (state-info +city-altitudes+)
(multiple-value-bind (city altitude)
(with-track-best ()
(dolist (city-info (rest state-info))
(track (first city-info) (second city-info))))
(track (list (first state-info) city) altitude)))))
(nst:def-test lowest-and-highest (:seq (:equal 1)
(:equal 10))
(with-track-best (:name lowest :order-by-fn #'< :return-best nil)
(with-track-best (:name highest :return-best nil)
(dolist (v '(2 4 6 8 10
1 3 5 7 9))
(track v v lowest)
(track v v highest))
(list (caar (map-best #'cons lowest))
(caar (map-best #'cons highest))))))
(nst:def-test keep-ties (:values (:seq (:equal :EIGHT)
(:equal :HUIT)
(:equal :OCHO))
(:seq (:equal 8)
(:equal 8)
(:equal 8)))
(multiple-value-bind (l v)
(with-track-best (:keep-ties t)
(dolist (c '((:FIVE 5) (:EIGHT 8)
(:CINQO 5) (:OCHO 8)
(:CINQ 5) (:HUIT 8)))
(track (first c) (second c))))
(values (sort l #'string< :key #'symbol-name) v))))