Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.
The pre-X’mas puzzle in Le Monde weekend edition is about “magical numbers” having as digits all digits between 0 and n (at least once) and being multiple of all digits between 1 and (n+1). Easy, isn’t it?! I thought so while driving down to the Alps on Saturday and (on Monday early morning) I tried a brute force solution
magi=function(n){ prdct=prod(1:(n+1)) for (t in 1:10^6){ num=sum(sample(0:n)*10^(0:n)) if (num==prdct*trunc(num/prdct)){ print(num) break()} } }
which worked for n=2,3, but failed for n=4. Maybe too brute-force? So I imposed the basic divisibility by 2×5=10 from the start, namely the last digit had to be 0:
magi=function(n){ prdct=prod(1:(n+1)) if (n>3){ for (t in 1:10^6){ num=sum(sample(0:n)*10^(0:n)) if (num==prdct*trunc(num/prdct)){ print(num) break()} } }else{ for (t in 1:10^6){ num=10*sum(sample(1:n)*10^(0:(n-1))) if (num==prdct*trunc(num/prdct)){ print(num) break()} } } }
Still did not work for n=4… Actually, there was a mistake in prdct in both of the above, in that the solution number only needs to be divided by the largest powers to the prime numbers between 2 and n+1, as implemented below.
I thought a wee more on the conditions and realised that any random permutation of the digits {1,…,4} could not be divided by 3, since their sum is 10. Therefore, the solution for n=4 must have at least 6 digits. This led me to a more general R function which works for the cases n=4,5,6 and has a second parameter, k, namely the number of digits in the proposed solution. It also includes imposing a correct second digit based on the divisibility by 4:
magi456=function(n,k){ proo=3*4*5*(1+6*(n==6)) #only required divisors digi=10^(0:(k+1)) sol=rep(9,k+2)*digi for (t in 1:10^6){ a0=0 #multiple of 2*5 a1=sample(2*(1:trunc(n/2)),1) #multiple of 4 b=sample((1:n)[-a1]) #all other integers b=sample(c(b,sample(0:n,(k-n+1),rep=TRUE))) a=sum(c(a0,a1,b)*digi) if (a%%proo==0){ sol=a print(a) break() } } return(sol) }
A similar solution can be proposed for the cases n=7,8,9, with a different constraint on the three first digits due to the divisibility by 8. There again is a special case when n=7, since the sum of all integers from 1 to 7 is 28, not divisible by 3. On the other hand, the sum of all integers from 1 to 8 is 36 and the sum of all integers from 1 to 9 is 45, both divisible by 9. Here is the corresponding R code:
magi789=function(n,k){ proo=(1+2*(n==7))*5*7*8*(1+8*(n>7)) #only required divisors digi=10^(0:(k+1)) sol=rep(9,k+2)*digi for (t in 1:10^6){ a0=0 #multiple of 2*5 #multiple of 8 (4, 2) a1=sample(2*(1:trunc(n/2)),1) a2=sample((1:n)[-a1],1) while ((a1+2*a2)%%4!=0){ a1=sample(2*(1:trunc(n/2)),1) a2=sample((1:n)[-a1],1) } b=sample((1:n)[-c(a1,a2)]) #all other integers b=sample(c(b,sample(0:n,(k-n+1),rep=TRUE))) a=sum(c(a0,a1,a2,b)*digi) if (a%%proo==0){ sol=a print(a) break() } } return(sol) }
Le Monde was furthermore asking for the smallest solution for each n. I ran the R code a few thousand times for every n and obtained
> magi456(4,4) 122340 > magi456(5,4) 123540 > magi456(6,5) 1235640 > magi789(7,7) 122437560 > magi789(8,7) 123487560 > magi789(9,8) 1234759680
Of course, these are upper bounds on the smallest solutions (and there are more clever ways of R coding the above as well as of solving the puzzle in a mathematical way). Being away till Tuesday, I will not check the solution till then…
Filed under: Mountains, R, Statistics, University life Tagged: mathematical puzzle
R-bloggers.com offers daily e-mail updates about R news and tutorials about learning R and many other topics. Click here if you're looking to post or find an R/data-science job.
Want to share your content on R-bloggers? click here if you have a blog, or here if you don't.