裏 RjpWiki

Julia ときどき R, Python によるコンピュータプログラム,コンピュータ・サイエンス,統計学

タロット占い

2015年02月02日 | ブログラミング

1 ~ n までの数字が 1 つずつ書かれた n 枚のカードがある。
先頭のカードの数字を見て,その数字の枚数分を先頭から上下逆さに変え,最初の解-度を末尾に移動するということを繰り返す。
操作の途中で,全てのカードが上下逆になるような場合もあるし,カードの状態がループし,全てのカードが上下逆になることはないこともある。
全てのカードが上下逆になるような最初の並び順は何通りあるか。

n = 3 のときは,1,2,3 の並び順の場合は全て上下逆になるが,1,3,2 の場合は,全て上下逆になることはなくループに陥る。


allReverse = function(n) {
  func = function(x) {
    rev = logical(n)
    x0 = x
    repeat {
      rev[1:x[1]] = !rev[1:x[1]]
      x = c(x[2:n], x[1])
      rev = c(rev[2:n], rev[1])
      if (all(rev))
        return(TRUE)
      else if (all(x == x0) && all(rev == FALSE))
        return(FALSE)
    }
  }
  library(e1071)
  a = permutations(n)
  pos = apply(a, 1, func)
  invisible(list(count = nrow(a[pos, ]), pattern = a[pos, ]))
}
allReverse(7)$count

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« エジプト式分数 | トップ | dplyr って,本当に便利なの? »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事