I re-read the solution that you posted and realized where my thinking
was going wrong.  Sorry (again!) for being a thicko.

        cheers,

                Rolf Turner

On 13/01/2010, at 9:19 AM, Greg Snow wrote:

How trivial is probably subjective, I don't think it is much above trivial. I would not have been surprised to see this question on an exam in my undergraduate (300 or junior level) probability course (the hard part was remembering the details from that class from over 20 years ago). My favorite test question of all time came from that course: "You have a deck of poker cards with the 3's removed (and jokers), you deal yourself 5 cards at random, what is the probability of getting a straight (not including straight flushes)?"

This problem is simpler. Just think of the 8 places in the number as urns, and the 17 1's as balls to be put into the urns. One ball has to go in the first urn, so you have 16 left, there are choose(16 +8-1,8-1) ways to distribute 16 undistinguishable balls among 8 distinguishable urns. But that includes some solutions with more than 9 balls in an urn which violates the digits restriction, so subtract off the illegal counts. If we place 10 balls in the first urn, then we have 7 remaining balls to distribute between the 8 urns or choose( 7+8-1, 7), If we place 1 ball in the first urn and 10 balls in one of the 7 other urns (7*), then there are choose( 6 +8-1, 7 ) ways to distribute the remaining 6 balls in the 8 urns. Not too complicated once you remember (or look up) the formula for urns and balls.

--
Gregory (Greg) L. Snow Ph.D.
Statistical Data Center
Intermountain Healthcare
greg.s...@imail.org
801.408.8111


-----Original Message-----
From: baptiste auguie [mailto:baptiste.aug...@googlemail.com]
Sent: Tuesday, January 12, 2010 12:20 PM
To: Greg Snow
Cc: r-help
Subject: Re: [R] expand.grid game

Nice --- am I missing something or was this closed form solution not
entirely trivial to find?

I ought to compile the various clever solutions given in this thread
someday, it's fascinating!

Thanks,

baptiste

2010/1/12 Greg Snow <greg.s...@imail.org>:
This also has a closed form solution:

choose(16+8-1,7) - choose(7+8-1, 7) - 7*choose(6+8-1,7)
[1] 229713


--
Gregory (Greg) L. Snow Ph.D.
Statistical Data Center
Intermountain Healthcare
greg.s...@imail.org
801.408.8111


-----Original Message-----
From: r-help-boun...@r-project.org [mailto:r-help-boun...@r-
project.org] On Behalf Of Brian Diggs
Sent: Thursday, December 31, 2009 3:08 PM
To: baptiste auguie; David Winsemius
Cc: r-help
Subject: Re: [R] expand.grid game

baptiste auguie wrote:
2009/12/19 David Winsemius <dwinsem...@comcast.net>:
On Dec 19, 2009, at 9:06 AM, baptiste auguie wrote:

Dear list,

In a little numbers game, I've hit a performance snag and I'm
not
sure
how to code this in C.

The game is the following: how many 8-digit numbers have the sum
of
their digits equal to 17?
And are you considering the number "00000089" to be in the
acceptable set?
Or is the range of possible numbers in 10000079:98000000 ?


The latter, the first digit should not be 0. But if you have an
interesting solution for the other case, let me know anyway.

I should also stress that this is only for entertainment and
curiosity's sake.

baptiste


I realize I'm late coming to this, but I was reading it in my post-
vacation catch-up and it sounded interesting so I thought I'd give
it a
shot.

After coding a couple of solutions that were exponential in time
(for
the number of digits), I rearranged things and came up with
something
that is linear in time (for the number of digits) and gives the
count
of numbers for all sums at once:

library(plyr)
nsum3 <- function(digits) {
  digits <- as.integer(digits)[[1L]]
  if (digits==1) {
    rep(1,9)
  } else {
    dm1 <- nsum3(digits-1)
    Reduce("+", llply(0:9, function(x) {c(rep(0,x),dm1,rep(0,9-
x))}))
  }
}

nsums <- llply(1:8, nsum3)
nsums[[5]][17]
# [1] 3675
nsums[[8]][17]
# [1] 229713

The whole thing runs in well under a second on my machine (a several
years old dual core Windows machine).  In the results of nsum3, the
i-
th element is the number of "numbers" whose digits sum to i.  The
basic
idea is recursion on the number of digits; if n_{t,d} is the number
of
d-digit "numbers" that sum to t, then n_{t,d} = \sum_{i\in(0,9)}
n_{t-
i,d-1}. (Adding the digit i to each of those "numbers" makes their
sum
t and increases the digits to d).  When digits==1, then 0 isn't a
valid
choice and that also implies the sum of digits can't be 0, which
fits
well with the 1 indexing of arrays.

--
Brian Diggs, Ph.D.
Senior Research Associate, Department of Surgery, Oregon Health &
Science University

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-
guide.html
and provide commented, minimal, self-contained, reproducible code.


______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting- guide.html
and provide commented, minimal, self-contained, reproducible code.


######################################################################
Attention:\ This e-mail message is privileged and confid...{{dropped:9}}

______________________________________________
R-help@r-project.org mailing list
https://stat.ethz.ch/mailman/listinfo/r-help
PLEASE do read the posting guide http://www.R-project.org/posting-guide.html
and provide commented, minimal, self-contained, reproducible code.

Reply via email to