mirror of
https://github.com/nim-lang/Nim.git
synced 2026-07-18 23:11:36 +00:00
Merge branch 'devel' of https://github.com/Araq/Nimrod into devel
This commit is contained in:
@@ -55,6 +55,35 @@ proc smartBinarySearch*[T](a: openArray[T], key: T): int =
|
||||
const
|
||||
onlySafeCode = true
|
||||
|
||||
proc lowerBound*[T](a: openarray[T], key: T, cmp: proc(x,y: T): int {.closure.}): int =
|
||||
## same as binarySearch except that if key is not in `a` then this
|
||||
## returns the location where `key` would be if it were. In other
|
||||
## words if you have a sorted sequence and you call insert(thing, elm, lowerBound(thing, elm))
|
||||
## the sequence will still be sorted
|
||||
##
|
||||
## `cmp` is the comparator function to use, the expected return values are the same as
|
||||
## that of system.cmp
|
||||
##
|
||||
## example:
|
||||
## `var arr = @[1,2,3,5,6,7,8,9]`
|
||||
## `arr.insert(4, arr.lowerBound(4))`
|
||||
## after running the above arr is `[1,2,3,4,5,6,7,8,9]`
|
||||
result = a.low
|
||||
var pos = result
|
||||
var count, step: int
|
||||
count = a.high - a.low + 1
|
||||
while count != 0:
|
||||
pos = result
|
||||
step = count div 2
|
||||
pos += step
|
||||
if cmp(a[pos], key) < 0:
|
||||
pos.inc
|
||||
result = pos
|
||||
count -= step + 1
|
||||
else:
|
||||
count = step
|
||||
|
||||
proc lowerBound*[T](a: openarray[T], key: T): int = lowerBound(a, key, cmp[T])
|
||||
proc merge[T](a, b: var openArray[T], lo, m, hi: int,
|
||||
cmp: proc (x, y: T): int {.closure.}, order: TSortOrder) =
|
||||
template `<-` (a, b: expr) =
|
||||
|
||||
@@ -20,6 +20,8 @@
|
||||
when defined(Posix) and not defined(haiku):
|
||||
{.passl: "-lm".}
|
||||
|
||||
import times
|
||||
|
||||
const
|
||||
PI* = 3.1415926535897932384626433 ## the circle constant PI (Ludolph's number)
|
||||
E* = 2.71828182845904523536028747 ## Euler's number
|
||||
@@ -201,7 +203,7 @@ when not defined(JS):
|
||||
result = drand48() * max
|
||||
|
||||
proc randomize() =
|
||||
randomize(gettime(nil))
|
||||
randomize(cast[int](epochTime()))
|
||||
|
||||
proc randomize(seed: int) =
|
||||
srand(cint(seed))
|
||||
|
||||
@@ -6,3 +6,6 @@ doAssert product(@[@[1,2]]) == @[@[1,2]], "a simple case of one element"
|
||||
doAssert product(@[@[1,2], @[3,4]]) == @[@[2,4],@[1,4],@[2,3],@[1,3]], "two elements"
|
||||
doAssert product(@[@[1,2], @[3,4], @[5,6]]) == @[@[2,4,6],@[1,4,6],@[2,3,6],@[1,3,6], @[2,4,5],@[1,4,5],@[2,3,5],@[1,3,5]], "three elements"
|
||||
doAssert product(@[@[1,2], @[]]) == newSeq[seq[int]](), "two elements, but one empty"
|
||||
doAssert lowerBound([1,2,4], 3, system.cmp[int]) == 2
|
||||
doAssert lowerBound([1,2,2,3], 4, system.cmp[int]) == 4
|
||||
doAssert lowerBound([1,2,3,10], 11) == 4
|
||||
@@ -23,6 +23,13 @@ suite "random int":
|
||||
rand = random(100..1000)
|
||||
check rand < 1000
|
||||
check rand >= 100
|
||||
test "randomize() again gives new numbers":
|
||||
randomize()
|
||||
var rand1 = random(1000000)
|
||||
randomize()
|
||||
var rand2 = random(1000000)
|
||||
check rand1 != rand2
|
||||
|
||||
|
||||
suite "random float":
|
||||
test "there might be some randomness":
|
||||
@@ -45,3 +52,10 @@ suite "random float":
|
||||
rand = random(100.0..1000.0)
|
||||
check rand < 1000.0
|
||||
check rand >= 100.0
|
||||
test "randomize() again gives new numbers":
|
||||
randomize()
|
||||
var rand1:float = random(1000000.0)
|
||||
randomize()
|
||||
var rand2:float = random(1000000.0)
|
||||
check rand1 != rand2
|
||||
|
||||
|
||||
Reference in New Issue
Block a user