forked from swiftlang/swift
-
Notifications
You must be signed in to change notification settings - Fork 32
/
Copy pathalgorithms.swift
212 lines (186 loc) · 4.58 KB
/
algorithms.swift
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
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
// RUN: %target-parse-verify-swift
protocol Eq {
func ==(lhs: Self, rhs: Self) -> Bool
func !=(lhs: Self, rhs: Self) -> Bool
}
protocol Comparable: Eq {
func <(lhs: Self, rhs: Self) -> Bool
func <=(lhs: Self, rhs: Self) -> Bool
func >=(lhs: Self, rhs: Self) -> Bool
func >(lhs: Self, rhs: Self) -> Bool
}
func find<R : IteratorProtocol where R.Element : Eq>
(_ range : R, value : R.Element) -> R {
var result = range
for x in IteratorSequence(range) {
if x == value {
break
}
_ = result.next()
}
return result
}
func findIf<R : IteratorProtocol>(
_ range: R, predicate: (R.Element) -> Bool
) -> R {
var result = range
for x in IteratorSequence(range) {
if predicate(x) {
break
}
_ = result.next()
}
return result
}
func count<R : IteratorProtocol where R.Element : Eq>
(_ range : R, value : R.Element) -> Int {
var result = 0
for x in IteratorSequence(range) {
if x == value {
result += 1
}
}
return result
}
func countIf<
R : IteratorProtocol
>(_ range: R, predicate: (R.Element) -> Bool) -> Int {
var result = 0
for x in IteratorSequence(range) {
if predicate(x) {
result += 1
}
}
return result
}
func equal<
R1 : IteratorProtocol,
R2 : IteratorProtocol
where
R1.Element : Eq,
R1.Element == R2.Element
>(_ range1 : R1, range2 : R2) -> Bool {
var range1 = range1
var range2 = range2
var e1 = range1.next()
var e2 = range2.next()
while (e1 != nil) && (e2 != nil) {
if e1! != e2! {
return false
}
e1 = range1.next()
e2 = range2.next()
}
return (e1 == nil) == (e2 == nil)
}
func equalIf<R1 : IteratorProtocol, R2 : IteratorProtocol>
(_ range1 : R1, range2 : R2,
predicate : (R1.Element, R2.Element)-> Bool) -> Bool {
var range1 = range1
var range2 = range2
var e1 = range1.next()
var e2 = range2.next()
while (e1 != nil) && (e2 != nil) {
if !predicate(e1!, e2!) {
return false
}
e1 = range1.next()
e2 = range2.next()
}
return (e1 == nil) == (e2 == nil)
}
func mismatch<
R1 : IteratorProtocol,
R2 : IteratorProtocol
where
R1.Element : Eq,
R1.Element == R2.Element
>(_ range1 : R1, range2 : R2) -> (R1, R2) {
var range1 = range1
var range2 = range2
var prev1 = range1, prev2 = range2
while true {
let e1 = range1.next(), e2 = range2.next()
if (e1 == nil) || (e2 == nil) || e1! != e2! { break }
_ = prev1.next()
_ = prev2.next()
}
return (prev1, prev2)
}
func mismatchIf<R1 : IteratorProtocol, R2 : IteratorProtocol>
(_ range1 : R1, range2 : R2,
predicate : (R1.Element, R2.Element) -> Bool) -> (R1, R2) {
var range1 = range1
var range2 = range2
var prev1 = range1, prev2 = range2
while true {
let e1 = range1.next(), e2 = range2.next()
if (e1 == nil) || (e2 == nil) || !predicate(e1!, e2!) { break }
_ = prev1.next()
_ = prev2.next()
}
return (prev1, prev2)
}
func minElement<R : IteratorProtocol where R.Element : Comparable>(_ range: R)
-> R.Element {
var range = range
var result = range.next()!
for next in IteratorSequence(range) {
if next < result {
result = next
}
}
return result
}
func maxElement<R : IteratorProtocol where R.Element : Comparable>(_ range: R)
-> R.Element {
var range = range
var result = range.next()!
for next in IteratorSequence(range) {
if next > result {
result = next
}
}
return result
}
func minMaxElement<R : IteratorProtocol where R.Element : Comparable>(_ range: R)
-> (R.Element, R.Element) {
var range = range
var min = range.next()!, max = min
for next in IteratorSequence(range) {
if next < min { min = next }
if max < next { max = next }
}
return (min, max)
}
protocol RandomAccessStream : IteratorProtocol {
func size() -> Int
func getNth(_ n: Int) -> Element
subscript (r : Range<Int>) -> Self { get }
}
func lowerBound<R : RandomAccessStream where R.Element : Comparable>
(_ inputrange : R, value : R.Element) -> R {
var range = inputrange
while range.size() > 1 {
let mid = range.size() / 2
if range.getNth(mid) < value {
range = range[mid + 1..<range.size()]
} else {
range = range[0..<mid]
}
}
return range
}
func upperBound<R : RandomAccessStream where R.Element : Comparable>
(_ inputrange : R, value : R.Element) -> R {
var range = inputrange
while range.size() > 1 {
let mid = range.size() / 2
if value < range.getNth(mid) {
range = range[0..<mid]
} else {
range = range[mid + 1..<range.size()]
}
}
return range
}