Re: Programming: List Structure Manipulation

*To*: mathgroup at christensen.cybernetics.net*Subject*: [mg930] Re: Programming: List Structure Manipulation*From*: Count Dracula <lk3a at kelvin.seas.virginia.edu>*Date*: Wed, 3 May 1995 00:09:15 -0400*Organization*: University of Virginia

In article 250 of comp.soft-sys.math.mathematica rubin at msu.edu (Paul A. Rubin) writes: > In article <3nck7m$a07 at news0.cybernetics.net>, > Xah Y Lee <xyl10060 at fhda.edu> wrote: > ->Can anyone show me better ways to write the following function? > -> > ->fun[listA_, styleList_]:= > -> Table[ > -> Append[ > -> Flatten@{ First@RotateLeft[styleList,t-1] }, listA[[t]] > -> ], > -> {t, Length@listA} > -> ] > -> > [snip] > The following, somewhat cumbersome, definitions produce a function "fun" > (defined, for convenience, in terms of another function "fun1") which > matches all your examples and seems tolerably quick. There is probably a > more efficient way of coding it, but at the moment this is the best that > comes to mind. > > Clear[ fun, fun1 ]; > fun1[ x_List, y_List ] := MapThread[ fun1, {x, y} ] /; > Length[ x ] == Length[ y ] > fun1[ x_List, y_List ] := > Module[ > {z = Partition[ x, Length[ y ] ], w}, > w = Drop[ x, Length[ Flatten[ z, 1 ] ] ]; > If[ w != {}, z = Append[ z, w ] ]; > fun1[ #, y ]& /@ z > ]/; Length[ x ] > Length[ y ] > fun1[ x_List, y_List ] := > fun1[ x, Take[ y, Length[ x ] ] ] /; Length[ x ] < Length[ y ] > fun1[ x_, y_ ] := Flatten[ {y, x} ] /; Head[ x ] =!= List > fun[ x_, y_ ] := Flatten[ fun1[ x, y ], 1 ] > An alternative definition is: func[index_, letters_] := Flatten /@ Inner[List, Take[Join @@ Array[letters &, Ceiling[Length[index]/Length[letters]]], Length[index]], index, List] The following are the test cases offered by Xah Y Lee: test1 := func[Range[0,5], {a}] == {{a, 0}, {a, 1}, {a, 2}, {a, 3}, {a, 4}, {a, 5}} test2 := func[Range[0,5], {a,b,c}] == {{a, 0}, {b, 1}, {c, 2}, {a, 3}, {b, 4}, {c, 5}} test3 := func[Range[0,10], {{a1, a2}, b}] == {{a1, a2, 0}, {b, 1}, {a1, a2, 2}, {b, 3}, {a1, a2, 4}, {b, 5}, {a1, a2, 6}, {b, 7}, {a1, a2, 8}, {b, 9}, {a1, a2, 10}} test4 := func[Range[0,10], {{a1, a2}, {{b}}, {c1,c2} }] == {{a1, a2, 0}, {b, 1}, {c1, c2, 2}, {a1, a2, 3}, {b, 4}, {c1, c2, 5}, {a1, a2, 6}, {b, 7}, {c1, c2, 8}, {a1, a2, 9}, {b, 10}} The function works as needed (at least for these tests): In[3]:= {test1, test2, test3, test4} Out[3]= {True, True, True, True} -- ___________________________________________________________________________________ Levent Kitis lk3a at cars.mech.virginia.edu lk3a at kelvin.seas.virginia.edu University of Virginia Department of Mechanical, Aerospace and Nuclear Engineering ___________________________________________________________________________________