I am not Henry.

It looks like you already caught that, but ...

...just saying,

-- 
Raul


On Wed, Sep 28, 2016 at 6:58 AM, Erling Hellenäs
<[email protected]> wrote:
> Hi all !
>
> My solution, sort version:
>
> NB. Erling
>
> ZigZagE=:([: /: ] (([: $ [) $ ]) [: (], [: |. [: }: }.) [: i. [) { ]
>
> NB. Mike
>
> start =: i.@(<. #)
>
> nstep =: (0 >. (-~ #)) >.@% <:@[
>
> diffs =: (,:~ |.)@:+:@start
>
> tconvert =: (]{~(#@])([-.~~.@:<.) ,@|:@(+/\)@ (start, nstep $diffs))
>
> NB. Raul
>
> zzc =: (#@] $ ((] , -) i.)@<:@[) ;@:(</.) ]
>
> NB. just an arbitrary long string
>
> text=.'THISISJUSTSOMERANDOMSENTENCEFORTESTINGTHEZIGZAGPROBLEMSOLUTIONSTHISISJUSTSOMERANDOMSENTENCEFORTESTINGTHEZIGZAGPROBLEMSOLUTIONSTHISISJUSTSOMERANDOMSENTENCEFORTESTINGTHEZIGZAGPROBLEMSOLUTIONSTHISISJUSTSOMERANDOMSENTENCEFORTESTINGTHEZIGZAGPROBLEMSOLUTIONS'
>
> NB. do 15 zigzags
>
> timespacex '(2 + i.15) tconvert"0 _ text' NB. see Mike Day's solution
>
> 0.000187304 33664
>
> timespacex '(2 + i.15) zzc"0 _ text'
>
> 0.000118455 24576
>
> timespacex '(2 + i.15) ZigZagE"0 _ text'
>
> 6.54281e_5 17536
>
> ((2 + i.15) tconvert"0 _ text) -: (2 + i.15) zzc"0 _ text
>
> 1
>
> ((2 + i.15) tconvert"0 _ text) -: (2 + i.15) ZigZagE"0 _ text
>
> 1
>
> 1 ZigZagE 'PAYPALISHIRING'
>
> PAYPALISHIRING
>
>
> Cheers,
>
> Erling
>
>
>
> On 2016-09-28 09:53, 'Mike Day' via Programming wrote:
>>
>> Lots of chat while I was asleep... Breakfast now.
>>
>> Yes,  that's a pity.
>> nsteps returns infinity for 1 row and string longer than one element.
>>
>> I'm rather less embarrassed now that I see that Henry's zzc also fails in
>> this case,  returning "length error" !
>>
>> However, his zzc is much more compact than tconvert,  so it's not too
>> surprising it is somewhat faster.
>>
>> It's tempting to special-case larg = 1 to return the unaltered input
>> string,
>> though not very rigorous.
>>
>> You mention (in a later message) the performance in other languages,
>> or, perhaps, the lack of information on this.  Has anyone had sight
>> of their code/methods?
>>
>> Thanks,
>> Mike
>>
>> On 28/09/2016 01:59, 'Jon Hough' via Programming wrote:
>>>
>>> Yes, thanks. I didn't think this problem could be solved purely tacitly,
>>> but seems I was wrong.
>>>
>>> By the way, small nitpick, but your solution fails for the case of number
>>> of rows = 1:
>>> 1 tconvert 'SOMETEXT'
>>>
>>>
>>> --------------------------------------------
>>> On Wed, 9/28/16, 'Mike Day' via Programming <[email protected]>
>>> wrote:
>>>
>>>   Subject: Re: [Jprogramming] Zig Zag problem
>>>   To: [email protected]
>>>   Date: Wednesday, September 28, 2016, 12:21 AM
>>>     You might enjoy this
>>>   tacit version:
>>>         start
>>>   =: i.@(<. #)
>>>       nstep =: (0 >. (-~
>>>   #)) >.@% <:@[
>>>       diffs =: (,:~
>>>   |.)@:+:@start
>>>       tconvert =:
>>>   (]{~(#@])([-.~~.@:<.) ,@|:@(+/\)@ (start, nstep
>>>   $diffs))
>>>     M
>>>       On 27/09/2016
>>>   15:27, 'Mike Day' via Programming wrote:
>>>   > Thanks.  It's nice to find an
>>>   array-based solution to something that
>>>   >
>>>   looks loopy!
>>>   >
>>>   > These
>>>   comments might help. (I talk about rows and columns as in
>>>   the
>>>   > original problem,
>>>   > though in my code the intermediate array
>>>   is transposed. Even columns
>>>   > are
>>>   diagonals
>>>   > in the original!):
>>>   >
>>>   > "difs" is
>>>   the expected differences between row-wise adjacent pairs of
>>>     > indices.
>>>   >
>>>   > "start" is merely the indices in
>>>   the first column.
>>>   >
>>>   >
>>>   "nstep" hopes to be an over-estimate of the
>>>   remaining number of colums
>>>   > after
>>>   "start"
>>>   >
>>>   >
>>>   +/\start, nstep$difs calculates the indices, in general with
>>>   some >:
>>>   > l, the length
>>>   > of the input string.
>>>   >
>>>   > l<. ... limits the
>>>   indices to <: l
>>>   >
>>>   >
>>>   l -. ~ ~.  .... removes l from the nub of indices
>>>   >
>>>   > y{~ ... reorders the
>>>   input array as required.
>>>   >
>>>   > Mike
>>>   >
>>>   >
>>>   >
>>>   >
>>>   On 27/09/2016 14:49, 'Jon Hough' via Programming
>>>   wrote:
>>>   >>> NB. colon separates
>>>   monad and dyad sections
>>>   >> I did not
>>>   know that, thanks.
>>>   >>
>>>   >> Your solution is great. I'll have
>>>   to spend a little time figuring out
>>>   >> what's
>>>   >>
>>>   going on, but I can't find any flaws yet. And much more
>>>   J-like than
>>>   >> mine.
>>>   >>
>>>   >> Regards,
>>>   >> Jon
>>>   >>
>>>   --------------------------------------------
>>>   >> On Tue, 9/27/16, 'Mike Day'
>>>   via Programming
>>>   >> <[email protected]>
>>>   wrote:
>>>   >>
>>>   >>   Subject: Re:
>>>   [Jprogramming] Zig Zag problem
>>>   >>   To: [email protected]
>>>   >>   Date: Tuesday, September
>>>   27, 2016, 10:38 PM
>>>   >>
>>>      Yes, our messages
>>>   >>   crossed.
>>>   >>     I'm lazy with
>>>   >>   verb definitions, nearly
>>>   always using 3 : 0 even
>>>   >>   for a dyad.  I could
>>>   have written
>>>   >>     cv =:
>>>   3 : 0
>>>   >>   3
>>>   >>   cv y   NB.
>>>   monad section:  supply a default larg
>>>   >>   for monad use
>>>   >>   :            NB.
>>>   colon
>>>   >>   separates monad
>>>   and dyad sections
>>>   >>   [dyad
>>>   >>   section]
>>>   >>   )
>>>   >>     then 3 would be the
>>>   default left arg if used as
>>>   >>   a monad.
>>>   >>   As it is,  attempting to
>>>   use it as
>>>   >>   a monad will
>>>   result in a
>>>   >>   domain
>>>   error.
>>>   >>     In my
>>>   example tableau for
>>>   >>   depth 5, I should have
>>>   pointed out
>>>   >>   that
>>>   the
>>>   >>   differences
>>>   between columns are alternately 8 6 4 2 0 and 0
>>>   >>   2 4 6 8
>>>   >>     Any clearer?
>>>   >>   Mike
>>>   >>     On
>>>   >>   27/09/2016 14:22,
>>>   'Jon Hough' via Programming
>>>   >>   wrote:
>>>   >>   > Sorry, I gave the
>>>   correct verb
>>>   >>   in my
>>>   second mail.
>>>   >>   >
>>>   >>   >
>>>   >>   Thanks for your solution.
>>>   I'm not really sure I
>>>   >>   understand what cv
>>>   is...
>>>   >>   > Is it a
>>>   monad
>>>   >>   (i.e. 3 : 0)? It
>>>   has a reference to the x argument, so it
>>>   >>   seems to be a dyad.
>>>   >>   > Also, what is the
>>>   >>   purpose of the colon on
>>>   the first line of cv?
>>>   >>   >
>>>   >>   > Thanks,
>>>   >>   > Jon
>>>   >>   >
>>>   >>   --------------------------------------------
>>>   >>   > On Tue, 9/27/16,
>>>   'Mike Day' via
>>>   >>   Programming <[email protected]>
>>>   >>   wrote:
>>>   >>   >
>>>   >>   >   Subject:
>>>   Re: [Jprogramming]
>>>   >>   Zig
>>>   Zag problem
>>>   >>   >   To: [email protected]
>>>   >>   >   Date:
>>>   Tuesday, September 27,
>>>   >>   2016, 10:12 PM
>>>   >>   >
>>>   >>   >   rmo's
>>>   definition?
>>>   >>   >
>>>   >>   >   Anyway,
>>>   here's an
>>>   >>   approach
>>>   >>   >   which
>>>   works on
>>>   >>   the
>>>   indices.
>>>   >>   >   Please
>>>   note
>>>   >>   that
>>>   >>   >   I
>>>   haven't tested
>>>   >>   it
>>>   thoroughly for boundary problems.
>>>   >>   >
>>>   >>   >   I just
>>>   consider the rising
>>>   >>   >   diagonals
>>>   as extra columns.
>>>   >>   Top
>>>   & bottom
>>>   >>   >   indices
>>>   >>   will be reduplicated,
>>>   but can be
>>>   >>   >   removed
>>>   with nub.
>>>   >>   >
>>>   >>   >   eg
>>>   for
>>>   >>   >   LHA =
>>>   5, we get this index
>>>   >>   array:
>>>   >>   >   0
>>>   8
>>>   >>   >   (8)
>>>   >>   >   1
>>>   7   9
>>>   >>   >   2
>>>   >>   >   6
>>>   10
>>>   >>   >   3  5
>>>   11  ..
>>>   >>   >   4
>>>   (4)
>>>   >>   >   12
>>>   (12)
>>>   >>   >
>>>   >>   >   It
>>>   actually works
>>>   >>   >   on the
>>>   transpose first.
>>>   >>   >
>>>   >>   >   cv
>>>   >>   >   =: 3 :
>>>   0
>>>   >>   >   :
>>>   >>   >   n =.
>>>   x
>>>   >>   >   difs =.
>>>   (,:~|.) +:@i. n
>>>   >>   <.l
>>>   =. #y
>>>   >>   >   start=.
>>>   >>   i.n<.l
>>>   >>   >   nstep=.
>>>   (0
>>>   >>   >   >.
>>>   l-n) >.@% n-1
>>>   >>   >   y{~
>>>   l-.~
>>>   >>   >   ~.l<.,|:+/\start,nstep$difs
>>>   >>   >   )
>>>   >>   >
>>>   >>   >
>>>   >>      3 4 5 cv each/
>>>   >>   >   '';'paypa';1
>>>   >>   2 3
>>>   >>   >   4;'paypalishiring'
>>>   >>   >   ++-----+-------+--------------+
>>>   >>   >   ||paapy|1
>>>   2 4
>>>   >>   3|pahnaplsiigyir|
>>>   >>   >   ++-----+-------+--------------+
>>>   >>   >   ||payap|1
>>>   2 3
>>>   >>   4|pinalsigyahrpi|
>>>   >>   >   ++-----+-------+--------------+
>>>   >>   >   ||paypa|1
>>>   2 3
>>>   >>   4|phasiyirpligan|
>>>   >>   >   ++-----+-------+--------------+
>>>   >>   >
>>>   >>   >   Any
>>>   use?
>>>   >>   >   Mike
>>>   >>   >
>>>   >>   >
>>>   >>   >   On
>>>   27/09/2016 13:02, 'Jon
>>>   >>   Hough' via
>>>   >>   >   Programming
>>>   >>   wrote:
>>>   >>   >   >
>>>   This is a
>>>   >>   >   programming
>>>   challenge from
>>>   >>   here:
>>>   https://leetcode.com/problems/zigzag-conversion/
>>>   >>   >   >
>>>   The challenge is to
>>>   >>   convert a string into
>>>   >>   >   a
>>>   >>   "zig zag"
>>>   formation with the given number of
>>>   >>   >   rows.
>>>   >>   >   >
>>>   >>   >   >
>>>   e.g. (from
>>>   >>   >   the
>>>   link)
>>>   >>   >   >
>>>   PAYPALISHIRING is
>>>   >>   transformed
>>>   >>   >   into
>>>   >>   PAHNAPLSIIGYIR (the link
>>>   explains clearly this
>>>   >>   >   transformation)
>>>   >>   >   >
>>>   >>   >   >
>>>   >>   >   This is
>>>   my solution, which
>>>   >>   works.
>>>   >>   >   >
>>>   >>   >   >
>>>   >>   >   >
>>>   NB. Convert text into
>>>   >>   >   a
>>>   zigzag text.
>>>   >>   >   >
>>>   NB. x: number of row
>>>   >>   >   (positive
>>>   integer)
>>>   >>   >   >
>>>   NB. y: string
>>>   >>   >   text
>>>   >>   >   >
>>>   convert =: 4 : 0
>>>   >>   >   >
>>>   rows =. x
>>>   >>   >   >
>>>   text =.
>>>   >>   >   y
>>>   >>   >   >
>>>   len =. # y
>>>   >>   >   >
>>>   if. 0
>>>   >>   >   = len
>>>   do. ''
>>>   >>   >   >
>>>   elseif. 1 = len
>>>   >>   >   do.
>>>   text
>>>   >>   >   >
>>>   elseif. 1 = rows do.
>>>   >>   text
>>>   >>   >   >
>>>   elseif. 1 do.
>>>   >>   >   >
>>>   k=.
>>>   >>   >   0
>>>   >>   >   >
>>>   l=. 0
>>>   >>   >   >
>>>   res =.
>>>   >>   >   ''
>>>   >>   >   >
>>>   NB. loop through the
>>>   >>   rows
>>>   >>   >   >
>>>   while. (k <
>>>   >>   rows)
>>>   *. k < len do.
>>>   >>   >   >
>>>   res =. res, k{text
>>>   >>   >   >
>>>   >>   >   NB. how
>>>   much to increment.
>>>   >>   first and last rows
>>>   are
>>>   >>   >   special
>>>   >>   >   >
>>>   NB. cases, inner rows
>>>   >>   switch
>>>   >>   >   the
>>>   increment.
>>>   >>   >   >
>>>   nextMax =. (2 * rows)
>>>   >>   -
>>>   >>   >   2
>>>   >>   >   >
>>>   rm1 =. rows - 1
>>>   >>   >   >
>>>   >>   >   l1
>>>   =.
>>>   >>   >
>>>   ((+:@:(rm1&-))`(nextMax&[)@.((rmo&=)+.(0&=)))
>>>   >>   >   k
>>>   >>   >   > l2
>>>   =.
>>>   >>   > ((+:)`(nextMax&[)@.((rm1&=)+.(0&=)))k
>>>   >>   >   >
>>>   NB. first incremented
>>>   >>   value
>>>   >>   >   >
>>>   nextIndex =. k
>>>   >>   + l1
>>>   >>   >   >
>>>   >>   >   NB.
>>>   flag indicates which
>>>   >>   increment to use.
>>>   >>   >   >
>>>   >>   flag =. 1
>>>   >>   >   >
>>>   while.
>>>   >>   >   nextIndex
>>>   < len do.
>>>   >>   >   >
>>>   res =. res,
>>>   >>   >   nextIndex{text
>>>   >>   >   >
>>>   flag =. (flag = 0)
>>>   >>   >   >
>>>   if. flag do. nextIndex
>>>   >>   =. nextIndex +
>>>   >>   >   l1
>>>   >>   >   >
>>>   else. nextIndex =.
>>>   >>   nextIndex + l2
>>>   >>   >   >
>>>   >>   end.
>>>   >>   >   >
>>>   end.
>>>   >>   >   > k
>>>   =. k + 1 NB. increment
>>>   >>   the row
>>>   >>   >   >
>>>   end.
>>>   >>   >   >
>>>   res
>>>   >>   >   >
>>>   end.
>>>   >>   >   >
>>>   >>   >   >
>>>   )
>>>   >>   >   >
>>>   >>   >   > 3
>>>   convert
>>>   >>   'PAYPALISHIRING'
>>>   >>   >   >
>>>   >>   >   >
>>>   It's an
>>>   >>   >   interesting
>>>   challenge and
>>>   >>   I'm
>>>   sure there is a much nicer
>>>   >>   >   way to
>>>   do this in J...
>>>   >>   >   >
>>>   >>   >   >
>>>   Regards,
>>>   >>   >   >
>>>   Jon
>>>   >>   >   >
>>>   >>   >
>>>   >>
>>> ----------------------------------------------------------------------
>>>   >>   >   >
>>>   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
>>>   >
>>>   >
>>> ----------------------------------------------------------------------
>>>   > 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
----------------------------------------------------------------------
For information about J forums see http://www.jsoftware.com/forums.htm

Reply via email to