[Jprogramming] Zig Zag problem
Don Guinn
donguinn at gmail.com
Wed Sep 28 00:40:56 UTC 2016
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 <henryhrich at gmail.com> 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 <programming at jsoftware.com>
>>>> wrote:
>>>>
>>>> Subject: Re: [Jprogramming] Zig Zag problem
>>>> To: programming at 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 <programming at jsoftware.com>
>>>> wrote:
>>>> >
>>>> > Subject: Re: [Jprogramming]
>>>> Zig Zag problem
>>>> > To: programming at 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/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
>
More information about the Programming
mailing list