Problem 68

Problem 68 - Project Euler
ちょっとてこずったけど、

  • 数字が16桁
  • 連結は外側のノードのうち最も値の小さいものからはじめる
  • その条件のもとで数字を最大化する

ということを考えると、外側のノードは(6, 10, 9, 8, 7)だというのがまず候補に上がる。そうすると内側のノードは数字の重複を除かなくたって高々3000通りちょいなので、全部調べてもどうってことない。
で、とりあえず外側固定して内側全部調べたら見つかった感じ。

toDig5 <- function(n){
  rev(floor(n/(5^(0:4))) %% 5)
}
toDig5p1 <- function(n){
  toDig5(n) + 1
}

ans.list <- numeric(0)
for(i in 0:(5^5-1)){
  candi <- toDig5p1(i)
  if(length(unique(candi)) < 5) next
  if(length(unique(c(6 + sum(candi[1:2]),
                     10+ sum(candi[2:3]),
                     9 + sum(candi[3:4]),
                     8 + sum(candi[4:5]),
                     7 + sum(candi[c(5,1)]))))==1){
    ans.list <- cbind(ans.list, candi)
  }
}
ans.list