That parsing approach isn't anything I would want to expose to
potentially hostile content. But for this kind of thing, where I have
hand inspected the arguments, it was "good enough".

(For hostile environments, like content coming unmonitored from the
internet, I would want a ". variant which somehow constrained the
allowed verbs, or I would want a machine which got wiped and rebuilt
rather frequently and which would rather easily self-destruct, with a
clear set of externally imposed limits, to minimize annoyance issues.)

Thanks,

-- 
Raul

On Tue, Jan 4, 2022 at 12:21 PM Jan-Pieter Jacobs
<[email protected]> wrote:
>
> Hi Raul, your version is indeed a very nice simplification of my amend
> cludge.
> Also a nice job on the parsing of the input.
>
>
> On Tue, Jan 4, 2022, 02:49 Raul Miller <[email protected]> wrote:
>
> > Because I could have expressed this clearer, here's a complete
> > implementation of day 13, based on Jan-Pieter Jacobs' approach:
> >
> > prep=: {{
> >    FOLD=.ALONG=.]
> >    X=.|.Y=.0 1
> >    <@(".;._2);._2 toupper rplc&('=';'*';(LF,LF);LF,'/') y,'/'
> > }}
> >
> > fold=: [ ~.@:<. |@(-~ +:)&.|:
> >
> > a13=: [: # (fold {.)&>/
> >
> > b13=: ' #'{~ ((i.@] e."1 #.~) 1+>./)F..(fold~)&>/
> >
> > Using the noun 'sample' defined in
> > http://www.jsoftware.com/pipermail/programming/2022-January/059525.html
> >
> >    a13 prep sample
> > 17
> >    b13 prep sample
> > #####
> > #   #
> > #   #
> > #   #
> > #####
> >
> >
> > (Still looks better in a monospaced font, though...)
> >
> > Anyways, it's almost like this one was designed to illustrate J.
> >
> > --
> > Raul
> >
> > On Mon, Jan 3, 2022 at 2:48 PM Raul Miller <[email protected]> wrote:
> > >
> > > Hmm... I thought I had had trouble using a bitvector left argument to
> > > u;.k (with k in _2 _1 1 2). I am glad to see that that actually works.
> > > I'll have to use that more in the future.
> > >
> > > (And, I noticed, while reading over my code, that I had left a line in
> > > my a13 which was nonsense because it used an earlier naming
> > > convention. Fortunately, it's an innocuous problem. But it's still not
> > > good.)
> > >
> > > C'est la vie...
> > >
> > > Anyways, I like the idea of doing the folds on the coordinate pairs
> > > directly. It was easy for me to visualize what was happening the other
> > > way, but your way is slick.
> > >
> > > That said, introducing a slight representation change (in pfold), you
> > > could have done this for fold:
> > >
> > > pfold=:(('xy'=11&{) * ".@(13&}.));._2@}.@:>@{:
> > >
> > > fold=: [ ~.@:<. |@(-~ +:)&.|:
> > >
> > > Which is ... nice (in my opinion).
> > >
> > > Thanks,
> > >
> > >
> > > --
> > > Raul
> > >
> > >
> > > On Mon, Jan 3, 2022 at 2:06 PM Jan-Pieter Jacobs
> > > <[email protected]> wrote:
> > > >
> > > > Day 13 was sort of involved on the parsing part, and relatively easy
> > on the
> > > > actual solution.
> > > > I kept the dots in the coordinate domain, as it seemed less heavy
> > handed
> > > > than converting it to "paper", the transform is also very easy in the
> > > > coordinate domain.
> > > > I used the dots as is, and encoded the folds as axis, fold_position
> > pairs.
> > > > The append in singlefold updates the row (singlefold operates under
> > &.|:
> > > > such that x is the first row, and y is the second row) corresponding
> > to the
> > > > axis in the fold spec, where newrow calulates that row, performing the
> > > > actual fold. According to the spec, the fold line itself disappears,
> > done
> > > > by remfoldline.
> > > >
> > > > NB. process first part to array of dot coords
> > > > pdots=: (".;._2)@>@{.
> > > > NB. process folds, turning it in ints axis position pairs
> > > > pfold=:(('xy'i.11&{) , ".@(13&}.));._2@}.@:>@{: NB. folds
> > > > NB. Joint process verb for dots and folds
> > > > prep=: (pdots ; pfold)@(<;.2~ (2#LF)&E.)@,&LF NB. parse two fields
> > > >
> > > > i13=: prep in 13 NB. dots ; folds as (axis, index) pairs
> > > >
> > > > NB. A: how many dots after first fold; Dots treated as coordinate pars
> > > > NB. calculate folded row x: |:dots; y:|:fold spec
> > > > NB.      index  mirror   dots@axis
> > > > newrow=: ({:@] ([-|@:-) ({~ {.))
> > > > NB. Perform a single fold: x:dots; y:fold spec
> > > > NB. where,what,into:  newdots, axis,dots  under transpose, to make
> > > > dimension firstaxis in both dots and folds
> > > > singlefold=:         (newrow`({.@])`[}    &.|:)
> > > > NB. remove the fold line (left dots, right fold)
> > > > remfoldline=: ([ #~ ({"1~ {.@]) ~: {:@])
> > > > NB. perform a fold (x: dots; y: fold spec), ~. because folding will
> > overlap
> > > > some dots, which should be counted only once.
> > > > fold=: singlefold ~.@remfoldline ]
> > > >
> > > > Part a performs the fold in the first fold spec, and counts the dots
> > > > surviving the ~. in fold.
> > > > a13=:[: # (fold {.)&>/
> > > >
> > > > Part b does all folds and find 8 capitals; using F.. requires fold
> > specs to
> > > > be right hence it requires ~ .
> > > >
> > > > NB.  draw draws the dots on a paper of a fitting size: x:dot coords;
> > > > seemingly, requires |: for not having vertical, mirrored text.
> > > >
> > > > draw=: [: |: ('#'"_)`]`(' '$~ >:@(>./)@])}~
> > > > NB. do successive folds, then draw
> > > > b13=: (draw F.. (fold~))&>/
> > > > (a13;b13)i13
> > > >
> > > > Likely here and there, there could be some simplifications, e.g.
> > removing
> > > > the &.|: in singlefold and reversing arguments to be used with F..,
> > but the
> > > > above worked satisfactorilly.
> > > >
> > > > Just as a note, my solutions might be complicated, but I was not
> > solving
> > > > the problems in real-time ; actually, now I'm stuck on part B of day
> > 15, so
> > > > in two days, I won't be able to follow this tread (in real-time)
> > anymore
> > > > :/. No worries, I'll post my solutions when I get to solve the
> > problems.
> > > >
> > > > Jan-Pieter
> > > >
> > > >
> > > > On Mon, Jan 3, 2022, 03:43 Raul Miller <[email protected]> wrote:
> > > >
> > > > > https://adventofcode.com/2021/day/13
> > > > >
> > > > > We are now past the half way point for these puzzles.
> > > > >
> > > > > For day 13, our puzzle was about getting the activation code (for a
> > > > > thermal camera).
> > > > >
> > > > > Example data looked like this:
> > > > >
> > > > > sample=:{{)n
> > > > > 6,10
> > > > > 0,14
> > > > > 9,10
> > > > > 0,3
> > > > > 10,4
> > > > > 4,11
> > > > > 6,0
> > > > > 6,12
> > > > > 4,1
> > > > > 0,13
> > > > > 10,12
> > > > > 3,4
> > > > > 3,0
> > > > > 8,4
> > > > > 1,10
> > > > > 2,14
> > > > > 8,10
> > > > > 9,0
> > > > >
> > > > > fold along y=7
> > > > > fold along x=5
> > > > > }}
> > > > >
> > > > > The numbers which look like coordinate pairs were coordinate pairs --
> > > > > each marking a pixel on a sheet of paper. However, the coordinate
> > > > > pairs are "x,y" coordinates, so the first number in the pair selects
> > > > > the column and the second number selects the row.
> > > > >
> > > > > The "fold along" instructions were instructions on how to fold that
> > paper.
> > > > >
> > > > > So, the first step would be to convert the data to a list of fold
> > > > > instructions and a representation of that piece of paper:
> > > > >
> > > > > unpack=:{{
> > > > >    k=. 1+I.(LF,LF) E. y
> > > > >    dims=.1+>./pairs=. _&".;._2 rplc&', ' k {. y
> > > > >    folds=: 2 4 (;".)&>/@:{"1 ;:;._2 (k+1)}. y
> > > > >    folds;|: (i.dims) e."1 dims#.pairs
> > > > > }}
> > > > >
> > > > > Here, the steps were:
> > > > >
> > > > > (1) Find the index of the blank line.
> > > > > (2) coordinate pairs precede that line, and the dimensions of the
> > > > > "piece of paper" would be 1 greater than the largest coordinate along
> > > > > each dimension
> > > > > (3) For the folds, we tokenize each line, extract the relevant tokens
> > > > > (and convert the numbers from literal to integer).
> > > > > (4) Finally, we package up the results. Transpose (|:) fixes the
> > > > > row/column vs x,y issue.
> > > > >
> > > > > S=: unpack sample
> > > > >
> > > > > For the first part all we had to do was figure out how to perform the
> > > > > first fold (and count the lit pixels).
> > > > >
> > > > > The rules for folding were that the axis we were folding on would be
> > > > > empty (no lit pixels), and when lit pixels overlap they merged to
> > > > > become a single pixel. In other words, we combine pixels using +. (or
> > > > > >.).
> > > > >
> > > > > The only real "trick" here is recognizing that the folded half is not
> > > > > only reversed but right (or bottom) aligned rather than the usual J
> > > > > alignment rule for argument cells.
> > > > >
> > > > > (Also, I implemented X folds using transpose and the Y fold
> > > > > implementation.)
> > > > >
> > > > > fold=:{{
> > > > >   'label axis'=. y
> > > > >   if. 'x'=label do.flip=. |: else. flip=. ] end.
> > > > >   paper=. flip x
> > > > >   assert. 0=+/axis { paper
> > > > >   flip (axis{.paper) merge |.(1+axis)}.paper
> > > > > }}
> > > > >
> > > > > merge=:{{
> > > > >   shape=. x (>. * _1 ^ >&{.)&$ y
> > > > >   x +.&(shape&{.) y
> > > > > }}
> > > > >
> > > > > With our fold operation defined, part a was trivial:
> > > > >
> > > > > a13=:{{
> > > > >   'folds paper'=. y
> > > > >   pairs=. |."1 pairs
> > > > >   +/,paper fold {.folds
> > > > > }}
> > > > >    a13 S
> > > > > 17
> > > > >
> > > > > (Also be aware that 'fold' is a verb while 'folds' is a noun.)
> > > > >
> > > > > For part b, we were supposed to perform the entire sequence of folds,
> > > > > and then read the text represented by the resulting pixels. For the
> > > > > sample data, this was just a square (or a lowercase 'o').
> > > > >
> > > > > Of course, for style points we ought to use a fold conjunction here
> > > > > (you can tell someone was having maybe just a bit too much fun
> > putting
> > > > > together these puzzles):
> > > > >
> > > > > b13=: {{
> > > > >   'folds paper'=. y
> > > > >   ' #' {~  paper ]F..(fold~) folds
> > > > > }}
> > > > >
> > > > > Sadly, my argument order was the opposite of what J's fold
> > conjunction
> > > > > needs, but that's simple enough to compensate for. (But ... this
> > could
> > > > > have been more concise.)
> > > > >
> > > > >    b13 S
> > > > > #####
> > > > > #   #
> > > > > #   #
> > > > > #   #
> > > > > #####
> > > > >
> > > > >
> > > > > (It looks better in a mono-spaced font.)
> > > > >
> > > > > --
> > > > > Raul
> > > > >
> > ----------------------------------------------------------------------
> > > > > For information about J forums see
> > http://www.jsoftware.com/forums.htm
> > > > >
> > > > >
> > > > ----------------------------------------------------------------------
> > > > For information about J forums see http://www.jsoftware.com/forums.htm
> > ----------------------------------------------------------------------
> > For information about J forums see http://www.jsoftware.com/forums.htm
> >
> ----------------------------------------------------------------------
> For information about J forums see http://www.jsoftware.com/forums.htm
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to