How about brute force?

   zigzag=:[:,./[:((5 4$' ')(0 0;2 0;4 0;2 2)}~])"1[:]_4,\]
   zigzag 'PAYPALISHIRING'
P   A   H   N

A P L S I I G

Y   I   R

On Tue, Sep 27, 2016 at 1:27 PM, Henry Rich <[email protected]> wrote:

>    zzc =: (#@] $ ((] , -) i.)@<:@[) ;@:(</.) ]
>    3 zzc 'PAYPALISHIRING'
> PAHNAPLSIIGYIR
>
> Henry Rich
>
>
> On 9/27/2016 11:21 AM, 'Mike Day' via Programming wrote:
>
>> 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/forum
>>>> s.htm
>>>> ----------------------------------------------------------------------
>>>>   For information about J forums see http://www.jsoftware.com/forum
>>>> s.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