f=.[:+/]*[:|:(2#~#)#:[:i.2^# f 2 5 7 0 7 5 12 2 9 7 14 g=.[:*/]^[:|:(2#~ #)#:[:i.2^# g 2 5 7 1 7 5 35 2 14 10 70 NB. I didn't check if this solution has already been offered. I just coded it.
Den 21:40 mandag den 2. oktober 2017 skrev Raul Miller <rauldmil...@gmail.com>: Perhaps this is closer to what you want? F=:1 :', u@> { (~. (u@#"0~ i.@>:)&.> #/.~) y' f=: /F *f 2 2 5 7 1 7 5 35 2 14 10 70 4 28 20 140 +f 2 2 5 7 0 7 5 12 2 9 7 14 4 11 9 16 I probably should just merge the two definitions together, but I think this works? (Note that I have sort of assumed that the verb argument to f is an associative verb. If you're doing something where that is not the case... well... I guess I would need more specification.) Thanks, -- Raul On Mon, Oct 2, 2017 at 3:17 PM, Skip Cave <s...@caveconsulting.com> wrote: > Sorry about the wrong terminology. What i meant was: > > Given a vector of random integers (there may be duplicates), what is the > most concise and or efficient way to > generate a list of the numbers along with the sum of all combinations of > the numbers in a single vector? How about the products of all > combinations? > > Skip Cave > Cave Consulting LLC > > On Mon, Oct 2, 2017 at 1:51 PM, Raul Miller <rauldmil...@gmail.com> wrote: > >> Prime factors of an integer are not, in the general case, a set. And >> you really should be careful to avoid specifying a set when what you >> want is not a set. >> >> You might be interested in >> https://rosettacode.org/wiki/Factors_of_an_integer#J ? >> >> That said, refinement is an important part of the specification >> process, so - since it seems you were looking for something different >> - maybe it's worth redoing the specification? >> >> Thanks, >> >> -- >> Raul >> >> >> On Mon, Oct 2, 2017 at 2:09 PM, Skip Cave <s...@caveconsulting.com> wrote: >> > My original approach was even more naive than Marc's: >> > >> > NB. from Roger Hui's Combinations essay on the J website: >> > https://goo.gl/WL4nXn >> > >> > c=: ((= +/"1) |.@:I.@# ]) #:@i.@(2&^) NB. Roger called this >> 'comb2' >> > >> > NB. I used this definition because I could cut & paste one line, and not >> > require an editor >> > >> > a =. 2 2 5 5 >> > >> > ~.(*/"1(4 c 4){a),(*/"1(3 c 4){a),(*/"1(2 c 4){a),, |:(1 c 4){a >> > >> > 100 20 50 4 10 25 2 5 >> > >> > >> > I like to sort it: >> > >> > /:~~.(*/"1(4 c 4){a),(*/"1(3 c 4){a),(*/"1(2 c 4){a),, |:(1 c 4){a >> > >> > 2 4 5 10 20 25 50 100 >> > >> > >> > The final goal of this exercise was to find all the divisors of an >> integer >> > (not just the prime divisors). >> > >> > >> > So you need to find the prime factors of the integer, for example 100: >> > >> > >> > ]a =. q:100 >> > >> > 2 2 5 5 >> > >> > /:~~.(*/"1(4 c 4){a),(*/"1(3 c 4){a),(*/"1(2 c 4){a),, |:(1 c >> 4){a >> > >> > 2 4 5 10 20 25 50 100 >> > >> > >> > So these are all the divisors of 100. >> > >> > >> > To use Raul's verb, it needs some mods. I can't do the unique until the >> > end, because prime factors of an integer are often duplicated. >> > >> > >> > F1=:1 :'u@#~ #:@i.@(2^#)' NB. Here's Raul's verb minus the >> initial >> > unique >> > >> > */F1 q:100 NB. we take the product >> > >> > 1 5 5 25 2 10 10 50 2 10 10 50 4 20 20 100 >> > >> > ~.*/F1 q:100 NB. Now we take the unique >> > >> > 1 5 25 2 10 50 4 20 100 >> > >> > /:~~.*/F1 q:100 NB. Sort it to make it pretty >> > >> > 1 2 4 5 10 20 25 50 100 >> > >> > >> > Didn't really need the 1, but Raul likes the empty combination. >> > >> > >> > Now we put it all in one verb: >> > >> > >> > F2=. /:~~.*/F1 q: >> > >> > F2 100 >> > >> > |length error: F2 >> > >> > | F2 100 >> > >> > F2=. /:~~.*/F1 q:] >> > >> > F2 100 >> > >> > |domain error: F2 >> > >> > | F2 100 >> > >> > >> > So this is above my pay grade. I'll have to stick with my inline code: >> > >> > >> > /:~~.*/F1 q:110 >> > >> > 1 2 5 10 11 22 55 110 >> > >> > /:~~.*/F1 q:43 >> > >> > 1 43 >> > >> > /:~~.*/F1 q:45 >> > >> > 1 3 5 9 15 45 >> > >> > /:~~.*/F1 q:444 >> > >> > 1 2 3 4 6 12 37 74 111 148 222 444 >> > >> > >> > So I can find all the divisors of an integer. >> > >> > >> > Skip >> > >> > >> > >> > >> > >> > >> > Skip Cave >> > Cave Consulting LLC >> > >> > On Mon, Oct 2, 2017 at 12:15 PM, Marc Simpson <m...@0branch.com> wrote: >> > >> >> More naive than Raul's approach, first pass using the 'stats' lib: >> >> >> >> a=.2 5 7 >> >> require'stats' >> >> combv=: ] {~ (comb #@]) >> >> 3 combv a >> >> 2 5 7 >> >> 2 combv a >> >> 2 5 >> >> 2 7 >> >> 5 7 >> >> 1 combv a >> >> 2 >> >> 5 >> >> 7 >> >> combos=: (1 + i.@#) <@combv"0 1 ] >> >> combos a >> >> ┌─┬───┬─────┐ >> >> │2│2 5│2 5 7│ >> >> │5│2 7│ │ >> >> │7│5 7│ │ >> >> └─┴───┴─────┘ >> >> f=: 1 : ';u/"1 each combos y' >> >> +f a >> >> 2 5 7 7 9 12 14 >> >> *f a >> >> 2 5 7 10 14 35 70 >> >> >> >> /M >> >> >> >> On Mon, Oct 2, 2017 at 10:06 AM, Raul Miller <rauldmil...@gmail.com> >> >> wrote: >> >> > For a first effort, I would go with >> >> > >> >> > F=:1 :'(u@#~ #:@i.@(2^#))@~.' >> >> > f=: /F >> >> > >> >> > Hopefully that makes the issues obvious - the specification here calls >> >> > for a result which grows exponentially with the size of the argument >> >> > set. >> >> > >> >> > Also: >> >> > >> >> > The ~. might be extra work, but for typical cases the effort of >> >> > ensuring that the argument is a set is trivial compared to the effort >> >> > of constructing the result. >> >> > >> >> > You did not include the empty combination in your example results, but >> >> > given your specification my initial inclination is to treat that as an >> >> > oversight. >> >> > >> >> > I defined F instead of going straight for f because for testing >> >> > purposes I want to be able to do (<F a), and perhaps similar things. >> >> > >> >> > Thanks, >> >> > >> >> > -- >> >> > Raul >> >> > >> >> > >> >> > On Mon, Oct 2, 2017 at 12:49 PM, Skip Cave <s...@caveconsulting.com> >> >> wrote: >> >> >> Given a set of integers, what is the most concise and or efficient >> way >> >> to >> >> >> list the numbers along with the sum of all combinations of the >> numbers? >> >> the >> >> >> products of all combinations? >> >> >> >> >> >> for example: >> >> >> >> >> >> a =. 2 5 7 >> >> >> + f a NB. 2, 5, 7, (2+5), (2+7), (5+7), (2+5+7) >> >> >> 2 5 7 7 9 12 14 >> >> >> >> >> >> * f a NB. 2, 5, 7, (2*5), (2*7), (5*7), (2*5*7) >> >> >> 2 5 7 10 14 35 70 >> >> >> >> >> >> The function 'f' should work for any verb and any size right argument >> >> noun >> >> >> vector. >> >> >> >> >> >> Skip >> >> >> >> >> >> Skip Cave >> >> >> Cave Consulting LLC >> >> >> ------------------------------------------------------------ >> ---------- >> >> >> For information about J forums see http://www.jsoftware.com/ >> forums.htm >> >> > ------------------------------------------------------------ >> ---------- >> >> > For information about J forums see http://www.jsoftware.com/ >> forums.htm >> >> ---------------------------------------------------------------------- >> >> For information about J forums see http://www.jsoftware.com/forums.htm >> >> >> > ---------------------------------------------------------------------- >> > For information about J forums see http://www.jsoftware.com/forums.htm >> ---------------------------------------------------------------------- >> For information about J forums see http://www.jsoftware.com/forums.htm >> > ---------------------------------------------------------------------- > For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm ---------------------------------------------------------------------- For information about J forums see http://www.jsoftware.com/forums.htm