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

Reply via email to