Guest User

Untitled

a guest
Oct 23rd, 2016
57
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.06 KB | None | 0 0
  1. 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
  2.  
  3. @A=(1,3,4,5,3,3,7,2,7,10); # Тестовый массив
  4.  
  5. sub X { # Основная функция
  6. my $n=shift; # $n=первый параметр (текущий остаток)
  7. my @r; # Объявляем массив результатов
  8. while($#_+1) { # пока есть еще параметры
  9. my $c=pop; # вытаскиваем очередной элемент массива (в $c)
  10. my $a=$n-$c; # Вычисляем текущий остаток минус данный элемент массива
  11. if($a>=0) { # Если он больше или ноль
  12. push @r,"$c,$_" for X($a,@_) # Кладем в массив результатов каждый элемент массива,
  13. # который вернет функция перед которым текущий элемент с запятой
  14. }
  15. push @r,$c if(!$a); # Если разность 0 - то кладем в результаты само число
  16. }
  17. @r # возвращаем массив результатов
  18. }
  19. $,="n"; # Выводить результаты разделяя переводом каретки
  20. %x = # хеш
  21. map { # ключами которого являются строки
  22. ((join'+',sort split/,/),1) # разделенных знаком +, отсортированных элементов
  23. } X(10,@A); # построенных для каждого элемента возвращенного функцией
  24. print keys%x # печатаем ключи хеша, т.е. уникальные ответы
  25.  
  26. def r(a,c=[],z=[]):
  27. a.sort()
  28. for i,v in enumerate(a):z+=[c+[v]]if v+sum(c)==10*0**(c+[v]in z)else r(a[i+1:],c+[v],z)*0
  29. return z
  30.  
  31. res = r( [1,4,5,5,2,3,1,4] )
  32. print( res )
  33.  
  34. def recur( arr, curArr, maxSumm ):
  35. arr.sort()
  36. curSumm = sum( curArr ) # текущая набранная сумма, не забываем, что sum([]) == 0
  37. result = []
  38. for i in range( len( arr ) ):
  39. if arr[i] + curSumm == maxSumm: # если в сумме набрали нужное число, то добавляем к результату
  40. result+=[ curArr + [ arr[i] ] ]
  41. elif arr[i] + curSumm < maxSumm: # если сумма меньше, то добавляем результат рекурсивного вызова
  42. result+= recur( arr[i+1:], curArr + [ arr[i] ], maxSumm )
  43. return result
  44.  
  45. def unique( arr ): # уникальные значения массива
  46. unique = []
  47. [ unique.append(i) for i in arr if i not in unique ]
  48. return unique
  49.  
  50. a=>Array(1024).fill``.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)=>!a.find((y,j)=>j<i&""+x==y))
  51.  
  52. ->(a){(1..a.size).flat_map{|n|a.combination(n).select{|c|c.reduce(:+)==10}.uniq}}
  53.  
  54. (1..a.size) # Для диапазона от 1 до длины массива А
  55. .flat_map{ |n| # ...сконкатенировать для каждого следующее (где N текущее):
  56. a.combination(n) # Взять все комбинации длиной N элементов массива А
  57. .select{ |c| # ...выбрав только те из них (где С текущее), в которых:
  58. c.reduce(:+)==10} # Cвёртка С сложением равна 10.
  59. .uniq} # ...убрав повторения.
  60.  
  61. f=(n,s=0,i=0,r=[],c={})=>{s==10&&(c[r.join(',')]=r);for(;s<11&&i<n.length&&(m=r.slice()).push(n[i]);i++)f(n,s+n[i],i+1,m.sort(),c);return c;}
Add Comment
Please, Sign In to add comment