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