締め切りが 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