裏 RjpWiki

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

n日後を返す関数を返す関数

2011年02月17日 | ブログラミング

http://ja.doukaku.org/29/

整数nを渡すと「日時のデータを受け取って、n日後の日時を返す関数」を返す関数を作ってください。関数を返す関数が作れない場合は、関数の代わりになるようなオブジェクトでも構いません。

Pythonの対話的インタプリタで表現すると下のようになります。

>>> def n_days_later(n):
        ?????

>>> five_days_later = n_days_later(5)
>>> datetime.datetime.now()
datetime.datetime(2007, 7, 20, 20, 11, 42, 78000)
>>> five_days_later(_)
datetime.datetime(2007, 7, 25, 20, 11, 42, 78000)

出題の意図としては「関数を返す関数」と「日時の差分の扱い方」を、それぞれ単体だと簡単すぎるので合わせ技にしてみた、というところです。


「2038年問題に注意せよ」と言う注意書きがあるけど

func <- function(s=Sys.Date(), n=0)
{
    substr(as.POSIXct(s)+n*86400, 1, 10)
}

実行例

> func()
[1] "2011-02-17"
> func("2035-01-01", 10000)
[1] "2062-05-19"


コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

与えられた数字のケタ数

2011年02月17日 | ブログラミング
http://ja.doukaku.org/40/

与えられた数字のケタ数と、最大桁の位を求めてください。
数字が2469なら4桁で最大桁は1000の位です。
600なら3と100、1なら1と1です。


言語によっては,簡単すぎる問題もある。

func <- function(n)
{
    k <- length(unlist(strsplit(as.character(n), "")))
    return(c(k, 10^(k-1)))
}

実行例
> func(2469)
[1]    4 1000
> func(600)
[1]   3 100
> func(1)
[1] 1 1

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

bigq クラスの数学関数

2011年02月17日 | ブログラミング

sqrt はまあ実用的

sqrt.bigq <- function(x, eps=1e-50)
{
    x2 <- as.bigq(sqrt(as.double(x)))
    repeat {
        x3 <- (x2+x/x2)/2
        if (abs(x2-x3) < eps) break
        x2 <- x3
    }
    return(x3)
}
# as.double(sqrt.bigq(5000.45789))^2

# sqrt(as.bigq(3.456))

3 乗根

qubic.root <- function(x, eps=1e-50)
{
    x2 <- as.bigq(as.double(x)^(1/3))
    repeat {
        x3 <- (x/(x2*x2)+2*x2)/3
        if (abs(x2-x3) < eps) break
        x2 <- x3
    }
    return(x3)
}
# as.double(qubic.root(123.4566789))^3

exp は取りあえず使えればよいものということで

exp.bigq <- function(x, eps=1e-50, n.term=1000)
{
    ans <- xp <- fac <- as.bigq(1)
    for (i in 1:n.term) {
        xp <- xp*x
        fac <- fac*i
        old <- ans
        ans <- ans+xp/fac
        if (abs(old-ans) < eps) {
            return(ans)
        }
    }
    warnings("収束せず")
    return(ans)
}
# log(as.double(exp.bigq(40.235)))

# exp(as.bigq(1.234))

 

 

コメント
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする

PVアクセスランキング にほんブログ村

PVアクセスランキング にほんブログ村