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

Reply via email to