mirror of
https://github.com/nim-lang/Nim.git
synced 2026-02-13 06:43:52 +00:00
Idxmin & idxmax, continuation (#13208)
* Add idxmin() which returns the index of the minimum value * Add idxmax() which returns the index of the maximum value * Add tests for idxmin() * Add tests for idxmax() * Remove initialization of result = 0 * Adds overloading for arrays (no enums indexed arrays yet) * Add support for enum index arrays * Fix tests with enum * Fix tests for idxmax * Change names of the procedures to minIndex and maxIndex * address Araq's comments: - remove 'array' versions - add .since pragma - return 'int' instead of 'Natural' - add changelog entry Co-authored-by: Federico A. Corazza <20555025+Imperator26@users.noreply.github.com>
This commit is contained in:
@@ -37,27 +37,21 @@
|
||||
- introduced new procs in `tables.nim`: `OrderedTable.pop`, `CountTable.del`,
|
||||
`CountTable.pop`, `Table.pop`
|
||||
- To `strtabs.nim`, added `StringTable.clear` overload that reuses the existing mode.
|
||||
|
||||
|
||||
- Added `sugar.outplace` for turning in-place algorithms like `sort` and `shuffle` into
|
||||
operations that work on a copy of the data and return the mutated copy. As the existing
|
||||
`sorted` does.
|
||||
- Added `sugar.collect` that does comprehension for seq/set/table collections.
|
||||
|
||||
- Added `sugar.capture` for capturing some local loop variables when creating a closure.
|
||||
This is an enhanced version of `closureScope`.
|
||||
|
||||
- Added `typetraits.lenTuple` to get number of elements of a tuple/type tuple,
|
||||
and `typetraits.get` to get the ith element of a type tuple.
|
||||
- Added `typetraits.genericParams` to return a tuple of generic params from a generic instantiation
|
||||
|
||||
- Added `os.normalizePathEnd` for additional path sanitization.
|
||||
|
||||
- Added `times.fromUnixFloat,toUnixFloat`, subsecond resolution versions of `fromUnix`,`toUnixFloat`.
|
||||
|
||||
- Added `wrapnils` module for chains of field-access and indexing where the LHS can be nil.
|
||||
This simplifies code by reducing need for if-else branches around intermediate maybe nil values.
|
||||
Eg: `echo ?.n.typ.kind`
|
||||
- Added `minIndex` and `maxIndex` to the `sequtils` module
|
||||
|
||||
## Library changes
|
||||
|
||||
|
||||
@@ -202,6 +202,41 @@ proc deduplicate*[T](s: openArray[T], isSorted: bool = false): seq[T] =
|
||||
for itm in items(s):
|
||||
if not result.contains(itm): result.add(itm)
|
||||
|
||||
proc minIndex*[T](s: openArray[T]): int {.since: (1, 1).} =
|
||||
## Returns the index of the minimum value of `s`.
|
||||
## ``T`` needs to have a ``<`` operator.
|
||||
runnableExamples:
|
||||
let
|
||||
a = @[1, 2, 3, 4]
|
||||
b = @[6, 5, 4, 3]
|
||||
c = [2, -7, 8, -5]
|
||||
d = "ziggy"
|
||||
assert minIndex(a) == 0
|
||||
assert minIndex(b) == 3
|
||||
assert minIndex(c) == 1
|
||||
assert minIndex(d) == 2
|
||||
|
||||
for i in 1..high(s):
|
||||
if s[i] < s[result]: result = i
|
||||
|
||||
proc maxIndex*[T](s: openArray[T]): int {.since: (1, 1).} =
|
||||
## Returns the index of the maximum value of `s`.
|
||||
## ``T`` needs to have a ``<`` operator.
|
||||
runnableExamples:
|
||||
let
|
||||
a = @[1, 2, 3, 4]
|
||||
b = @[6, 5, 4, 3]
|
||||
c = [2, -7, 8, -5]
|
||||
d = "ziggy"
|
||||
assert maxIndex(a) == 3
|
||||
assert maxIndex(b) == 0
|
||||
assert maxIndex(c) == 2
|
||||
assert maxIndex(d) == 0
|
||||
|
||||
for i in 1..high(s):
|
||||
if s[i] > s[result]: result = i
|
||||
|
||||
|
||||
template zipImpl(s1, s2, retType: untyped): untyped =
|
||||
proc zip*[S, T](s1: openArray[S], s2: openArray[T]): retType =
|
||||
## Returns a new sequence with a combination of the two input containers.
|
||||
|
||||
Reference in New Issue
Block a user