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

Reply via email to