Now that I think about it, 2 f/\ y often represents a transition - from condition X to condition -.X and back again. So, I wouldn't be surprised if (<@f`(<@g);.1~ 1 , 2 ~:/\ h) became a fairly standard idiom.
To that point, REB: I'm interested in the use case here. Where did your 1 1 2 2 3 3 4 2 3 4 4 1 2 2 2 1 come from, what does it represent, and why do you need it boxed? BTW, I started packaging this concept up for re-use in http://www.jsoftware.com/svn/DanBron/trunk/general/nest2box.ijs . But I notice it's bug-ridden when the arguments don't start with level-0 nesting, as in '((level 2) level 1 (level 2)) level 0'. Anyone care to take a whack at correcting that? -Dan -----Original Message----- From: [email protected] [mailto:[email protected]] On Behalf Of R.E. Boss Sent: Friday, November 25, 2011 5:59 AM To: Programming forum Subject: Re: [Jprogramming] multiple boxing Your solution is as elegant as brilliant in its simplicity. And your explanation is admirable. I noticed the similarity with nested parenthesized expressions and even remembered these were solved, but could not find the appropriate post(s). I did not however, realize that 'top level items' were the odd and 'nested items' were the even ones. Smart observation. Nor did I know (or was forgotten, but what's the difference?) about the gerundial form of cut. Even though I do not like $: , I see no way to improve your solution (be it that I prefer 2 >/\ {.<] above 2 ~:/\ ]={. ). Thanks for jumping in when you are needed. R.E. Boss -----Oorspronkelijk bericht----- Van: [email protected] [mailto:[email protected]] Namens Dan Bron Verzonden: vrijdag 25 november 2011 4:43 Aan: 'Programming forum' Onderwerp: Re: [Jprogramming] multiple boxing This looks similar to boxing a recursively nested parenthesized expression (or XML, or whatever). So, we can use recursion: foo =: ] <`(<@$:);.1~ 1 , 2 ~:/\ ]={. foo 1 1 2 2 3 3 4 2 3 4 4 1 2 2 2 1 +---+---------------------------+-+-------+-+ |1 1|+---+---------+-+---------+|1|+-----+|1| | ||2 2|+---+---+|2|+-+-----+|| ||2 2 2|| | | || ||3 3|+-+|| ||3|+---+||| |+-----+| | | || || ||4||| || ||4 4|||| | | | | || || |+-+|| || |+---+||| | | | | || |+---+---+| |+-+-----+|| | | | | |+---+---------+-+---------+| | | | +---+---------------------------+-+-------+-+ We start by cutting the list into "top level" items, and "nested" items. Having done this, we only need to recurse into the nested items and process them similarly. Of course, since series of top-level items are grouped together until interrupted a nested item, the list will end up alternating between groups (boxes) of top-level items and groups of nested items, like A B A B A B. So we only need to recurse into the odd boxes, and leave the even boxes alone. The verb's relative simplicity arises from this observation, and the cute gerundial form of ;. which allows us to say f`g;.1 where f and g will be applied cyclically to the partitions of the argument (but if we didn't have that feature, we could emulate it with ^: ). -Dan PS: This assumes you trust $: not to abort with a stack error, which it does sometimes. Though I'd only expect that with long and deeply-nested arguments. But if you wanted to be certain ab initio (or you just have time to kill and find J amusing), you could try rewriting the verb using a bottom-up approach based on ^: . You even could start with the code you (REB) provided to me in a similar thread back in 2009 [1]. [1] Thread "Recursive nesting, avoiding recursion" http://www.jsoftware.com/pipermail/programming/2009-August/016181.html PPS: Happy Thanksgiving! -----Original Message----- From: [email protected] [mailto:[email protected]] On Behalf Of R.E. Boss Sent: Thursday, November 24, 2011 9:27 AM To: Programming forum Subject: [Jprogramming] multiple boxing Given an array of positive integers A starting with 1 and such that 2 > >./ 2 -~/\ A (a next atom in A is at most 1 larger than the preceding one). Now I want the items to be boxed according to this example foo 1 1 2 2 3 3 4 2 3 4 4 1 2 2 2 1 +---+---------------------------+-+-------+-+ |1 1|+---+---------+-+---------+|1|+-----+|1| | ||2 2|+---+---+|2|+-+-----+|| ||2 2 2|| | | || ||3 3|+-+|| ||3|+---+||| |+-----+| | | || || ||4||| || ||4 4|||| | | | | || || |+-+|| || |+---+||| | | | | || |+---+---+| |+-+-----+|| | | | | |+---+---------+-+---------+| | | | +---+---------------------------+-+-------+-+ Any suggestions for foo? R.E. Boss ---------------------------------------------------------------------- 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
