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