64 lines
2.1 KiB
Nim
64 lines
2.1 KiB
Nim
import tables
|
|
import math
|
|
import strutils
|
|
import algorithm
|
|
|
|
type
|
|
StemLeafPlot = ref object
|
|
leafDigits: int
|
|
multiplier: int
|
|
plot: TableRef[int, seq[int]]
|
|
|
|
proc `$`(s: seq[int]): string =
|
|
result = ""
|
|
for item in s:
|
|
result &= $item & " "
|
|
|
|
proc `$`(self: StemLeafPlot): string =
|
|
result = ""
|
|
var keys: seq[int] = @[]
|
|
for stem, _ in self.plot:
|
|
keys.add(stem)
|
|
for printedStem in keys.min..keys.max:
|
|
result &= align($printedStem & " | ", ($keys.max).len + 4)
|
|
if printedStem in keys:
|
|
self.plot[printedStem].sort(system.cmp[int])
|
|
result &= $self.plot[printedStem]
|
|
result &= "\n"
|
|
|
|
proc parse(self: StemLeafPlot, value: int): tuple[stem, leaf: int] =
|
|
(value div self.multiplier, abs(value mod self.multiplier))
|
|
|
|
proc init[T](self: StemLeafPlot, leafDigits: int, data: openArray[T]) =
|
|
self.leafDigits = leafDigits
|
|
self.multiplier = 10 ^ leafDigits
|
|
self.plot = newTable[int, seq[int]]()
|
|
for value in data:
|
|
let (stem, leaf) = self.parse(value)
|
|
if stem notin self.plot:
|
|
self.plot[stem] = @[leaf]
|
|
else:
|
|
self.plot[stem].add(leaf)
|
|
|
|
var taskData = @[12, 127, 28, 42, 39, 113, 42, 18, 44, 118, 44, 37, 113, 124,
|
|
37, 48, 127, 36, 29, 31, 125, 139, 131, 115, 105, 132, 104, 123,
|
|
35, 113, 122, 42, 117, 119, 58, 109, 23, 105, 63, 27, 44, 105,
|
|
99, 41, 128, 121, 116, 125, 32, 61, 37, 127, 29, 113, 121, 58,
|
|
114, 126, 53, 114, 96, 25, 109, 7, 31, 141, 46, 13, 27, 43,
|
|
117, 116, 27, 7, 68, 40, 31, 115, 124, 42, 128, 52, 71, 118,
|
|
117, 38, 27, 106, 33, 117, 116, 111, 40, 119, 47, 105, 57, 122,
|
|
109, 124, 115, 43, 120, 43, 27, 27, 18, 28, 48, 125, 107, 114,
|
|
34, 133, 45, 120, 30, 127, 31, 116, 146]
|
|
|
|
var negativeData = @[-24, -12, -3, 4, 6, 6, 17, 25, 57]
|
|
|
|
echo "Using the Task's Test Data"
|
|
var taskPlot = StemLeafPlot()
|
|
taskPlot.init(1, taskData)
|
|
echo taskPlot
|
|
|
|
echo "Test with Negative Stem"
|
|
var negativePlot = StemLeafPlot()
|
|
negativePlot.init(1, negativeData)
|
|
echo negativePlot
|