diff --git a/package.json b/package.json index b2e3f8c..71b6194 100644 --- a/package.json +++ b/package.json @@ -18,6 +18,7 @@ "typescript": "^5.3.2" }, "dependencies": { - "lodash": "^4.17.21" + "lodash": "^4.17.21", + "parjs": "^0.16.1" } } diff --git a/src/day_four.ts b/src/day_four.ts index 64905d3..b84a9cc 100644 --- a/src/day_four.ts +++ b/src/day_four.ts @@ -1,6 +1,18 @@ import fs from "fs"; -import {Engine} from "./day_three"; -import {forEach} from "lodash"; +import {whitespace, int, string} from "parjs"; +import {between, manySepBy, then} from "parjs/combinators"; + +const cardIdParser = int() + .pipe(between(whitespace())) + .pipe(between(string('Card'), string(': '))); + +const numbersParser = int() + .pipe(between(whitespace())) + .pipe(manySepBy(whitespace())); + +const winningNumberParser = numbersParser + .pipe(between(cardIdParser, string('|'))) + .pipe(then(numbersParser)); export class Scratchcard { private readonly numbers: number[]; @@ -8,11 +20,13 @@ export class Scratchcard { private children: Scratchcard[] = []; constructor(input: string) { - const [_, withoutId] = input.split(':'); - const [winning, ourNumbers] = withoutId.split('|'); + const [ + winningNumbers, + numbers + ] = winningNumberParser.parse(input).value; - this.winningNumbers = this.parseNumberList(winning); - this.numbers = this.parseNumberList(ourNumbers); + this.winningNumbers = winningNumbers; + this.numbers = numbers; } private parseNumberList(input: string): number[] { diff --git a/yarn.lock b/yarn.lock index c206610..f50d58c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -901,6 +901,13 @@ chalk@^4.0.0: ansi-styles "^4.1.0" supports-color "^7.1.0" +char-info@^0.3.2: + version "0.3.2" + resolved "https://registry.yarnpkg.com/char-info/-/char-info-0.3.2.tgz#d4c4d034245c864d1ab17152cd31746b3bd4f0d0" + integrity sha512-6P6KW8crZx+N857wZalB4FreR+PhheSLmAk22c8zbQsFhsDxZP1aTDfmOjrzddgp1IBOl53b0Z8kDQrwh4B//A== + dependencies: + node-interval-tree "^1.3.3" + char-regex@^1.0.2: version "1.0.2" resolved "https://registry.yarnpkg.com/char-regex/-/char-regex-1.0.2.tgz#d744358226217f981ed58f479b1d6bcc29545dcf" @@ -1819,6 +1826,13 @@ node-int64@^0.4.0: resolved "https://registry.yarnpkg.com/node-int64/-/node-int64-0.4.0.tgz#87a9065cdb355d3182d8f94ce11188b825c68a3b" integrity sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw== +node-interval-tree@^1.3.3: + version "1.3.3" + resolved "https://registry.yarnpkg.com/node-interval-tree/-/node-interval-tree-1.3.3.tgz#15ffb904cde08270214acace8dc7653e89ae32b7" + integrity sha512-K9vk96HdTK5fEipJwxSvIIqwTqr4e3HRJeJrNxBSeVMNSC/JWARRaX7etOLOuTmrRMeOI/K5TCJu3aWIwZiNTw== + dependencies: + shallowequal "^1.0.2" + node-releases@^2.0.13: version "2.0.14" resolved "https://registry.yarnpkg.com/node-releases/-/node-releases-2.0.14.tgz#2ffb053bceb8b2be8495ece1ab6ce600c4461b0b" @@ -1876,6 +1890,14 @@ p-try@^2.0.0: resolved "https://registry.yarnpkg.com/p-try/-/p-try-2.2.0.tgz#cb2868540e313d61de58fafbe35ce9004d5540e6" integrity sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ== +parjs@^0.16.1: + version "0.16.1" + resolved "https://registry.yarnpkg.com/parjs/-/parjs-0.16.1.tgz#cce6c1d5cdfc90e2ff8234125af2e3410081d7f2" + integrity sha512-/r+iT+Erol+S33m2NcmbDigCeazTkNKZLBzNJFclqrTOMqQUr1IpM8bL7hc7Ai7GrLpbESLlgP6NYoPfO1HFAA== + dependencies: + char-info "^0.3.2" + lodash "^4.17.21" + parse-json@^5.2.0: version "5.2.0" resolved "https://registry.yarnpkg.com/parse-json/-/parse-json-5.2.0.tgz#c76fc66dee54231c962b22bcc8a72cf2f99753cd" @@ -1998,6 +2020,11 @@ semver@^7.5.3, semver@^7.5.4: dependencies: lru-cache "^6.0.0" +shallowequal@^1.0.2: + version "1.1.0" + resolved "https://registry.yarnpkg.com/shallowequal/-/shallowequal-1.1.0.tgz#188d521de95b9087404fd4dcb68b13df0ae4e7f8" + integrity sha512-y0m1JoUZSlPAjXVtPPW70aZWfIL/dSP7AFkRnniLCrK/8MDKog3TySTBmckD+RObVxH0v4Tox67+F14PdED2oQ== + shebang-command@^2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/shebang-command/-/shebang-command-2.0.0.tgz#ccd0af4f8835fbdc265b82461aaf0c36663f34ea"