Hatena::ブログ(Diary)

もうカツ丼でいいよな このページをアンテナに追加 RSSフィード Twitter

2009 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 04 | 05 | 06 | 07 | 08 | 09 | 12 |
2012 | 02 | 03 | 04 | 05 | 06 | 10 | 11 | 12 |
2013 | 01 | 02 | 04 | 06 |
2014 | 06 |

2010-05-21

[][] Problem 205 02:46  Problem 205を含むブックマーク  Problem 205のブックマークコメント

答を「0.abcdefgという形で入力せよ」とあったのでabcdefだけを入力すればいいのだと勘違いしてハマってた.馬鹿すぎる.

470ms.

続きを読む

2010-05-19

[][] Problem 145 02:35  Problem 145を含むブックマーク  Problem 145のブックマークコメント

ある正整数nについてこれを反転したものをreverse(n)とする.例えばreverse(123)=321.ここで,n + reverse(n)の各桁が全て奇数であるような数を考える.例えば36は36+63=99で条件を満たす.このような数をreversibleな数と呼ぶ.例えば,36, 63, 409, 904などがreversibleである.ただし,nやreverse(n)に先頭の0は許されない.範囲を1000未満に限ればreversibleな数は120個ある.

10億未満の正整数のうちreversibleな数はいくつか.

紙とペンだけでも解ける.というか主に紙とペンだけで解いたので正直Rとか関係ない.

続きを読む

2010-05-16

[][] Problem 127 22:52  Problem 127を含むブックマーク  Problem 127のブックマークコメント

正整数nの素因数の積をrad(n)とする.また,二つの正整数x, yの最大公約数(greatest common divisor)をGCD(x, y)とする.

ここで,次の条件を満たす3つの正整数(a, b, c)をabc-hitであると呼ぶ.

  1. GCD(a, b) = GCD(b, c) = GCD(a, c) = 1
  2. a < b
  3. a + b = c
  4. rad(abc) < c

c < 120,000について,abc-hitであるときのcの和Σcを求めよ,という問題.

15分くらい.話にならないですね.本当に色々と話にならない.というかもう何週間か考えてて完全に諦めてたので,アルゴリズムはno titleを参考にしました.それで15分ってことはもうRが遅い(or僕の実装がクソ)ということなのでもう何だかアレがアレでアレじゃないですか.

ただ副作用としてProblem 124は2秒程度に短縮できるようになった.エラトステネスの篩に少し手を加えるだけでradのリストが求められるので.

一応解いた問題の数だけならRユーザの中でトップタイになった(Project Euler Language: R).ただProject Eulerのスコアには解いた問題数の他にCurrent Performanceというものがあって,これは最新の問題から25問のうちどれだけを解いたかに基づいてスコアが付く.その関係でまだ1位ではない.というか新しい方の問題は僕の力では歯が立たないものばかり.というかすでにかなり歯が立たなくなってきている.ボチボチ番号順に解くのは止めて正解者の多い順にやってこうか.

続きを読む

2010-05-03

[] Rにおける遅延評価とスコープ 23:26  Rにおける遅延評価とスコープを含むブックマーク  Rにおける遅延評価とスコープのブックマークコメント

去年書いたんだけど,今ふいに遅延評価ってなんだっけとか思って調べたり上の記事を読み直したりしてみたら割と何書いてあるか分からない理解してなかったっぽいのでもう一度まとめ直し.

ただ個人的には納得したものの,内容的には前のと大差ない気がします.

続きを読む

MozkMozk 2010/05/06 20:38 若干違います。
まず、substituteは引数が評価されているかどうかと無関係に、実引数のRの式に置換します。
f <- function(x){ force(x); substitute(x) }
f(1 + 2) #=> 1 + 2
つぎに、
>function(3){...}で作成された環境中で評価済みのiを探す→見つからない
>lapply()で作成された環境中でiを探す→見つかる
こうではなくて、
function(3){...}で作成された環境中でiを探す -> 未評価のiが見つかる
lapply()で作成された環境中で、上の「i」に渡されたRの式を評価する
lapply()で作成された環境はループ変数が副作用によって置き換わっているので10が返る。
が正しいです。

Rion778Rion778 2010/05/06 21:58 >>Mozk
ありがとうございます.今確認しました.早速修正します.

substitute()についてはリゲス本で
「関数 substitute(x) はもとの式をそのまま抽出することができ」
となってはいたのですが,それに続いて
「その後で x は評価されて,」
となっていることと,例示の式が
func.call <- function(x) return(list(substitute(x), x)
だったことから評価前にsubstitute(x)を実行することがポイントなのだと思い込んでしまっていました.確かにxとsubstitute(x)の順番を入れ替えても結果同じでした.ちゃんと色々試して確認しないと駄目だなと反省してます.

>function(3){...}で作成された環境中で評価済みのiを探す→見つからない
「未評価のi」があるのかどうかよく分からなかったので曖昧な書き方をしてしまいましたが,確かにありますね.
> fl <- lapply(1:10, function(i){
+ function(){return(list(ls = ls(envir = environment(fl[[1]])), value = i))
+ }})
> fl[[1]]()
$ls
[1] "i"

$value
[1] 10
これは結局iが評価済みなのかどうかがポイントというより,iがどの環境に拘束(という言い方が適切なのか分かりませんが)されているのかがポイントで,iを評価することで拘束の範囲が変化する,というようなことなのでしょうか.
なんだかまた分からなくなってきました…

MozkMozk 2010/05/07 00:12 lapplyは「.Internal」を使用していて中身がよくわからないので推測ですが、
iを探しにいくとfunction(3){...}の環境で「i = <Promise 1:10[[x]], environment(lapply)>」のようなPromiseが見つかり、「1:10[[x]]」をlapplyの環境で評価するが、ループの添え字「x」が副作用で10になっていて1:10[[10]]が評価されて「i = 10」になるという感じだと思います。
1:10でなくrnorm(10)でも同じ現象が起こることを考えれば、iを探しに行くとfunction(3){...}の環境で必ず変数「i」のプロミスか値にヒットするので、iの変数の範囲はfunction(3){...}位下でしかありません。

lapplyを使わない場合についてはhttp://d.hatena.ne.jp/Mozk/20100420 に追記をしたので見てみてください。