Created
December 4, 2022 01:19
-
-
Save zoldar/46a3150d3ab47c7ac054fefa6b61b543 to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| 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