Problem 90

0-9までの数字のうち、互いに異なる6つの数字が6面のそれぞれに書かれた立方体がある。
立方体を2つ用意して数字を上手く選べば、100までの全ての平方数{01, 04, 09, 16, 25, 36, 49, 64, 81}を2つの立方体の一面ずつを使って表すことができる。なお、6と9は回転させることで9または6とみなすことができるものとする。
このとき、全ての立方数を表すことができる立方体の数字の組み合わせは何通りあるか、という問題。
ただ問題のフォーラムでも言われているのだが、問題文がなかなか理解しにくい。問題文を正確に理解できるかが鍵となる。「6と9は回転により変換できる」というところは「6と9は区別しない」とも読めてしまう(例がまるで区別していないかのようなのでなおさら)が、そのようには書いてない。6と9は区別するが、でも9や6としても使えるということ。ややこしい。
とはいえ問題の内容さえ分かれば組み合わせも少ないのでそれほど難しくない。というか考えられる解釈のパターン分試してもどうということはない。4秒。

target <- list(c(0,1), c(0,4), c(0,9), c(1,6), c(2,5),
               c(3,6), c(4,9), c(6,4), c(8,1))
dice <- combn(0:9, 6)
patnum <- length(dice[1,])
pSorN <- function(d){
  if(is.element(6, d)||is.element(9, d)){
    unique(c(d, 6, 9))
  }else{d}
}
ans <- 0
for(i in 1:patnum){
  d1 <- pSorN(dice[,i])
  for(j in i:patnum){
    d2 <- pSorN(dice[,j])
    flag <- TRUE
    for(k in 1:9){
      if(!(is.element(target[[k]][1],d1)&&is.element(target[[k]][2],d2)||
           is.element(target[[k]][2],d1)&&is.element(target[[k]][1],d2))){
        flag <- FALSE
        break
      }
    }
    if(flag) ans <- ans + 1
  }
}
ans