lambdaway
::
powerset
5
|
list
|
login
|
load
|
|
_h1 powerset _ul [[https://rosettacode.org/wiki/Power_set|https://rosettacode.org/wiki/Power_set]] {pre '{def powerset {def powerset.r {lambda {:ary :ps :i} {if {= :i {A.length :ary}} then :ps else {powerset.r :ary {powerset.rr :ary :ps {A.length :ps} :i 0} {+ :i 1}} }}} {def powerset.rr {lambda {:ary :ps :len :i :j} {if {= :j :len} then :ps else {powerset.rr :ary {A.addlast! {A.concat {A.get :j :ps} {A.new {A.get :i :ary}}} :ps} :len :i {+ :j 1}} }}} {lambda {:ary} {A.new {powerset.r :ary {A.new {A.new}} 0}}}} -> {def powerset {def powerset.r {lambda {:ary :ps :i} {if {= :i {A.length :ary}} then :ps else {powerset.r :ary {powerset.rr :ary :ps {A.length :ps} :i 0} {+ :i 1}} }}} {def powerset.rr {lambda {:ary :ps :len :i :j} {if {= :j :len} then :ps else {powerset.rr :ary {A.addlast! {A.concat {A.get :j :ps} {A.new {A.get :i :ary}}} :ps} :len :i {+ :j 1}} }}} {lambda {:ary} {A.new {powerset.r :ary {A.new {A.new}} 0}}}} } _p testing {prewrap '{powerset {A.new 1 2 3 4}} -> {powerset {A.new 1 2 3 4}} '{powerset {A.new ø}} -> {powerset {A.new ø}} } {script var powerset_rr = function(ary,ps,len,i,j) { if (j === len) return ps else { ps.push( ps[j].concat(ary[i]) ); return powerset_rr( ary, ps, len, i, j+1 ); } }; var powerset_r = function(ary,ps,i) { if (i === ary.length) return ps else return powerset_r( ary, powerset_rr(ary,ps,ps.length,i,0), i+1) }; var powerset = function(ary) { return powerset_r(ary,[ [] ],0) }; var __powerset = function(ary) { var ps = [ [] ]; for (var i=0; i < ary.length; i++) { for (var j = 0, len = ps.length; j < len; j++) { ps.push( ps[j].concat(ary[i]) ); } } return ps; }; var run = function() { var r = powerset([1,2,3,4]); document.getElementById("output").innerHTML = JSON.stringify(r) }; setTimeout( run, 1 ) }
lambdaway v.20211111