Published
Edited
Dec 24, 2020
1 fork
1 star
Insert cell
Insert cell
parsed = sample2.trim().split('\n\n')
Insert cell
rules = {
const rules = []

function fromList(list) {
const subRules = list.split(" ")
return (msg) => {
for (const r of subRules) {
const [b, left] = rules[r](msg)
if (!b) return [false, left]
msg = left
}
return [true, msg]
}
}

for (const lines of parsed[0].split('\n')) {
const [i, list] = lines.split(': ')
if (list.includes('"')) { // "a"
const [, ch] = list.match(/"([^"]+)"/)
rules[i] = msg => [ msg[0] === ch, msg.slice(1) ]
} else if (list.includes("|")) { // 2 3 | 1 2
const parts = list.split(' | ').map(fromList)
rules[i] = (msg) => parts.map(p => p(msg)).find(p => p[0]) || [false, msg]
} else { // 4 1 5
rules[i] = fromList(list)
}
}
return rules
}
Insert cell
messages = parsed[1].split('\n')
Insert cell
rules[0]('babbbbaabbbbbabbbbbbaabaaabaaa')
Insert cell
rules[8].toString()
Insert cell
part1 = messages.filter(msg => {
const [r, left] = rules[0](msg)
return r && left.length === 0
})
Insert cell
Insert cell
Insert cell
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