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