Update to Day Four: Try using the parjs library to parse the input, instead of Regex

This commit is contained in:
Lewis Dale 2023-12-04 21:54:46 +00:00
parent 95c8195e7a
commit 9806b225d1
3 changed files with 49 additions and 7 deletions

View File

@ -18,6 +18,7 @@
"typescript": "^5.3.2"
},
"dependencies": {
"lodash": "^4.17.21"
"lodash": "^4.17.21",
"parjs": "^0.16.1"
}
}

View File

@ -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[] {

View File

@ -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"