one solution takes advantage that the only remaining candidates for parens 
already include them, so simply doing for all

cutAP =: '()'&$: : (<@[ cutP each^:(+./@e.&>)"0 L:1^:_ cutP)

  cutAP 'qq((a(bdc)g)gg(ffff)you)g(ss)'
┌──┬────────────────────────┬─┬──┬┐
│qq│┌┬─────────┬──┬────┬───┐│g│ss││
│  │││┌─┬───┬─┐│gg│ffff│you││ │  ││
│  ││││a│bdc│g││  │    │   ││ │  ││
│  │││└─┴───┴─┘│  │    │   ││ │  ││
│  │└┴─────────┴──┴────┴───┘│ │  ││
└──┴────────────────────────┴─┴──┴┘




adventofcode day 7 parsing can be done with 


BL =: ((<@[`)(`]))(`:6)

'[]' cutAP each BL a

or (since only one level)


'[]' cutP each BL a

where a is cutLF of raw input.

----- Original Message -----
From: 'Pascal Jasmin' via Programming <[email protected]>
To: "[email protected]" <[email protected]>
Sent: Wednesday, December 7, 2016 3:34 PM
Subject: Re: [Jprogramming] parentheses matching

the requirement is to cut based on outer parentheses level.  For inner 
parentheses, if you want those also cut, then you would repeat the function on 
odd indexes.  Yes you got this right


"My guess is you are asking for: each time boxing changes between level 0
and 1 you want a box fret. Box levels beyond 1 are ignored."

Your solution seems beautiful


F=: (]~:0,}:)@:(1<.])

with change to depth to make it ambivalent (and so paren characters a parameter)

depth =: ([: +/\ =/\@(''''&~:) * 1 _1 0 {~ '()' i. ]) :  ([: +/\ 
=/\@(''''&~:)@] * 1 _1 0 {~  i.)cutP =: ({:@] ,~ ]) <;._2~ 1 ,~ (] ~: 0 , 
}:)@:(1 <. ])@:depth

cutP '(a(bdc)g)gg(ffff)'
┌┬───────┬──┬────┬┐
││a(bdc)g│gg│ffff││
└┴───────┴──┴────┴┘

'()' cutP 'qq((a(bdc)g)gg(ffff))g'
┌──┬─────────────────┬─┐
│qq│(a(bdc)g)gg(ffff)│g│
└──┴─────────────────┴─┘

I agree that you may often/always want to tunnel down into the paren group, and 
this is accomplished by repeating the function for odd indexes.


Assert =: 1 : '] [ [ 13!:8^:((0 e. ])`(12"_)) u@]'
cutP2 =: 'Paren mismatch' (2 |#) Assert cutP

one of the neat features of the layout is that a balanced parsing has odd 
number of boxes.  cutP2 raises an error, though off by 2 errors are not caught 
so not completely useful.



invoke =: 4 : 'x `:0 y'"_1
altM =: ($~ #) invoke ]


]`(cutP each) altM cutP 'qq((a(bdc)g)gg(ffff))g'

┌──┬───────────────────┬─┐
│qq│┌┬───────┬──┬────┬┐│g│
│  │││a(bdc)g│gg│ffff│││ │
│  │└┴───────┴──┴────┴┘│ │
└──┴───────────────────┴─┘

which tunnels one level, but I am having difficulty with an elegant solution to 
tunnel through all levels.




----- Original Message -----
From: Raul Miller <[email protected]>
To: Programming forum <[email protected]>
Sent: Wednesday, December 7, 2016 1:31 PM
Subject: Re: [Jprogramming] parentheses matching

I am trying to make sense of your requirements.

Your final example includes some parenthesis, but not others. It also
includes at the same boxing level content from different parenthesis
depths. How does this make sense?

My guess is you are asking for: each time boxing changes between level 0
and 1 you want a box fret. Box levels beyond 1 are ignored.

With that specification, here's my F:

F=: (]~:0,}:)@:(1<.])

Note, of course, that this definition (and the use of <;._2) assumes that
the first character of the argument to depth is a '('. But I think if you
could change your specification such that it boxes level 1 content deeper
than level 0 content that that would solve this one also.

Basically, I think you need to start from what your final result looks
like, and J's boxed type requires that everything be in boxes, so you
should probably want a final result that looks like this:

   ('a';(<'bdc');'g');'gg';(<<'ffff')
┌───────────┬──┬──────┐
│┌─┬─────┬─┐│gg│┌────┐│
││a│┌───┐│g││  ││ffff││
││ ││bdc││ ││  │└────┘│
││ │└───┘│ ││  │      │
│└─┴─────┴─┘│  │      │
└───────────┴──┴──────┘

In other words:

*  Boxing level for characters is 1+depth.

*  Box boundaries are increment boundaries.

* All adjacent content at a given increment level (or higher) gets
contained in one box.

*  All parenthesis get removed.

Do you agree with this specification? (Why or why not?)

Thanks,

-- 
Raul

On Wed, Dec 7, 2016 at 11:56 AM, 'Pascal Jasmin' via Programming <
[email protected]> wrote:

> There is this useful essay
>
> http://code.jsoftware.com/wiki/Essays/Parentheses_Matching
>
> but consider,
>
> depth =: [: +/\ =/\@(''''&~:) * 1 _1 0 {~ '()' i. ]
>
>     depth '(a(bdc)g)gg(ffff)'
> 1 1 2 2 2 2 1 1 0 0 0 1 1 1 1 1 0
>
> my goal is to box an expression such that at the "top level", at least 3
> boxes are generated
>
>
> 'outside (' ; 'inside outer ()' ; 'outside ) and outside next top level ('
>
>
> optionally followed by even number of boxes corresponding to last 2
> conditions.
>
> the most straightforward path I see is to create an argument to <;._2
> sucht that:
>
>  F depth '(a(bdc)g)gg(ffff)'
> 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1
>
>
> and where,
>
>
> 1 0 0 0 0 0 0 0 1 0 0 1 0 0 0 0 1 1 ((<;._2) ' ' ,~ ]) '(a(bdc)g)gg(ffff)'
> ┌┬───────┬──┬────┬┐
> ││a(bdc)g│gg│ffff││
> └┴───────┴──┴────┴┘
>
> what is F?
> ----------------------------------------------------------------------
> 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