Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- sub X{my$n=shift;my@r;while($#_+1){my$c=shift;my$a=$n-$c;if($a>0){push@r,"$c,$_"for X($a,@_)}push@r,$c if(!$a);}@r}$,="n";%x=map{((join'+',sort split/,/),1)}X(10,@A);print keys%x
- @A=(1,3,4,5,3,3,7,2,7,10); # Тестовый массив
- sub X { # Основная функция
- my $n=shift; # $n=первый параметр (текущий остаток)
- my @r; # Объявляем массив результатов
- while($#_+1) { # пока есть еще параметры
- my $c=pop; # вытаскиваем очередной элемент массива (в $c)
- my $a=$n-$c; # Вычисляем текущий остаток минус данный элемент массива
- if($a>=0) { # Если он больше или ноль
- push @r,"$c,$_" for X($a,@_) # Кладем в массив результатов каждый элемент массива,
- # который вернет функция перед которым текущий элемент с запятой
- }
- push @r,$c if(!$a); # Если разность 0 - то кладем в результаты само число
- }
- @r # возвращаем массив результатов
- }
- $,="n"; # Выводить результаты разделяя переводом каретки
- %x = # хеш
- map { # ключами которого являются строки
- ((join'+',sort split/,/),1) # разделенных знаком +, отсортированных элементов
- } X(10,@A); # построенных для каждого элемента возвращенного функцией
- print keys%x # печатаем ключи хеша, т.е. уникальные ответы
- def r(a,m,c=[],z=[]):
- a.sort();s=sum(c)
- for i,v in enumerate(a): z+=[c+[v]] if v+s==m and c+[v] not in z else r(a[i+1:],m,c+[v],z)*0
- return z
- res = r( [1,4,5,5,2,3,1,4], 10 )
- print( res )
- def recur( arr, curArr, maxSumm ):
- arr.sort()
- curSumm = sum( curArr ) # текущая набранная сумма, не забываем, что sum([]) == 0
- result = []
- for i in range( len( arr ) ):
- if arr[i] + curSumm == maxSumm: # если в сумме набрали нужное число, то добавляем к результату
- result+=[ curArr + [ arr[i] ] ]
- elif arr[i] + curSumm < maxSumm: # если сумма меньше, то добавляем результат рекурсивного вызова
- result+= recur( arr[i+1:], curArr + [ arr[i] ], maxSumm )
- return result
- def unique( arr ): # уникальные значения массива
- unique = []
- [ unique.append(i) for i in arr if i not in unique ]
- return unique
- a=>(a=Array(1024).fill(0).map((x,q)=>a.filter((x,i)=>q&1<<i).sort()).filter(x=>x.reduce((x,y)=>x+y,0)==10)).filter((x,i)=>!a.find((y,j)=>j<i&""+x==y))
- c={};(f=function(s,p,r){if(s==10&&(c[r.join(',')]=r)||s>9)return;for(let i=p;i<n.length&&(m=r.slice()).push(n[i]);i++)f(s+n[i],i+1,m.sort())})(0,0,[]);c
Add Comment
Please, Sign In to add comment