Published
Edited
Dec 16, 2021
Insert cell
# advent of code - day 14
Insert cell
{
let { start, formulas } = parse(example)
let result = start
Array.from(Array(10)).forEach(step =>{
result = grow(result, formulas)
})

let count = [...new Set(Array.from(result))].map(letter => ({letter, count: Array.from(result).filter(l => l==letter).length}))
let v = d3.max(count.map(x => x.count)) - d3.min(count.map(x => x.count))
return { result, v, count, start, formulas }
}
Insert cell
Object.entries({a : 10 }).map(([pair, cnt]) => ({ pair, cnt}))
Insert cell
{
let { start, formulas } = parse(puzzle)
let result = start
Array.from(Array(10)).forEach(step =>{
result = grow(result, formulas)
})

let count = [...new Set(Array.from(result))].map(letter => ({letter, count: Array.from(result).filter(l => l==letter).length}))
let v = d3.max(count.map(x => x.count)) - d3.min(count.map(x => x.count))
return { result, l: result.length, v, count, start, formulas }
}
Insert cell
d3.pairs("NNCB")
Insert cell
{
let { start, formulas } = parse(puzzle)

let depth = 40
let count = {}
let pairs = {}
Array(...new Set(Object.values(formulas))).forEach(v => count[v] = 0)
Object.keys(formulas).forEach(v => pairs[v] = 0)

d3.pairs(Array.from(start)).forEach(p => {
pairs[p[0]+p[1]] += 1
})
Array.from(Array(depth)).forEach(step =>{
let newPairs = {}
Object.keys(formulas).forEach(v => newPairs[v] = 0)

Object.entries(pairs).forEach(([pair, cnt]) =>{
const p1 = pair[0]+formulas[pair]
const p2 = formulas[pair]+pair[1]

newPairs[p1] += cnt
newPairs[p2] += cnt
})

//pairs = {...newPairs}
})

Object.entries(pairs).forEach(([pair, cnt]) => {
count[pair[0]] += cnt
count[pair[1]] += cnt
})

Object.entries(count).map(([char, cnt]) => count[char] = Math.ceil(cnt/2))
let result = (d3.max(Object.values(count)) - d3.min(Object.values(count)))
return { result, pairs, count, depth, start, formulas }
}
Insert cell
grow = (template, formulas)=>{
let result = Array.from(template)
.reduce((p,c) => p+formulas[p[p.length-1]+c]+c)//p[p.length-1]+formulas.find(f => f[0] == p[p.length-1]+c)[1]+c)

return result
}
Insert cell
parse = (instructions) => {
let start = instructions.split("\n\n")[0]
let formulas = {}
instructions.split("\n\n")[1]
.split("\n")
.map(f => f.split(" -> "))
.forEach(f => formulas[f[0]] = f[1])

return { start, formulas }
}
Insert cell
example = `NNCB

CH -> B
HH -> N
CB -> H
NH -> C
HB -> C
HC -> B
HN -> C
NN -> C
BH -> H
NC -> B
NB -> B
BN -> B
BB -> N
BC -> B
CC -> N
CN -> C`
Insert cell
puzzle = `HHKONSOSONSVOFCSCNBC

OO -> N
VK -> B
KS -> N
PK -> H
FB -> H
BF -> S
BB -> V
KO -> N
SP -> K
HK -> O
PV -> K
BP -> O
VO -> V
OP -> C
BS -> V
OK -> V
KN -> H
KC -> N
PP -> F
NB -> V
CH -> V
HO -> K
PN -> H
SS -> O
CK -> P
VV -> K
FN -> O
BH -> B
SC -> B
HH -> P
FO -> O
CC -> H
OS -> H
FP -> S
HC -> F
BO -> F
CF -> S
NC -> S
HS -> V
KF -> O
ON -> C
CN -> K
VF -> F
NO -> K
CP -> N
HF -> K
CV -> N
HN -> K
VH -> B
KK -> P
CS -> O
VS -> P
NH -> F
CB -> S
BV -> P
FK -> F
NV -> O
OV -> K
SB -> N
NF -> O
VN -> S
OH -> O
PS -> N
HB -> H
SV -> V
CO -> H
SO -> P
FV -> N
PF -> O
NN -> S
KB -> P
NP -> F
OC -> S
FS -> P
FH -> P
VP -> K
BN -> O
NS -> H
VB -> V
PO -> K
KP -> N
SN -> O
BC -> H
SF -> V
PC -> O
NK -> F
BK -> V
KH -> S
SH -> S
SK -> H
OB -> V
PH -> N
PB -> C
HV -> N
HP -> V
FF -> B
OF -> P
VC -> S
KV -> C
FC -> F`
Insert cell

Purpose-built for displays of data

Observable is your go-to platform for exploring data and creating expressive data visualizations. Use reactive JavaScript notebooks for prototyping and a collaborative canvas for visual data exploration and dashboard creation.
Learn more