Re: A friendly challenge: Generalized Partition
- To: mathgroup at smc.vnet.net
- Subject: [mg34932] Re: A friendly challenge: Generalized Partition
- From: gleam at flashmail.com ("Mr. Wizard")
- Date: Thu, 13 Jun 2002 02:38:23 -0400 (EDT)
- Sender: owner-wri-mathgroup at wolfram.com
Since it seems you're all coming up with code pretty much identical to mine, as well as to each other's, I see no point in waiting to post the code I had previously arrived at. My fastest was: f[l_,p_]:=Take[l,#]&/@c@p c=Compile[{{p,_Integer,1}},Transpose@{#~Drop~-1+1,Rest@#}&@FoldList[Plus,0,p]]; And and shortest: f[l_,p_]:=Block[{v=0},l~Take~{v+1,v+=#}&/@p] I compiled the larger part of the first function shortly before posing this challenge, but doesn't seem to have provided any real advantage, so I am going back a version without it for my own use. I was using length and sum checking to replicate some of the functionality of ggCheckArgs, in this final form: dynamicPartition[l_List,p_List]/;Length@l>=Tr@p:= Take[l,#]&/@Transpose@{#~Drop~-1+1,Rest@#}&@FoldList[Plus,0,p] a more secure check, as (roughly) suggested by Hartmut Wolf, would be: dynamicPartition[l_List,p:{_Integer?NonNegative..}]/;Length@l>=Tr@p:= Take[l,#]&/@Transpose@{#~Drop~-1+1,Rest@#}&@FoldList[Plus,0,p] Paul