裏 RjpWiki

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

二次元の数列

2016年03月21日 | ブログラミング

締め切りが 3/21 10:00 AM なので,その 1 分後にアップされるように予約


下図のように数が並んでいます。
「cF」のようにマスを指定するので、それに対応する数(入力が「cF」なら111)を出力するプログラムを書いてください。
マスの位置を示す記号は、アルファベット2文字で、1文字目がa~zの小文字、2文字目がA~Zの大文字です。

 

出題者は,『「メモ化」するプログラムを書くのが普通?』とかいっているけど,漸化式があるので,for の方が簡単で時間も短い。


digits = 18
add = function(a, b, c) {
    abc = a+b+c
    carry = 0
    for (i in seq_along(abc)) {
        t = abc[i]+carry
        abc[i] = t %% 10
        carry = t %/% 10
    }
    abc
}
print.LongInt = function(a) {
    if (all(a == 0)) {
        a = 0
    } else {
        a = rev(a)
        a = paste(rev(cutZero(rev(a[cumsum(a) > 0]))), collapse="")
    }
    cat(a, "\n", sep="")
}

n = 26
x = vector("list", n+1)
for (i in seq_along(x)) {
    x[[i]] = vector("list", n+2)
}
zero = rep(0, digits)
one = zero
one[1] = 1
for (i in 1:(n+1)) for (j in 1:(n+2)) x[[i]][[j]] = zero
x[[1]][[3]] = one
for (i in 2:(n+1)) {
    for (j in 3:(n+2)) {
            x[[i]][[j]] = add(x[[i]][[j-2]], x[[i]][[j-1]], x[[i-1]][[j]])
    }
}
#con = file("stdin", "r")
#line = readLines(con)
line = "zZ" # 188103751620198804
aB = unlist(strsplit(line, ""))
a = which(letters==aB[1])+1
B = which(LETTERS==aB[2])+2
print.LongInt(x[[a]][[B]])

--bignum を使える gawk なら,数列は以下の 8 行で定義できる

add3.awk:

BEGIN{
  x[0, 1] = 1
  for (i = 1; i <= 26; i++) {
    for (j = 1; j <= 26; j++) {
      x[i, j] = x[i, j-2] + x[i, j-1] + x[i-1, j]
    }
  }
}

$ gawk --bignum -f add3.awk

コメント    この記事についてブログを書く
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« 効率のよい荷物配送法 | トップ | 曜日の計算(初級) »
最新の画像もっと見る

コメントを投稿

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