2024-03 in factor
This commit is contained in:
parent
798b759a9c
commit
e8941a3e0e
4 changed files with 103 additions and 2 deletions
|
@ -1,5 +1,5 @@
|
|||
! Copyright (C) 2024 Julien (adyxax) Dessaux.
|
||||
! See https://factorcode.org/license.txt for BSD license.
|
||||
! See https://git.adyxax.org/adyxax/advent-of-code/tree/LICENSE for EUPL license.
|
||||
USING: tools.test aoc.2024.02.private ;
|
||||
IN: aoc.2024.02.tests
|
||||
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
! Copyright (C) 2024 Julien (adyxax) Dessaux.
|
||||
! See https://factorcode.org/license.txt for BSD license.
|
||||
! See https://git.adyxax.org/adyxax/advent-of-code/tree/LICENSE for EUPL license.
|
||||
USING: combinators.short-circuit.smart grouping io io.encodings.utf8 io.files
|
||||
kernel math math.order math.parser prettyprint sequences splitting ;
|
||||
IN: aoc.2024.02
|
||||
|
|
7
2024/03-Mull_It_Over/03-tests.factor
Normal file
7
2024/03-Mull_It_Over/03-tests.factor
Normal file
|
@ -0,0 +1,7 @@
|
|||
! Copyright (C) 2024 Julien (adyxax) Dessaux.
|
||||
! See https://git.adyxax.org/adyxax/advent-of-code/tree/LICENSE for EUPL license.
|
||||
USING: tools.test aoc.2024.03.private ;
|
||||
IN: aoc.2024.03.tests
|
||||
|
||||
{ 161 } [ "example" part1 ] unit-test
|
||||
{ 48 } [ "example2" part2 ] unit-test
|
94
2024/03-Mull_It_Over/03.factor
Normal file
94
2024/03-Mull_It_Over/03.factor
Normal file
|
@ -0,0 +1,94 @@
|
|||
! Copyright (C) 2024 Julien (adyxax) Dessaux.
|
||||
! See https://git.adyxax.org/adyxax/advent-of-code/tree/LICENSE for EUPL license.
|
||||
USING: accessors io.encodings.utf8 io.files kernel make math math.parser peg
|
||||
peg.parsers prettyprint regexp sequences ;
|
||||
IN: aoc.2024.03
|
||||
|
||||
<PRIVATE
|
||||
|
||||
: load_input ( filename -- string )
|
||||
"~/git/adyxax/aoc/2024/03-Mull_It_Over/"
|
||||
swap append utf8 file-contents ;
|
||||
|
||||
! ----- Let's do part1 with regexes --------------------------------------------
|
||||
: get_muls ( string -- instructions )
|
||||
R/ mul\(\d+,\d+\)/ all-matching-subseqs ;
|
||||
|
||||
: mul>result ( string -- n )
|
||||
R/ \d+/ all-matching-subseqs
|
||||
[ string>number ] map
|
||||
product ;
|
||||
|
||||
: part1 ( filename -- n )
|
||||
load_input
|
||||
get_muls
|
||||
[ mul>result ] map
|
||||
sum ;
|
||||
|
||||
! ----- And part2 with a real parser -------------------------------------------
|
||||
TUPLE: computer total multiplying? ;
|
||||
|
||||
GENERIC: compute ( computer item -- computer )
|
||||
TUPLE: do ;
|
||||
M: do compute
|
||||
drop
|
||||
t >>multiplying? ;
|
||||
|
||||
TUPLE: dont ;
|
||||
M: dont compute
|
||||
drop
|
||||
f >>multiplying? ;
|
||||
|
||||
TUPLE: mul opX opY ;
|
||||
M: mul compute
|
||||
over multiplying?>>
|
||||
[ [ opX>> ] [ opY>> ] bi *
|
||||
over total>> + >>total ]
|
||||
[ drop ]
|
||||
if ;
|
||||
|
||||
TUPLE: nop ;
|
||||
M: nop compute
|
||||
drop ;
|
||||
|
||||
: parse_do ( -- parser )
|
||||
"do()" token hide [ drop do boa ] action ;
|
||||
|
||||
: parse_dont ( -- parser )
|
||||
"don't()" token hide [ drop dont boa ] action ;
|
||||
|
||||
: parse_mul ( -- parser )
|
||||
[ "mul(" token hide ,
|
||||
integer-parser ,
|
||||
"," token hide ,
|
||||
integer-parser ,
|
||||
")" token hide ,
|
||||
] seq*
|
||||
[ first2 mul boa ] action ;
|
||||
|
||||
: parse_nop ( -- parser )
|
||||
any-char hide [ drop nop boa ] action ;
|
||||
|
||||
PEG: parse_input ( string -- ast )
|
||||
parse_do
|
||||
parse_dont
|
||||
parse_mul
|
||||
parse_nop
|
||||
4choice
|
||||
repeat1 ;
|
||||
|
||||
: part2 ( filename -- n )
|
||||
load_input
|
||||
parse_input
|
||||
0 t computer boa
|
||||
swap
|
||||
[ compute ] each
|
||||
total>> ;
|
||||
|
||||
PRIVATE>
|
||||
|
||||
: aoc202403 ( -- )
|
||||
"input" part1 .
|
||||
"input" part2 . ;
|
||||
|
||||
MAIN: aoc202403
|
Loading…
Add table
Reference in a new issue