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)
|