Hatena::ブログ(Diary)

eji著 このページをアンテナに追加 RSSフィード Twitter

2012-08-16 [メモ] Windows7でローカルにタスクをインポートする方法 このエントリーを含むブックマーク このエントリーのブックマークコメント

Windows7タスクインポートしようとした時に「ユーザー資格情報がローカル コンピューターでは使用できません」というエラーが出て、どうにもこうにも進まなかったときに以下のリンクを見つけた。

「/Uと/P」ではなく「/RUと/RP」を使えってことらしい

http://thebackroomtech.com/2009/04/06/windows-2008-schtasks-error-user-credentials-are-not-allowed-on-the-local-machine/

2012-06-29 [山] キナバル山 このエントリーを含むブックマーク このエントリーのブックマークコメント

2012/06/24〜2012/06/27の間マレーシアのキナバル山に行ってきました。30歳になる前に海外の山を登りたいと思っていてまとまった休みが取れたので登りに行きました。

送信者 2012/06/24〜2012/06/28 Mt.Kinabalu

若干高山病の症状が出ました(腕が痺れる等)が、無事の登り切れました。

送信者 2012/06/24〜2012/06/28 Mt.Kinabalu

道はかなり良く整備されていて登るのはとても楽でした。ただ岩場は急なので慎重に進む必要がありました。

送信者 2012/06/24〜2012/06/28 Mt.Kinabalu

ボルネオ島は熱帯なので、虫も結構いるのかと思ったのですが、キナバル登山ではあまり見かけませんでした。

コタ・キナバル

下山後はコタ・キナバルの町中を散歩していました。イスラム教の国なのでトイレにトイレットペーパーがなく水が出るホースと水が入ったバケツだけでした。

送信者 2012/06/24〜2012/06/28 Mt.Kinabalu

今回の旅行では登山の事以外にも色々と学ぶことが多かったのでこれから思い出してメモを残そうとしています。ノートを忘れたのは痛かった。旅行するときは電子機器使えないこともあるから紙のノートとペンは必須だと感じました。

2012/06/24〜2012/06/28 Mt.Kinabalu

2012-06-21 [R] Project Euler 3問目 このエントリーを含むブックマーク このエントリーのブックマークコメント

3問目もRで解いてみた。Rの乱数周りの扱いがまだ良く分からないので、もっと速くてきれいなコードがあると思うのですが、一応問題が解けるので良しとします。

prime_factorize <- function(n) {
  d <- 1
  x <- y <- 2
  while (d == 1) {
    rx <- runif(1, min=2, max=n)
    x <- floor(rx)
    ry <- runif(1, min=2, max=n)
    y <- floor(ry)
    d <- gcd(abs(x-y), n)
  }
  d
}

prime_factor_list <- function(n) {
  prime_factors <- NULL
  repeat {
    pn <- prime_factorize(n)
    prime_factors <- append(prime_factors, pn)
    if (pn == n) break
    n <- n/pn
  }
  prime_factors
}

answer <- function() cat("answer:", max(prime_factor_list(600851475143)), "\n")

もうこの段階でアルゴリズムをちゃんと知らないと解けない問題になってきましたw

素因数分解とか久しぶり

2012-06-20 [R] 引数の評価についての認識間違い このエントリーを含むブックマーク このエントリーのブックマークコメント

前回(id:eji:20120619)の遅延ストリームを使った解答に若干修正を加えました。


stream.end <- function(msg) {
   msg == "eos"
}

stream.make <- function(head, tail) {
  function(msg) {
    if (msg == "eos") F
    else if (msg == "head") {
      head
    } else if (msg == "tail") {
      tail
    }
  }
}

stream.is_end <- function(s) {
  s("eos")
}

stream.head <- function(s) {
   s("head")
}

stream.tail <- function(s) {
   s("tail")
}

stream.take <- function(n, st) {
  if (n <= 0 || stream.is_end(st)) {
    stream.end
  } else {
    stream.make(
      stream.head(st),
      stream.take(n-1, stream.tail(st))
    )
  }
}

stream.take_while <- function(pred, st) {
  head <- stream.head(st)
  if (pred(head)) {
    stream.make(
      head,
      stream.take_while(pred, stream.tail(st))
    )
  } else {
    stream.end
  }
}
stream.fold <- function(fn, init, st) {
  if (stream.is_end(st)) init
  else {
    stream.fold(
      fn,
      fn(init, stream.head(st)),
      stream.tail(st)
    )
  }
}

stream.sum <- function(stream) {
  stream.fold(
    function(a, b) { a + b },
    0,
    stream
  )
}

stream.filter <- function(pred, st) {
  head <- stream.head(st)
  tail <- stream.tail(st)

  if (stream.is_end(st)) st
  else if (pred(head)) {
    stream.make(
      head,
      stream.filter(pred, tail)
    )
  } else {
    stream.filter(pred, tail)
  }
}

stream.fib <- (function() {
  fibgen <- function(a, b) {
    stream.make(
      a,
      fibgen(b, a+b)
    )
  }
  fibgen(1, 2)
})()

even <- function(n) {
  (n %% 2) == 0
}

answer <- stream.sum(
  stream.take_while(
    function(n) { n < 4000000 },
    stream.filter(even, stream.fib)
  )
)

cat("answer:", answer, "\n")

遅延評価のためにクロージャで包んでいたストリームの残りを、クロージャで包まないようにしました。Rでは渡された実引数が必要になった時に初めて評価されるため、わざわざクロージャで包んで評価を遅らせる必要がないようです。

例えば、Schemeのような正格評価の言語の場合、以下のようなコードでは第2引数に渡された値は(順番はどうあれ)評価されてしまいます。

; scheme
> (define (func a b)  a)
func
> (func 3 (display "hoge\n"))
hoge
3
>

しかし、Rの場合は引数の値が全く利用されなければ評価されません。

# R
> func <- function(a, b) a
> func(3, cat("hoge\n"))
3
>

RはHaskellと同じように非正格評価の言語なのかな...?

参考

2012-06-19 [R] Rの勉強 このエントリーを含むブックマーク このエントリーのブックマークコメント

最近Rをちょいとかじり始めたので、練習がてら Project Euler の問題を解いてみた

Problem2

フィボナッチの遅延ストリームを使って問題を解いてみた。Rにマクロのようなものが見当たらなかったので、クロージャで代用した。

stream.end <- function(msg) {
   msg == "eos"
}

stream.make <- function(head, tail) {
  function(msg) {
    if (msg == "eos") F
    else if (msg == "head") head
    else if (msg == "tail") tail()
  }
}

stream.is_end <- function(s) {
  s("eos")
}

stream.head <- function(s) {
   s("head")
}

stream.tail <- function(s) {
   s("tail")
}

stream.take <- function(n, st) {
  if (n <= 0 || stream.is_end(st)) {
    stream.end
  } else {
    stream.make(
      stream.head(st),
      function() { stream.take(n-1, stream.tail(st)) }
    )
  }
}
stream.take_while <- function(pred, st) {
  head <- stream.head(st)
  if (pred(head)) {
    stream.make(
      head,
      function() { stream.take_while(pred, stream.tail(st)) }
    )
  } else {
    stream.end
  }
}

stream.fold <- function(fn, init, st) {
  if (stream.is_end(st)) init
  else {
    stream.fold(
      fn,
      fn(init, stream.head(st)),
      stream.tail(st)
    )
  }
}

stream.sum <- function(stream) {
  stream.fold(
    function(a, b) { a + b },
    0,
    stream
  )
}

stream.filter <- function(pred, st) {
  head <- stream.head(st)
  tail <- stream.tail(st)

  if (stream.is_end(st)) st
  else if (pred(head)) {
    stream.make(
      head,
      function() { stream.filter(pred, tail) }
    )
  } else {
    stream.filter(pred, tail)
  }
}

stream.fib <- (function() {
  fibgen <- function(a, b) {
    stream.make(
      a,
      function() { fibgen(b, a+b) }
    )
  }
  fibgen(1, 2)
})()

even <- function(n) {
  (n %% 2) == 0
}

answer <- stream.sum(
  stream.take_while(
    function(n) { n < 4000000 },
    stream.filter(even, stream.fib)
  )
)