Problem 43

Problem 43 - Project Euler

toNum <- function(n){
  n <- rev(n)
  num <- 0
  for(i in 1:length(n)){
    num <- num + n[i]*10^(i-1)
  }
  return(num)
}
toDigits <- function(n){
  rev(floor(n/(10^(0:floor(log(n, 10)))))%%10)
}
is.connect <- function(a, b){
  a%%100 == floor(b/10)
}
divisors <- c(3,5,7,11,13,17)
candidates <- 2*(ceiling(100/2):floor(1000/2))
for(i in divisors){
  candL <- candidates
  candidates <- numeric(0)
  candR <- numeric(0)
  count <- 0
  candR <- i*(1:floor(1000/i))
  for(j in 1:length(candL)){
    for(k in 1:length(candR)){
      if(is.connect(candL[j], candR[k])){
        count <- count+1
        candidates[count] <- candL[j]*10 + candR[k]%%10
      }
    }
  }
}
ans <- 0
for(i in 1:length(candidates)){
  dig <- toDigits(candidates[i])
  if((length(unique(dig))==9) &&
     length(dig[dig==0])==1){
    ans <- ans + toNum(c(setdiff(0:9, dig),dig))
  }
}

Pandigital数を総当りするとしても300万通り以上ある。
なのでd_a d_b d_cd_b d_c d_dが「接続」できるかどうかを調べて候補を生成した。
でもfor3重だし十数秒かかる…