Problem 51

Problem 51 - Project Euler
最初問題の意味がよくわからなかった.一番大きな桁が0になる(00123とか)のは良いのかダメなのかというようなことが問題のスレッドでも何度か話題になっていたみたいだけど,どうも0になる場合は含めないのが正解らしい.
解けたには解けたけど,ギリ1分超える.なんとかしないと.
@00:00 あきらめた…

toDig <- function(n){
  rev(floor(n/(10^(0:floor(log(n,10)))))%%10)
}
toNum <- function(n){
  sum(n * 10^((length(n)-1):0))
}
  
## library(gmp)
limit <- 10^6
sievebound <- (limit-1)/2
sieve <- logical(sievebound)
crosslimit <- (floor(sqrt(limit))-1)/2
for(i in 1:crosslimit){
  if(!sieve[i]){
    for(j in seq(2*i*(i+1), sievebound, 2*i+1)){
      sieve[j] <- TRUE
    }
  }
}
prime.list <- c(2, 2*(1:sievebound)[!sieve]+1)

f <- function(){
  pn <- 1
  while(prime.list[pn] < 100) pn <- pn +1
  frag <- 0
  while(1){
    dig.l <- floor(log(prime.list[pn],10))
    cand2 <- toDig(prime.list[pn])
    for(i in 1:dig.l){
      dig.c <- combn(dig.l, i)
      for(j in 1:length(dig.c[1,])){
        cand <- cand2
        cand[dig.c[,j]] <- 0
        cand <- rep(toNum(cand), 10)
        cand <- cand + sum(10^(length(cand2)-dig.c[,j]))*(0:9)
        if(cand[1] < toNum(cand2)){
          if(sum(isprime(cand[2:10])) >= 2*8) return(cand)
        }else if(sum(isprime(cand)) >= 2*8){
          return(cand)
        }
      }
      if(frag) break
    }
    if(frag)break
    pn <- pn+1
  }
}