'Folding' a list

Questions and discussion about building and using Max for Live devices
Post Reply
cip23
Posts: 32
Joined: Wed Mar 31, 2010 9:46 pm

'Folding' a list

Post by cip23 » Fri Jul 06, 2012 7:19 am

I'm looking for a way to 'fold' a list, so that a given list [1, 2, 3, 4] repeats until a certain index is reached.

Pseudocode:
[1,2,3,4].fold(10)
becomes [1, 2, 3, 4, 1, 2, 3, 4, 1, 2]

I didn't find a zl object to do this, but I could be wrong...

Any ideas?

best regards,
Christoph

toscanini
Posts: 410
Joined: Thu May 05, 2005 5:42 pm

Re: 'Folding' a list

Post by toscanini » Fri Jul 06, 2012 3:08 pm

That's pretty much what zl group does...

doubleUG
Posts: 157
Joined: Sun Apr 24, 2011 7:19 am

Re: 'Folding' a list

Post by doubleUG » Fri Jul 06, 2012 4:46 pm

Code: Select all

<pre><code>
----------begin_max5_patcher----------
583.3oc0VFraiBCDF9LUpuCV9b1JClPB6s8deCVUU4.yl3HvDgcZy1p8cesG
fDRangfnQsW7HFOYxOeLyX+5s23QWTrCzTxOI+l348p0iG5y4wqwgGMWrKIS
nw.oIE44fxPmTuoA1YvMLxrLhMTx8RsgjApkqND0eJTFs7EvEoO6NVi+MBSx
JoZ4ikPhoRHAQyr6SBBQiOKBMyuiQdnc1ThbLazeUJEY6+iTaykpLvfh0uwq
LECsXw5eDD1N1hsllfYn2+c6MNq0Lo2HIGzZwR38HwmDP3jPxQ18gkIUPRwV
EFK+bjpRol+tApvDkdfGmfh7Xtia7PWJHSwUd7PfXvofXPGPzevPzlmEPI8h
wfzUKRnKDpkeLQB4QspqpHxwkUaDkVdXfxGAkXQF9OvFkZNVG3JX33Bd1l42
Wx8RFQmISfKGjNJdlZp49HAiQSHe3Mlmplxe9nCoKqw7f8zsngibKZyft33C
Ejt0QBmyF+Vztq4VWHUelkbUMs73Qtji2UI2dIUBZ6ocBirP0dVhSCVYMEUG
qdg7v2JzFGfuCL1mBZYW8tY5neDJBH+PDMg3mZ+nwBPc1ddtRu5KDE+wkdUh
DGf81K3guptMdCr0EaKSZPSyDYRqW2TPajJTPshxcW.6fy8QsRllBpiN6LUp
cmmldlqY0ag4NO87BCk+0UXtAJ8TXruhBa10mX86SI+qrvtteJm0Kcwt5.q+
5Z37pdplXylmfRccpqjj8rh0EktmilT8rTU8bUlokvSxlexTqGLq1k+CiI4Q
9A
-----------end_max5_patcher-----------
</code></pre>

cip23
Posts: 32
Joined: Wed Mar 31, 2010 9:46 pm

Re: 'Folding' a list

Post by cip23 » Fri Jul 06, 2012 8:20 pm

ShelLuser wrote:I don't think group is very useful here since it also requires to know the size of the list.

Reg otoh. allows you to store a list and output it as many times as you like. So all you need is something like uzi to output a specified number of bangs, like so:
Thanks. I needed to take care of the case that the new list is shorter than the old one, and also not output anything if the list is changed (the int with the desired new length should trigger the output). So group was needed, as well as reg, uzi, etc.

So it became a little bit more complicated:

Code: Select all


<pre><code>
----------begin_max5_patcher----------
1484.3ocyZszjahCD9L9WgJttSlEId58VNlp1a6wTolBaz3QIXgWPdxrIU9u
uRpEXvFH7v3wWvVBjn6u9qeHg94JK6MYuQKrQ+E5yHKqetxxR2kpCKSaK68w
usMMtP+X16oEEw6n1O.2SPeSn6GiHHWjGxGEfBQQn0HrS4CwOtO6nHkJzSA1
z6gXw1WX7cOkS2J.Q.6D7nyCnvP0UL1S+SziNnuXFyyYbQA6GT87Pj2F5Flc
w+cfByisc0HXIZwKayW+fmcsYgGuW+v1eLmEmVSRY7RAkTJn4zBJWDKXY75B
qRxjBKVc0wbA8E0X90pUpKObsvzwCjtq0XmiBiP9gWWfz85Bj9ZbzMb133li
BQFezfEwSy5BzPFwo7ZkleAnrIluqUfgzp5imfpHmfMz71UExuUUvNZsv+Rc
Yn1cFWX+POZJdjTfIgAzuKeUW3UbHWKbsgLN8fLNPzjP8OtdCEYpqyQ2.kty
XAimV63VKFfK4Q+qYL.7nildEY.nTVg3omyRSl.p.7.H.Y.dxdHsiJjoFZTI
oRGd.KLfgbVXozWo4Ex.l0zKK63CGp0sUsgnPvulomH+Gp5hwgtvUckSekUN
90PmR6xpxadJIG3o3BATvZ7xKH7DfIsg6Ry19MZRMOPK6D5yiaVxNP4mFgS8
jAlLB0eRFudxjyeywGSUzi1LjMu+ywaocN3VMeV16xYIYbkPzXjptKecRM1W
yx7qK25mfGenkAKxxR2DmqLIaRoML0ROjXNaerfJXf7PbpFGaODMr9bQ4wx4
3khs4YooMlJ3Nu1xcRjrgszuyRDunmqSnUiBDqyyp661n+97ga5G+iTTNcW8
a0ZhtNckgD1Dc4CdWjqqGu4N7nenlW8Eo18sOaZamdzkGdeE.YTDvIoYEPVk
AMMNnKhQnHUZ7mqYvuV0vKmY.udplgaCZVPSk.CBOczDaJVWip9jYCm5R35E
RCuCfzlk8bNCcaJMNuaHE2OjhWCjxPHPg+4KFZ7LzNgR+6a1o.kh1LYpIFhw
F4epdxY6n2XAFW.mtSDNw2F37O5yOGOL+bnBzq.ZpKCnKfjbeyKk4f1kmc7v
Lnl5053Bfpu6BmDx49FN+yYyJg0Guvrxn6dRYJkOcJIr7aecdb20KKiz89FJ
O9CV23n6fnjDOyhFuZEDU9auANuG3nfFzM.5LrXiAPTQ+xqcoyAcmVs1M1ls
eOEV4o8eyJDnOf9ndaYPrBjbQNIHoDhh4n2PwRgcu.k8LRsB1hGsuY9uyY0k
XL3yFguEKuz6Nfmom0oWkcX0WYnSV1nROP5Toc5fG9IthF9OTAR7BUS63ZZW
N8eOxxoIx+bfpW780kDNSfC3ViC35Nh0nQMi26m3GNB.m1KVjg1PM.FMoU35
zNakx3csIQZEVc+1wwhri4aKUpxE3iZp7IzBAiWsQeetJL0YO2Krjjl6qFr2
mIGxj7Li74Fopow0KB1eNRUqAteKiUeT6azfzmVT7AoPKjbq1UfAI2snfCRt
Ij.c0kPXVvrnarTJzXzG730Gr2ZkJ.aufe0+WJZ0XXUSQahBfuWjVcV6T0XI
oa3gnPQSjtAlDhKTEjg7oZsTZzfMQg2WN9CNfkyDsDNZ1DYMTufYGiazxUWK
UU3YUqkRacGJuahg4vlxtCLewYP2UsVRMZH1OuoEY3cN7bKp26pX6rrkq7Nm
9XhAaKydPBpErU258NcnyrRGV9sCBV3r6tiv7LEsACGFD3iTSLq+.ub5SzPM
Oj6JuDuENSHl.KFAN0ikY6bBd2qAdhwXaTBrgjsfdI3nQjoaFqPID7O.iktU
qJjoyxSQicQ7qzjmjue4J8eJVHxYaNJfkIW+H976NtJsdLU55g2klsIN0bXh
p1BI6AczW54HuzyohY0ITvb3tz.cysD.NqWmaeMm3q9c6FTjhKsmWFxyWGxy
EB4gcqZ0wIMcnBq6BHryTjHCQjtoRDdnfD91IRd2eFN7frbQyPljM90p+Grc
AXWN
-----------end_max5_patcher-----------
</code></pre>
Do you experienced max programmers have a rule of thumb when it's time to write a javascript function? Like saying: »If there's no object that does more or less what I want out-of-the-box, write a function.«

In Python, this is done in a few lines:

Code: Select all


>>> def foldlist(l,i):
...     nl = []
...     while len(nl)<i:
...             nl.extend(l)
...     return nl[:i]
... 
>>> foldlist([2,3,4],6)
[2, 3, 4, 2, 3, 4]
It's obvious that some things are better done in code, I'm just wondering where one draws the line.

Thanks for your assistance,
best regards,
Christoph

Post Reply