Skip to content

Instantly share code, notes, and snippets.

@zoldar
Created December 4, 2022 01:19
Show Gist options
  • Select an option

  • Save zoldar/46a3150d3ab47c7ac054fefa6b61b543 to your computer and use it in GitHub Desktop.

Select an option

Save zoldar/46a3150d3ab47c7ac054fefa6b61b543 to your computer and use it in GitHub Desktop.
import std/sequtils, std/sets, std/tables, std/os, std/strformat
let priorities = concat(
zip(toSeq('a'..'z'), toSeq(1..26)),
zip(toSeq('A'..'Z'), toSeq(27..52))
).toTable
iterator chunks[T](a: seq[T], size: int): seq[T] =
var chunk: seq[T] = @[]
for x in a:
chunk.add(x)
if chunk.len == size:
yield chunk
chunk = @[]
if chunk.len > 0:
yield chunk
proc sumUniquePriorities(input: seq[string]): int =
var prioritiesSum = 0
for line in input:
let compartments = line.toSeq.distribute(2).mapIt(toHashSet(it))
let commonItem = (compartments[0] * compartments[1]).toSeq[0]
prioritiesSum += priorities[commonItem]
prioritiesSum
proc sumBadgesPriorities(input: seq[string]): int =
var prioritiesSum = 0
for triplet in chunks(input, 3):
var sacks = triplet.mapIt(toHashSet(it))
var badgeItem = (sacks[0] * sacks[1] * sacks[2]).toSeq[0]
prioritiesSum += priorities[badgeItem]
prioritiesSum
let input = open(paramStr(1)).lines.toSeq
echo fmt"Sum of priorities for unique items: {sumUniquePriorities(input)}"
echo fmt"Sum of priorities for badges: {sumBadgesPriorities(input)}"
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment