That is a great solution. Thanks. Just for fun I compared it with Mike Day's:
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.000179 33664 timespacex '(2 + i.15) zzc"0 _ text' 0.000114 24576 Leetcode give the users the number of milliseconds it took to run through their unit test suite, but they don't make the unit tests public so it is not possible to compare J solutions with other Leetcode solutions (they only allow Java, C#, C++ etc) -------------------------------------------- On Wed, 9/28/16, Henry Rich <[email protected]> wrote: Subject: Re: [Jprogramming] Zig Zag problem To: [email protected] Date: Wednesday, September 28, 2016, 4:27 AM 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/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
