I am not Henry. It looks like you already caught that, but ...
...just saying, -- Raul On Wed, Sep 28, 2016 at 6:58 AM, Erling Hellenäs <[email protected]> wrote: > Hi all ! > > My solution, sort version: > > NB. Erling > > ZigZagE=:([: /: ] (([: $ [) $ ]) [: (], [: |. [: }: }.) [: i. [) { ] > > NB. Mike > > start =: i.@(<. #) > > nstep =: (0 >. (-~ #)) >.@% <:@[ > > diffs =: (,:~ |.)@:+:@start > > tconvert =: (]{~(#@])([-.~~.@:<.) ,@|:@(+/\)@ (start, nstep $diffs)) > > NB. Raul > > zzc =: (#@] $ ((] , -) i.)@<:@[) ;@:(</.) ] > > NB. just an arbitrary long string > > text=.'THISISJUSTSOMERANDOMSENTENCEFORTESTINGTHEZIGZAGPROBLEMSOLUTIONSTHISISJUSTSOMERANDOMSENTENCEFORTESTINGTHEZIGZAGPROBLEMSOLUTIONSTHISISJUSTSOMERANDOMSENTENCEFORTESTINGTHEZIGZAGPROBLEMSOLUTIONSTHISISJUSTSOMERANDOMSENTENCEFORTESTINGTHEZIGZAGPROBLEMSOLUTIONS' > > NB. do 15 zigzags > > timespacex '(2 + i.15) tconvert"0 _ text' NB. see Mike Day's solution > > 0.000187304 33664 > > timespacex '(2 + i.15) zzc"0 _ text' > > 0.000118455 24576 > > timespacex '(2 + i.15) ZigZagE"0 _ text' > > 6.54281e_5 17536 > > ((2 + i.15) tconvert"0 _ text) -: (2 + i.15) zzc"0 _ text > > 1 > > ((2 + i.15) tconvert"0 _ text) -: (2 + i.15) ZigZagE"0 _ text > > 1 > > 1 ZigZagE 'PAYPALISHIRING' > > PAYPALISHIRING > > > Cheers, > > Erling > > > > On 2016-09-28 09:53, 'Mike Day' via Programming wrote: >> >> 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 <[email protected]> >>> wrote: >>> >>> Subject: Re: [Jprogramming] Zig Zag problem >>> To: [email protected] >>> 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 >>> >> <[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 >>> ---------------------------------------------------------------------- >>> 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
