On 2018-12-10 16:40, John Benediktsson wrote:
> Using fry is convenient.  Due to how we bootstrap factor, we can't use
> fry right now in "core" vocabularies, like sequences, so you'll see a
> fair amount of curry and compose which are more or less what fry is
> doing, just not as clean syntax.
> 
> I love the REPL advent idea, go for it!  And as you learn or hit
> roadblocks or have questions, please share.
> 
> You can see how supremum-by is implemented by clicking on it in an
> expression, or doing ``see``.  It uses ``after?`` instead of ``>``,
> which allows it to compare other kinds of objects with ``<=>`` when
> numbers are not passed in.
> 
> Also, you might try using ``map-reduce`` which is a little faster than
> using ``unclip-slice`` and ``reduce``, (and using ``_ bi@`` instead of
> ``[ _ call ] bi@`` to simplify):
> 
> : max-by ( seq quot -- result )
>     [ ] swap '[ [ _ bi@ > ] 2keep ? ] map-reduce ; inline
> 
> Best,
> John.
> 
> On Mon, Dec 10, 2018 at 6:46 AM Alexander Ilin <ajs...@yandex.ru>
> wrote:
> 
>> Hey there!
>>
>> Sure, you can ask us here. I'm on sick leave, so got plenty of
>> time.
>> Coincidentally, working on my Factor hobby project.
>>
>> What you're looking for is called supremum-by.
>>
>> Terminology is a bit uncommon. Look up supremum and infimum in the
>> help system.
>>
>> 10.12.2018, 17:06, "pet...@riseup.net" <pet...@riseup.net>:
>>> Hello fellow concatenative fans.
>>>
>>> I'm working my way through this year's advent of code[0]. I'm
>> doing it
>>> in factor with a small twist - everything happening inside the
>> REPL.
>>> Makes it more fun and challenging (for me), although I don't have
>> any
>>> code to show for it in the end.
>>>
>>> I'm trying to find the right tools for the job since there's a lot
>> of
>>> words already available. Sometimes I reinvent something before I
>> find
>>> it, e.g. I wrote a last-n before finding last*.
>>>
>>> Would it be OK if I sometimes ask you for tips on what would be
>>> idiomatic/simpler/shorter/faster than what I have(n't) found?
>>>
>>> The first problem I really couldn't find is picking a maximum from
>> a
>>> sequence based on a quotation pulling out the key. An example will
>> say
>>> it the best I guess:
>>>
>>>> { { 1 2 } { 1 3 } { -1 4 } } [ second ] max-by .
>>>
>>> { -1 4 }
>>>
>>> Here is my definition:
>>>
>>> : max-by ( seq quot -- result ) [ unclip-slice ] dip '[ [ [ _ call
>> ] bi@
>>>> ] 2keep ? ] reduce ; inline
>>>
>>> Using fry for such a general word would be a bit of an overkill
>> but for
>>> demonstration purposes it's OK I guess.
>>>
>>> Is there no standard word that already does something similar? Or
>> is
>>> there a way to write this with the existing sequence combinators
>> that
>>> it's so short there was no need to create this generic word?
>>>
>>> --
>>> ------------
>>> Peter Nagy
>>> ------------
>>>
>>> _______________________________________________
>>> Factor-talk mailing list
>>> Factor-talk@lists.sourceforge.net
>>> https://lists.sourceforge.net/lists/listinfo/factor-talk
>>
>> ---=====---
>> Александр
>>
>> _______________________________________________
>> Factor-talk mailing list
>> Factor-talk@lists.sourceforge.net
>> https://lists.sourceforge.net/lists/listinfo/factor-talk
> _______________________________________________
> Factor-talk mailing list
> Factor-talk@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/factor-talk

Jon, Alex, hi.

Any reason why supremum-by and infimum-by are not on the "Searching
sequences" doc page? If you agree I can add these together with supremum
and infimum.

I'll take a look at map-reduce, thanks. I switched from using the factor
IDE REPL to emacs with Fuel because today I kept creating an infinite
loop and couldn't break it for the life of me in the IDE. In emacs it
was C-c C-c. Since I couldn't break it I didn't even know it's an
infinite loop. That led me to open a file and save the definitions for
debugging purposes, so I kind of broke my rules at this point. Oh well,
at least I solved another "day" today, although I'm rather behind at
this point, not enough time.

As far as roadblocks go, here is my solution to the 5th day. (react) is
ugly with t/f, that's where I had the infinite loop and just quickly
hacked the solution in. It takes quite a while to run, showing profile
output further down:

USING: arrays io.encodings.utf8 io.files kernel math math.ranges
prettyprint
sequences ;

IN: aoc
: reacts? ( a b -- ? ) - abs 32 = ;
: (react) ( seq -- seq ? ) dup [ last ] [ dup length 2 - swap nth ] bi
reacts? [ 2 head* t ] [ f ] if ;
: has-2? ( seq -- ? ) length 2 >= ;
: react ( seq -- seq ) dup has-2? [ (react) [ react ] when ] when ;
: (flow) ( seq seq -- seq seq ) unclip-slice swap [ suffix! ] dip ;
: flow ( seq seq -- seq ) dup empty? [ drop ] [ (flow) [ react ] dip
flow ] if ;
: load5 ( -- str ) "5.txt" utf8 file-contents ;
: solve5 ( seq seq -- len ) flow length ;
: upper ( c -- c ) dup 96 > [ 32 - ] when ;
: nounit ( seq u -- seq ) [ [ upper ] dip = not ] curry filter ;
: do5-2 ( str u -- res ) [ nounit V{ } clone swap solve5 ] keep 2array ;
: solve5-2 ( str -- res ) CHAR: A CHAR: Z [a,b] swap [ swap do5-2 ]
curry map [ first ] infimum-by ;

----

IN: aoc V{ } clone load5

--- Data stack:
V{ }
"bBCRGgrwgKknNGWnNWUuwHoeEtTOvEeVhYZzrZJjFfzNnpPHtTgGhNtTxBeEb..."
IN: aoc [ solve5 ] profile top-down profile.
depth   time ms  GC %  JIT %  FFI %   FT %
  15    4073.0   3.41   0.00   7.64   0.00 T{ thread f "Initial"
~quotation~ ~quotation~ 17 ~box~ f t f H{...
  16    3821.0   0.60   0.00   1.99   0.00   react
  17    3818.0   0.60   0.00   1.99   0.00     (react)
  18    3811.0   0.60   0.00   1.99   0.00       subseq-unsafe-as
  19    1275.0   0.00   0.00   0.00   0.00         M\ array nth-unsafe
  20     694.0   0.00   0.00   0.00   0.00           M\ fixnum
integer>fixnum
  19    1065.0   0.00   0.00   0.00   0.00         M\ array
set-nth-unsafe
  20     132.0   0.00   0.00   0.00   0.00           M\ fixnum
integer>fixnum
  19     579.0   0.00   0.00   0.00   0.00         +
  19     391.0   0.00   0.00   0.00   0.00         M\ growable
set-nth-unsafe
  20     155.0   0.00   0.00   0.00   0.00           M\ vector
underlying>>
  19     359.0   0.00   0.00   0.00   0.00         M\ growable
nth-unsafe
  20     169.0   0.00   0.00   0.00   0.00           M\ vector
underlying>>
  19      78.0  29.49   0.00  97.44   0.00         M\ vector
new-sequence
  20      77.0  29.87   0.00  98.70   0.00           <array>
  20       1.0   0.00   0.00   0.00   0.00           M\ fixnum
integer>fixnum
  19       1.0   0.00   0.00   0.00   0.00         -
  19       1.0   0.00   0.00   0.00   0.00         integer?
  18       3.0   0.00   0.00   0.00   0.00       M\ vector like
  18       1.0   0.00   0.00   0.00   0.00       head*
  19       1.0   0.00   0.00   0.00   0.00         -
  18       1.0   0.00   0.00   0.00   0.00       M\ sequence nth
  19       1.0   0.00   0.00   0.00   0.00         M\ integer
bounds-check?
  18       1.0   0.00   0.00   0.00   0.00       M\ growable nth-unsafe
  19       1.0   0.00   0.00   0.00   0.00         M\ vector
underlying>>
  18       1.0   0.00   0.00   0.00   0.00       head
  17       1.0   0.00   0.00   0.00   0.00     has-2?
  17       1.0   0.00   0.00   0.00   0.00     >=
  16     251.0  46.22   0.00  93.63   0.00   (flow)
  17     240.0  48.33   0.00  97.92   0.00     push
  18     237.0  48.95   0.00  99.16   0.00       resize-array
  17       4.0   0.00   0.00   0.00   0.00     M\ string nth-unsafe
  18       2.0   0.00   0.00   0.00   0.00       M\ fixnum
integer>fixnum
  17       3.0   0.00   0.00   0.00   0.00     M\ virtual-sequence
nth-unsafe
  18       2.0   0.00   0.00   0.00   0.00       M\ slice virtual@
  19       1.0   0.00   0.00   0.00   0.00         +
  17       2.0   0.00   0.00   0.00   0.00     M\ slice length
  17       1.0   0.00   0.00   0.00   0.00     >
  17       1.0   0.00   0.00   0.00   0.00     integer?
  16       1.0   0.00   0.00   0.00   0.00   M\ slice length

subseq-unsafe-as seems to be the culprit, which shows up in the output
only when I use nth in (react), so I guess nth is being inlined and I
don't see where is this call coming from. This is basically getting the
second to last value from a vector, I couldn't find a simpler and faster
solution. Maybe a clean array would have less overhead but I'd have to
rewrite the algo and keep a "real length" or pointer into it which might
slow the whole thing down again.

So, is nth really that slow? :)

Another thing that tricked me:

IN: aoc V{ 1 2 3 } 2 head-slice* 3 suffix! >array .
{ 1 }
IN: aoc V{ 1 2 3 } rest-slice 3 suffix! >array .
{ 2 3 }

Slices work differently than I expected :) Are there clojure-like data
structures that are immutable and structurally share most of their
content?


-- 
------------
  Peter Nagy
------------


_______________________________________________
Factor-talk mailing list
Factor-talk@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/factor-talk

Reply via email to