Skip to content

Instantly share code, notes, and snippets.

@claytonflesher
Created December 5, 2021 03:47
Show Gist options
  • Save claytonflesher/67f8da64f1837d5b142f406db75ee4cb to your computer and use it in GitHub Desktop.
Save claytonflesher/67f8da64f1837d5b142f406db75ee4cb to your computer and use it in GitHub Desktop.
output application/json
import fromBinary from dw::core::Numbers
var inputData = readUrl("classpath://inputs/day3.txt", "text/plain")
then (result) -> result splitBy "\n"
var lines = inputData map flatten($ scan /./)
var columns = sizeOf(lines[0]) - 1
var findMostCommon = (collection: Array, index: Number) ->
using (entries = collection map $[index])
using (groups = entries groupBy $)
if (sizeOf(groups.'0') > sizeOf(groups.'1'))
'0'
else if (sizeOf(groups.'0') < sizeOf(groups.'1'))
'1'
else
'1'
var findLeastCommon = (collection: Array, index: Number) ->
using (entries = collection map $[index])
using (groups = entries groupBy $)
if (sizeOf(groups.'0') > sizeOf(groups.'1'))
'1'
else if (sizeOf(groups.'0') < sizeOf(groups.'1'))
'0'
else
'0'
var findRatings = (candidates: Array, index: Number, target: String) ->
candidates filter $[index] == target
var initialAcc = {
oxygen: lines,
C02: lines
}
var ratings = (0 to columns) reduce ((column, acc = initialAcc) ->
{
oxygen: if (sizeOf(acc.oxygen) == 1)
acc.oxygen
else
findRatings(acc.oxygen, column, findMostCommon(acc.oxygen, column)),
C02: if (sizeOf(acc.C02) == 1)
acc.C02
else
findRatings(acc.C02, column, findLeastCommon(acc.C02, column))
}
)
---
fromBinary(ratings.oxygen[0] joinBy "") * fromBinary(ratings.C02[0] joinBy "")
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment