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 <programm...@jsoftware.com> wrote:

  Subject: Re: [Jprogramming] Zig Zag problem
  To: programm...@jsoftware.com
  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
  >> <programm...@jsoftware.com>
  wrote:
  >>
  >>   Subject: Re:
  [Jprogramming] Zig Zag problem
  >>   To: programm...@jsoftware.com
  >>   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 <programm...@jsoftware.com>
  >>   wrote:
  >>   >
  >>   >   Subject:
  Re: [Jprogramming]
  >>   Zig
  Zag problem
  >>   >   To: programm...@jsoftware.com
  >>   >   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

Reply via email to