Just like last year I'm working through Advent of Code challenges. Jus
like last year I'm probably going to fall out in the next day or two :)
Nevertheless, I'm still holding up, and have a question.
The 4th day part 2 quest has a test, semi-quoting: two adjacent matching
digits that are not part of a larger group of matching digits. So 112 is
fine (two 1's) but 111 is not. Also 11122 is fine, we're just looking
for any occurrence of two adjacent matching digits.
I write some clojure in my day job and there's this function
partition-by[1]. With a word like that the check could simply be
digits [ ] partition-by [ length 2 = ] any?
where digits explodes the number into a vector of its digits.
Alas, I couldn't find such a word and after a lot of looking around
nothing similar. Grouping and clumping and such didn't lead me to any
simple solution, so I just rolled something dirty:
: -reset ( cnt curr next -- one next ) [ 2drop 1 ] dip ;
: -inc ( cnt curr next -- cnt+1 curr ) drop [ 1 + ] dip ;
: -init ( seq -- cnt curr seq ) [ 1 ] dip unclip-slice swap ;
: has-2? ( seq -- ? ) -init [ 2dup = not [ pick 2 = [ ] [ -reset f ]
if ] [ -inc f ] if ] find [ 2drop 2 = ] dip or ;
I was thinking about writing partition-by myself but I don't like using
locals and I just wasn't able to come up with a simple solution on the
stack.
Thoughts/pointers welcome!
P.S.: if anyone wants to see/compare/review my solutions so far I can
post it somewhere, just let me know.
[1] https://clojuredocs.org/clojure.core/partition-by
--
------------
Peter Nagy
------------
_______________________________________________
Factor-talk mailing list
[email protected]
https://lists.sourceforge.net/lists/listinfo/factor-talk