aboutsummaryrefslogtreecommitdiffstats
path: root/day6/solution.nim
blob: 9c16e36a2262e5380f312230727889c57ad49706 (plain) (blame)
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
import std/strutils
import std/sequtils
import std/enumerate
import std/tables

proc solve(message: string, nUniq: int): int =
  var cntUniq = initCountTable[char]()
  
  # init found
  var uniq = 0
  for c in message[0 ..< nUniq]:
    cntUniq.inc(c)
    if cntUniq[c] == 1:
      uniq += 1

  let pairs = zip(
    message[0 ..< message.len()-nUniq],
    message[nUniq ..< message.len()])

  for i, pair in enumerate(pairs):
    if uniq == nUniq:
      return i+nUniq

    cntUniq.inc(pair[0], -1)
    if cntUniq[pair[0]] == 0:
      # we lost one uniq number in sequence
      uniq -= 1

    cntUniq.inc(pair[1])
    if cntUniq[pair[1]] == 1:
      # we found new uniq number in sequence
      uniq += 1

  assert(false)
  return -1

let content = readFile("./input.txt").strip()

echo solve(content, 4)
echo solve(content, 14)