cwbe coordinatez:
101
63540
2076399
856608
4857954
4858151

ABSOLUT
KYBERIA
permissions
you: r,
system: public
net: yes

neurons

stats|by_visit|by_K
source
tiamat
K|my_K|given_K
last
commanders
polls

total descendants::
total children::1
show[ 2 | 3] flat


Vypocet v zoznamovej monade:

>>> import operator
>>> concat = lambda xs: reduce(operator.concat, xs, [])
>>> fm = lambda p,xs: [[]] if not xs else concat([map(lambda y: [xs[0]]+y, fm(p,xs[1:])) if b else fm(p,xs[1:]) for b in p(xs[0])])
>>> fm(lambda _: [True, False], [1,2,3,4])
[[1, 2, 3, 4], [1, 2, 3], [1, 2, 4], [1, 2], [1, 3, 4], [1, 3], [1, 4], [1], [2, 3, 4], [2, 3], [2, 4], [2], [3, 4], [3], [4], []]


Specializovanejsi postup:
>>> fm = lambda xs: [[]] if not xs else map(lambda y: [xs[0]]+y, fm(xs[1:])) + fm(xs[1:])
>>> fm([1,2,3,4])
[[1, 2, 3, 4], [1, 2, 3], [1, 2, 4], [1, 2], [1, 3, 4], [1, 3], [1, 4], [1], [2, 3, 4], [2, 3], [2, 4], [2], [3, 4], [3], [4], []]




00000101000635400207639900856608048579540485815104858210
ziman
 ziman      14.08.2009 - 17:36:34 (modif: 14.08.2009 - 17:38:02) [4K] , level: 1, UP   NEW !!CONTENT CHANGED!!
este ma napada, ze by sa to dalo mierne upravit takto:

fm = lambda x: [[x[0]]+y for y in fm(x[1:])] + fm(x[1:]) if x else [[]]

co je trochu strucnejsie

0000010100063540020763990085660804857954048581510485821004858425
mimmon
 mimmon      14.08.2009 - 20:30:48 , level: 2, UP   NEW
tak tomuto hovorim elegantne riesenie.. vdaka

este si to vyskusam (nie som na svojom pocitaci, nemam tu python), musim vidiet na vlastne oci, ze to bezchybne funguje.. :)

ale opat obdivujem moznosti, co ponuka lambda

000001010006354002076399008566080485795404858151048582100485842504858491
ziman
 ziman      14.08.2009 - 21:20:08 , level: 3, UP   NEW
A inak, velmi som ti nepomohol, pretoze som ti prezradil rovno riesenie, bral som to skor ako taku zabavku pre seba.

Skus ale z neho vycitat, ako to funguje a preco, co ten zapis znamena.

00000101000635400207639900856608048579540485815104858210048584250485849104858530
mimmon
 mimmon      14.08.2009 - 21:51:38 , level: 4, UP   NEW
myslim, ze som to pochopil, ide viac-menej o riesenie pomocou rekurzie.. a urcite si aj sam vyskusam vyrobit tu funkciu.. ja to beriem tiez ako zabavku, hoci jej aplikaciu aj realne vyuzijem

0000010100063540020763990085660804857954048581510485821004858425048584910485853006386100
mimmon
 mimmon      14.12.2011 - 16:08:57 , level: 5, UP   NEW
prvocisla

def divi(a):
  for i in range(2,int(sqrt(a))+1):
    if not a%i: return [i]+divi(a/i)
  return [a]

000001010006354002076399008566080485795404858151048582100485842504858491048585300638610006452945
repelent
 repelent      20.01.2012 - 14:21:26 (modif: 20.01.2012 - 14:25:24), level: 6, UP   NEW !!CONTENT CHANGED!!
Python (cpython aspon) ma defaultne dost nizky limit na rekurziu (1000), takze radsej by som sa rekurzii vyhol v pripadoch, kde na ten limit mozes narazit. To len tak mimochodom. Pripadne sa da zmenit pomocou sys.setrecursionlimit() ale neviem aky to ma dopad na performance.

edit: a tiez pouzivaj xrange namiesto range ak to pises v python 2.x; xrange vracia generator co je setrnejsie ak a) nepotrebujes celu sekvenciu b) sekvencia je fakt velka. v python 3.x uz range vracia generator

00000101000635400207639900856608048579540485815104858210048584250485849104858530063861000645294506458244
mimmon
 mimmon      23.01.2012 - 14:46:06 , level: 7, UP   NEW
dakujem za tip

taketo prakticke rady a usmernenia by som potreboval castejsie :)

000001010006354002076399008566080485795404858151048582100485842504858481
ziman
 ziman      14.08.2009 - 21:16:34 (modif: 14.08.2009 - 21:20:33), level: 3, UP   NEW !!CONTENT CHANGED!!
na to nepotrebujes lambdu :)

def fm(x): return [[x[0]]+y for y in fm(x[1:])] + fm(x[1:]) if x else [[]]

len som to tam tak nejak zo zotrvacnosti...

0000010100063540020763990085660804857954048581510485821004858334
ksyz
 ksyz      14.08.2009 - 19:15:32 , level: 2, UP   NEW
sick :)