aboutsummaryrefslogtreecommitdiff
path: root/challenge-263/archargelod/nim/ch_2.nim
blob: ceb635913ab5c1416249b7d9c8cfcc92d0a948b6 (plain)
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
#!/usr/bin/env -S nim r -d:release --verbosity:0 --hints:off
import std/tables

type
  ItemGroup = tuple[id, count: int]
  ItemCollection = seq[ItemGroup]

proc merge*(collection1, collection2: openArray[ItemGroup]): ItemCollection =
  var collected: OrderedTable[int, int]

  for items in [collection1, collection2]:
    for item in items:
      if collected.hasKeyOrPut(item.id, item.count):
        collected[item.id] += item.count

  for key, val in collected:
    result.add (key, val)

when isMainModule:
  import std/unittest

  const
    Test = [
      (@[(1,1), (2,1), (3,2)], @[(2,2), (1,3)]),
      (@[(1,2), (2,3), (1,3), (3,2)], @[(3,1), (1,3)]),
      (@[(1,1), (2,2), (3,3)], @[(2,3), (2,4)]),
    ]
    Expected = [
      @[(1, 4), (2, 3), (3, 2)],
      @[(1, 8), (2, 3), (3, 3)],
      @[(1, 1), (2, 9), (3, 3)],
    ]

  suite "Merge Items":
    test "Example 1":
      check merge(Test[0][0], Test[0][1]) == Expected[0]
    test "Example 2":
      check merge(Test[1][0], Test[1][1]) == Expected[1]
    test "Example 2":
      check merge(Test[2][0], Test[2][1]) == Expected[2]