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