Because of the hook one of the tildes is redundant so:
   (~. ,. (i.~ ~.) #/. ])v
14 1
16 3
 8 2
 6 2
 5 1
19 1

However AFAICS this algorithm is just manually implementing key. IOW
grouping by ((~.v) i. v) is what key will do anyway. So in fact you can
just write:
   (~. ,. #/.~)v


The following approach following is IMO simpler, more concise and performs
better due to special
casing<http://www.jsoftware.com/help/dictionary/special.htm>
   ({.,#)/.~ v



On Thu, Aug 29, 2013 at 3:31 AM, R.E. Boss <[email protected]> wrote:

>
>    v=:10?.@$20
>    v
> 14 16 8 6 5 8 6 16 16 19
>    (~.v) ,. (((~.v) i. v) #/. v)
> 14 1
> 16 3
>  8 2
>  6 2
>  5 1
> 19 1
>    (~. ,. (i.~ ~.)~ #/. ])v
> 14 1
> 16 3
>  8 2
>  6 2
>  5 1
> 19 1
>
>
> R.E. Boss
>
>
> -----Original Message-----
> From: [email protected]
> [mailto:[email protected]] On Behalf Of Joe Bogner
> Sent: woensdag 28 augustus 2013 14:52
> To: [email protected]
> Subject: Re: [Jchat] programming without loops
>
> I took Ric's solution and expanded it to better understand the steps
> involved. My brain doesn't yet think in terms of @ [:
>
> NumMovies=: 26
>
> NumStudents=: 100
>
> Groups=: NumStudents $ i.3
>
>
> Votes=: ?. NumStudents$NumMovies
>
>
> v=: Groups,. Votes
>
>
> VotesFreqTbl=: (~.v) ,. (((~.v) i. v) #/. v)
>
>
> VotesFreqTbl=: VotesFreqTbl \: 2{"1 VotesFreqTbl NB. sort by votes across
> groups
>
> VotesFreqTbl=: (~: 1{"1 VotesFreqTbl) # VotesFreqTbl NB. deduplicate movie
> entries
>
> MovieProgram=: (0{"1 VotesFreqTbl) ((3&{.))/. VotesFreqTbl NB. take top 3
> choices for each
>
> MovieProgram
>
>
> It's more verbose. I found it easier to understand when tying it back to
> the
> vocabulary page examples.
>
> This statement could use some simplification. It was too heavy on
> parentheses for my taste -- even though that's how I started building it. I
> would take one piece and then compose it with it the next.
>
> VotesFreqTbl=: (~.v) ,. (((~.v) i. v) #/. v)
>
>
> (nub v) stitch  (((nub v) index v) count per group v)
>
>
> When I was writing it, I would start with each piece in parens to work out
> what it was doing.
>
>
> It seems like that might be a good application of a cap or a fork. I
> haven't
> gotten to that level of understanding yet.  Could someone please help in
> the
> syntax?
>
>
> In my mind, it would be like this:
>
>
>  (~. ] ,. ~.] i. ] #/. ]) v
>
>
> Or maybe there is a better way.
>
>
> Thanks for the help
>
>
>
> On Wed, Aug 28, 2013 at 12:01 AM, Ric Sherlock <[email protected]> wrote:
>
> > The code below follows Brian's approach but attempts to simplify some
> > of the array manipulation.
> >
> > NumMovies=: 26
> > NumStudents=: 100
> > Groups=: NumStudents $ i.3
> >
> > Votes=: NumStudents ?.@$ NumMovies
> >
> > VotesTbl=: Groups ,/@(~.@[ ,."0 2 ({.,#)/.~/.) Votes
> >
> > VotesTbl=: (] \: {:"1) VotesTbl           NB. sort by votes across groups
> >
> > VotesTbl=: (#~ [: ~: 1&{"1) VotesTbl      NB. deduplicate movie entries
> > MovieProgram=: ({."1 (3&{.)/. ]) VotesTbl NB. take top 3 choices for
> > each group
> >
> >
> >
> >
> > On Wed, Aug 28, 2013 at 7:58 AM, Joe Bogner <[email protected]> wrote:
> >
> > > Thanks Brian - this looks like it solve it. I will study it to get a
> > better
> > > understanding of how to solve problems like this. Thanks for adding
> > > comments too. It makes the steps more clear.
> > >
> > >
> > > On Tue, Aug 27, 2013 at 8:55 AM, Brian Schott
> > > <[email protected]
> > > >wrote:
> > >
> > > > freqcount=: (\: {:"1)@(~. ,. #/.~) CT =: 100 picks =: CT ?.@$ 26
> > > > groups =: CT $ i. 3
> > > > f =: groups <@freqcount/. picks         NB. freqcounts of picks
> > > > g =:; (i. 3) ((|.&.|:)@>@]<@:,.[)"0 f   NB. appending group #s
> > > > s =: \:~ g                              NB. sorting
> > > > r =: (i.26) ((0,~])\:~@{~1&{"1@]i./ [)s NB. remove duplicates
> > > > t =: |.({:"1@]</.])\:~&.(|.&.|:) r      NB. rearrange
> > > > 3&{. each  t                            NB. first 3
> > > >
> > > > The above may be a solution, but is not well tested. Instead of
> > > > movie names, there are movie numbers.
> > > >
> > > >
> > > >
> > > >
> > > >
> > > >
> > > > On Mon, Aug 26, 2013 at 11:22 PM, Joe Bogner <[email protected]>
> > > wrote:
> > > >
> > > > > I solved this problem today at work in R using a loop and an
> > > intermediate
> > > > > data.table. I generalized it and then tried to solve it in J. I
> > wasn't
> > > > even
> > > > > sure where to start.
> > > > >
> > > > > Let's say you have 100 students and 26 movies that need to be
> > > > > shared
> > > by 3
> > > > > groups of students. Each student has picked their favorite
> > > > > movie. I
> > > need
> > > > to
> > > > > give 3 movies to each of the 3 groups based on the group's
> > > > > favorite choices. A movie can't be shared by groups.
> > > > >
> > > > >
> > > > > movies=:(65 + i. 26) { a.
> > > > >
> > > > > CT=:100
> > > > >
> > > > >
> > > > > NB. movie;student;age group
> > > > >
> > > > > students=:i.CT
> > > > >
> > > > > groups=:(CT $ (i.3))
> > > > >
> > > > > picks=: ((?. CT $ # movies) { movies);students;groups
> > > > >
> > > > >
> > > > > NB. get an idea of what the most common choices are across all
> > > > > groups
> > > > >
> > > > > key=. > 0{"1 picks
> > > > >
> > > > > values=. CT $ 1
> > > > >
> > > > > sum=: +/
> > > > >
> > > > > counts=. (~.key) ; (i.~key) sum/. values
> > > > >
> > > > >
> > > > > NB. sidenote how do I get this table format?
> > > > >
> > > > > NB. |-----|---|
> > > > >
> > > > > NB. |M | 1 |
> > > > >
> > > > > NB. |-----|---|
> > > > >
> > > > > NB. |W| 1 |
> > > > >
> > > > >
> > > > >
> > > > > Any advice on how to tackle this in J?
> > > > >
> > > > >
> > > > > This is the solution in R
> > > > >
> > > > >
> > > > > movies <- LETTERS
> > > > >
> > > > > CT <- 100
> > > > >
> > > > > students <- rep(0:(CT-1))
> > > > >
> > > > > groups <- sample(0:2,100,replace=T)
> > > > >
> > > > > picks <- data.table(data.frame(movie=sample(movies,100,
> > > > > replace=T),student=students, group=groups))
> > > > >
> > > > >
> > > > >
> > > > > movie.groups <- picks[,.N,by=list(movie,group)]
> > > > >
> > > > > movie.groups[,Taken:=F]
> > > > >
> > > > >
> > > > > ugroups <- unique(groups)
> > > > >
> > > > > for(i in 1:length(ugroups)) {
> > > > >
> > > > >     g<-ugroups[i]
> > > > >
> > > > >     top3 <- movie.groups[group==g & Taken==F,][order(-N)][1:3]
> > > > >
> > > > >
> > > > >     setkey(top3,movie,group)
> > > > >
> > > > >     setkey(movie.groups,movie,group)
> > > > >
> > > > >     movie.groups[top3, ForGroup:=T,nomatch=0]
> > > > >
> > > > >
> > > > >     setkey(top3, movie)
> > > > >
> > > > >     setkey(movie.groups,movie)
> > > > >
> > > > >     movie.groups[top3, Taken:=T,nomatch=0]
> > > > >
> > > > > }
> > > > >
> > > > >
> > > > >
> > > > > >movie.groups[ForGroup==T,list(movie,group)][order(group)]
> > > > >
> > > > >    movie group
> > > > >
> > > > > 1:     P     0
> > > > >
> > > > > 2:     T     0
> > > > >
> > > > > 3:     W     0
> > > > >
> > > > > 4:     F     1
> > > > >
> > > > > 5:     H     1
> > > > >
> > > > > 6:     N     1
> > > > >
> > > > > 7:     D     2
> > > > >
> > > > > 8:     E     2
> > > > >
> > > > > 9:     K     2
> > > > >
> > ----------------------------------------------------------------------
> > > > > For information about J forums see
> > http://www.jsoftware.com/forums.htm
> > > > >
> > > >
> > > >
> > > >
> > > > --
> > > > (B=) <-----my sig
> > > > Brian Schott
> > > > ------------------------------------------------------------------
> > > > ---- 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