R でエンタメ
の編集
http://www.okadajp.org/RWiki/?R+%E3%81%A7%E3%82%A8%E3%83%B3%E3%82%BF%E3%83%A1
[
トップ
] [
編集
|
差分
|
バックアップ
|
添付
|
リロード
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
]
-- 雛形とするページ --
(no template pages)
#contents ---- *数独 [#m8b4a83f] -[[Rで数独:http://www.okada.jp.org/RWiki/?R%20%A4%C7%BF%F4%C6%C8]] *カードゲーム [#qe9f5159] -gamesNws: Playing games using a NWS Server -[[A pure R poker hand evaluator:http://www.r-bloggers.com/a-pure-r-poker-hand-evaluator/]] -[[Playing cards, with R:http://freakonometrics.hypotheses.org/6491]] -[[Playing cards in Vegas?:http://freakonometrics.hypotheses.org/6520]] -[[Simulation of Blackjack: the odds are not with you:http://www.econometricsbysimulation.com/2013/07/simulation-of-blackjack-odds-are-not.html]] *迷路作成 [#u2222b8c] 迷路を抜けろ! maze <- function(xsize=150, ysize=150, color="black") # 河童の屁 { old <- par(mar=c(1,1,1,1)) xsize3 <- xsize+3 ysize3 <- ysize+3 plot(c(2, xsize3), c(2, ysize3), type="n", axes=FALSE, xlab="", ylab="", asp=1) p <- matrix(FALSE, ysize+4, xsize+4) p[3:(ysize+2), 3:(xsize+2)] <- TRUE segments(c(2, 2, 3, xsize3), c(2, ysize3, 2, 2), c(2, xsize3-1, xsize3, xsize3), c(ysize3, ysize3, 2, ysize3), col=color) n <- xsize*ysize n0 <- n%/%20 istart <- 2 check.all <- TRUE repeat { if(n > n0) { repeat { i1 <- sample(2:ysize3, 1) j1 <- sample(2:xsize3, 1) if (p[i1, j1] == FALSE && (i1 != 2 || j1 != 2) && (i1 != ysize3 || j1 != xsize3)) { break } } } else { found <- FALSE for (i1 in istart:ysize3) { for (j1 in 2:xsize3) { if (p[i1+1, j1] || p[i1, j1+1]) { found <- TRUE break } } if(found) { istart <- i1 break } } check.all <- FALSE } repeat { ix <- iy <- integer(3) m <- 0 if (p[i1+1, j1]) { m <- m+1 ix[m] <- 1 } if (p[i1, j1+1]) { m <- m+1 iy[m] <- 1 } if (check.all) { if (p[i1-1, j1]) { m <- m+1 ix[m] <- -1 } if (p[i1, j1-1]) { m <- m+1 iy[m] <- -1 } } if (m == 0) { break } else if (m >= 2) { m <- sample(m, 1) } i2 <- i1+ix[m] j2 <- j1+iy[m] segments(j1, i1, j2, i2, col=color) p[i2, j2] <- FALSE i1 <- i2 j1 <- j2 n <- n-1 } if(n == 0) { break } } par(old) } &ref(maze.png); * N Queen [#o12b9014] N x N チェスボードに,N 個のクイーンを平和共存させよ! N.Queen <- function(N=8) # 河童の屁 { Solve <- function(i) { if (i > N) { Counter <<- Counter+1 cat(sprintf("\nNo. %i\n", Counter)) Board <- matrix(".", N, N) Board[cbind(1:N, Row)] <- "Q" colnames(Board) <- letters[1:N] rownames(Board) <- N:1 print(Board, quote=FALSE) return } for (j in 1:N) { if (Col[j] == TRUE && RightUp.LeftDown[i+j-1] == TRUE && RightDown.LeftUp[i-j+N] == TRUE ) { Row[i] <<- j Col[j] <<- RightUp.LeftDown[i+j-1] <<- RightDown.LeftUp[i-j+N] <<- FALSE Solve(i+1) Row[i] <<- Col[j] <<- RightUp.LeftDown[i+j-1] <<- RightDown.LeftUp[i-j+N] <<- TRUE } } } Row <- integer(N) Col <- rep(TRUE, N) RightUp.LeftDown <- RightDown.LeftUp <- rep(TRUE, 2*N-1) Counter <- 0 Solve(1) } N.Queen(12) の解の最後のもの No. 14200 a b c d e f g h i j k l 12 . . . . . . . . . . . Q 11 . . . . . . . . . Q . . 10 . . . . . . . Q . . . . 9 . . . . Q . . . . . . . 8 . . Q . . . . . . . . . 7 Q . . . . . . . . . . . 6 . . . . . . Q . . . . . 5 . Q . . . . . . . . . . 4 . . . . . . . . . . Q . 3 . . . . . Q . . . . . . 2 . . . Q . . . . . . . . 1 . . . . . . . . Q . . . *ハノイの塔 [#x36d1122] n 枚の板を a から b へ,作業場所として c を使って移せ! Hanoi <- function(n=15) # 河童の屁 { move <- function(a, b, c, n) { if (n) { move(a, c, b, n-1) animation(a, b) move(c, b, a, n-1) } } animation <- function(a, b) { # cat("from", a, "to", b, "\n") for (i in 1:n) { if (hanoi[i, a] != 0) { disc <- hanoi[i, a] hanoi[i, a] <<- 0 draw.disc(a, i, disc, FALSE) break } } for (i in n:1) { if (hanoi[i, b] == 0) { hanoi[i, b] <<- disc draw.disc(b, i, disc, TRUE) break } } } draw.disc <- function(a, i, disc, flag) { x <- n+2*n*(a-1) y <- n+1-i rect(x-disc, y-0.45, x+disc, y+0.45, col=if (flag) "blue" else "white", border="white") } hanoi <- cbind(1:n, rep(0, n), rep(0, n)) old <- par(mar=c(1,1,1,1)) plot(c(0, 6*n), c(0, n+1), type="n", xaxt="n", yaxt="n", xlab="", ylab="", bty="n") text(c(n, 3*n, 5*n), -0.5, letters[1:3], xpd=TRUE) for (i in 1:n) { draw.disc(1, i, i, TRUE) } move(1, 2, 3, n) par(old) } Hanoi() 作業の途中~ &ref(hanoi.png); * R の唄 [#le33cfd7] -[[The Most Romantic Electro-Grunge Statistical Computing Song Ever Made:http://www.r-bloggers.com/the-most-romantic-electro-grunge-statistical-computing-song-ever-made/]] *RLastFM (R interface to last.fm API) [#o46bbff6] -[[RLastFM (R interface to last.fm API):http://cran.r-project.org/web/packages/RLastFM/index.html]] *[[Rでスポーツ統計]] [#rcff260b] *バットマン方程式- バットサインの数式による描画 [#e611802f] **[[the batman equation:http://www.r-bloggers.com/the-batman-equation/]] ggplot2 利用 [#z994f59c] **plot 関数で [#t29ebf63] ggplot2 版の 40 倍の速度 by 河童の屁は,河童にあらず,屁である。 plot(0, 0, xlim=c(-7, 7), ylim=c(-3, 3), type="n", bty="n", axes=FALSE, xlab="", ylab="", asp=1) x11 <- seq(3, 7, 0.001) x12 <- seq(7, 4, -0.001) y1 <- c(3*sqrt(1-(x11/7)^2), -3*sqrt(1-(x12/7)^2)) x2 <- seq(4, 0, -0.001) y2 <- x2/2-(3*sqrt(33)-7)*x2^2/112-3 + sqrt(1-(abs(x2-2)-1)^2) x345 <- c(1, 0.75, 0.5, -0.5, -0.75, -1, 1) y345 <- c(1, 3, 2.25, 2.25, 3, 1, 1) x6 <- seq(1, 3, 0.001) y6 <- 1.5-0.5*x6+6*sqrt(10)*(1/7-sqrt(4-(x6-1)^2)/14) lines(c(x345, x6, x11, x12, x2, NA, -x2, NA, -x11, -x12, NA, -x6), c(y345, y6, y1, y2, NA, y2, NA, y1, NA, y6)) &ref(batman.png);~ やはり,塗りつぶされていないとね。~ &ref(batman2.png); *Le Mond の数学パズルをRで解く [#d111f8cb] -[[Le Monde puzzle [1]:http://www.r-bloggers.com/le-monde-puzzle-1/]] *エレガントな解を探しましょう [#l1ebc16a] **規則に従う要素を持つ正方行列(出題:河童の屁は,河童にあらず,屁である。) [#gbf106bb] n = 2 のとき 1 2 4 3 n = 3 のとき 1 2 3 8 9 4 7 6 5 n = 4 のとき 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 のように,時計回りの渦のように 1:(n^2) を配置する配列を返す関数 a <- function(n) { } の中身を書く。~ どんなライブラリ,関数を使っても良い。~ 空白類(空白,タブ,改行)を除く文字数が最小のものを最良のプログラムとする。~ ~ まあ,面白くもないということのようですが,例解?。174 文字。2011/09/10 a <- function(n) { x <- diag(n) for (i in 1:((n+1)%/%2)) { s <- n+1-2*i if (s == 0) { x[i, i] <- n^2 break } j <- rep(i, s) k <- c(i:(i+s-1), j+s, i+s:1) x[cbind(c(j, k), c(k, j))] <- n^2-(s+1)^2+1:(4*s) } return(x) } ~ これはどうでしょう? 143 文字。2011/10/26 b <- function(n) { A <- function(m){ x <- ncol(m) y <- 2*x+1 rbind(1:(x+1), cbind(m[x:1,x:1] + y, (x+2):y)) } B <- function(m){ if(ncol(m) < n) B(A(m)) else m } B(diag(1)) } これは156文字だけど、もう少し短くできるかな? b <- function(n) { A <- function(m){ x <- ncol(m) y <- 2*x+1 rbind(1:(x+1), cbind(m[x:1,x:1] + y, (x+2):y)) } eval( parse(text = paste(rep(c('A(','diag(1)',')'),c(n-1,1,n-1) )))) } あるいはシンプルに for loop で・・・ 136文字。 b <- function(n) { A <- function(m){ x <- ncol(m) y <- 2*x+1 rbind(1:(x+1), cbind(m[x:1,x:1] + y, (x+2):y)) } out <- diag(1) if(n>1) for(i in 2:n) out <- A(out) out } 文字数最小なのだから,変数名も1文字にすれば,この解は 128 文字解ですね。 ははは。うっかりしていました。アウトですね。 <- を = にするというのはなんとなく自分で許せませんでした。 ** [[お題:文字列を先頭から見て同じところまで除去:http://d.hatena.ne.jp/fumokmm/20110812/1313138407]] [#b4d92297] func <- function(s) # 河童の屁 { x <- lapply(s, function(x) unlist(strsplit(x, ""))) y <- sapply(x, "[", 1:min(sapply(x, length))) z <- sum(cumsum(apply(y, 1, function(y) length(unique(y)) != 1)) == 0) sapply(s, function(x) sub(sprintf(".{%i}", z), "", x)) } 実行結果 > func(c("abc123", "abcdefg", "abrt")) abc123 abcdefg abrt "c123" "cdefg" "rt" > func(c("abc123", "abcdefg", "wabrt")) abc123 abcdefg wabrt "abc123" "abcdefg" "wabrt" > func(c("かみさま", "かみゆい", "かみさん", "かみかぜ")) かみさま かみゆい かみさん かみかぜ "さま" "ゆい" "さん" "かぜ" > func(c("かみさま", "かみゆい", "かみさん", "abc")) かみさま かみゆい かみさん abc "かみさま" "かみゆい" "かみさん" "abc" ** [[お題:アラビア数字・ローマ数字変換:http://d.hatena.ne.jp/fumokmm/20110822/1314013182]] [#z8708644] R には as.roman があるけど,変換例に挙げられているのをやってみると as.roman(3999) は NA になる。これじゃまずいなあ。また,逆変換はない。&br;誰かやってみる?)&br;[[プロジェクトオイラー:http://projecteuler.net/]]の[[問題89:http://projecteuler.net/problem=89]]も参照。 -まあ,余りエレガントでもないけど。 encode <- function(r) # ローマ数字へ { str <- NULL s <- as.integer(rev(c(rep("0", 3), unlist(strsplit(as.character(r), ""))))[1:4]) s4 <- s[4] s3 <- s[3] s2 <- s[2] s1 <- s[1] if (s4 > 0) str <- c(str, rep("M", s4)) if (s3 == 9) str <- c(str, "C", "M") else if (s3 > 5) str <- c(str, "D", rep("C", s3-5)) else if (s3 == 5) str <- c(str, "D") else if (s3 == 4) str <- c(str, "C", "D") else if (s3 > 0) str <- c(str, rep("C", s3)) if (s2 == 9) str <- c(str, "X", "C") else if (s2 > 5) str <- c(str, "L", rep("X", s2-5)) else if (s2 == 5) str <- c(str, "L") else if (s2 == 4) str <- c(str, "X", "L") else if (s2 > 0) str <- c(str, rep("X", s2)) if (s1 == 9) str <- c(str, "I", "X") else if (s1 > 5) str <- c(str, "V", rep("I", s1-5)) else if (s1 == 5) str <- c(str, "V") else if (s1 == 4) str <- c(str, "I", "V") else if (s1 > 0) str <- c(str, rep("I", s1)) return(paste(str, collapse="")) } decode <- function(r) # ローマ数字から { v <- 0 str <- unlist(strsplit(r, "")) repeat { n <- length(str) if (n == 0) break s <- str[1] if (grepl(s, "IXC") && n >= 2) { s2 <- str[2] if (s == "I" && s2 == "V") { v <- v+4 str <- str[-(1:2)] next } else if (s == "I" && s2 == "X") { v <- v+9 str <- str[-(1:2)] next } else if (s == "X" && s2 == "L") { v <- v+40 str <- str[-(1:2)] next } else if (s == "X" && s2 == "C") { v <- v+90 str <- str[-(1:2)] next } else if (s == "C" && s2 == "D") { v <- v+400 str <- str[-(1:2)] next } else if (s == "C" && s2 == "M") { v <- v+900 str <- str[-(1:2)] next } } if (s == "I") { v <- v+1 } else if (s == "V") { v <- v+5 } else if (s == "X") { v <- v+10 } else if (s == "L") { v <- v+50 } else if (s == "C") { v <- v+100 } else if (s == "D") { v <- v+500 } else if (s == "M") { v <- v+1000 } str <- str[-1] } return(v) } 実行例 > as.roman(3999) [1] <NA> > encode(3999) [1] "MMMCMXCIX" > decode("MMMCMXCIX") [1] 3999 * [[錯視のカタログ:http://www.psy.ritsumei.ac.jp/~akitaoka/catalog.html]] [#rb84a4c2] [[北岡明佳の錯視のページ:http://www.ritsumei.ac.jp/~akitaoka/]] 色々な例を見ているだけで面白い&br;Rで作図してみる例題としては,高度のテクニックが必要のものもあるようだ(何で作図しているのだろうかなあ,Rではなさそう(笑)&br; -↑ これはRと何の関係が...。誰かコード書いてってこと? -関係ないと思う人はそう思えばよい。&br;プログラムを書くのがエンターテインメントの人もいるんじゃないかなと思うけど。&br;Rで描いたらどうなるかという,練習問題としてとらえれば良いでしょう。ここは「エンタメ」なんだから,いろいろなエンタメがあって良いと思うけど?&br;「R を使ってなんとかかんとか」というのがありなら,「何とかかんとかを R で描く(書く)」というのがあって何の不都合があるんでしょうか?頼まれてもかけない人は黙っていればよい。 -ちょっと書いてみました。 factor <- 0.04 n <- 20 t1 <- seq(0, 2*pi, length=13) t3 <- seq(0, 2*pi, length=801)[1:n] #plot(l2*cos(t2), l2*sin(t2)) color <- c("black", "white") color2 <- c("#cfc947", "#4e79f5") color2 <- c("aquamarine4", "green1") color2 <- c("aquamarine4", "gold2") parts <- function(x0, y0, i) { l <- 0.8^(i-1) j <- i%%2+1 l4 <- rep(l, n) l4 <- c(l4, l4-l*0.8) for (t in seq(0, 2*pi, length=41)[-1]) { t4 <- t+c(t3, rev(t3)) polygon(l4*cos(t4)+x0, l4*sin(t4)+y0, border=color[j], col=color[j]) j <- 3-j } t2 <- atan(l*factor*sin(t1)/(0.8*l+0.1*l*cos(t1))) l2 <- sqrt((0.9*l+0.1*l*cos(t1))^2+(factor*sin(t1))^2) for (t in seq(0, 2*pi, length=41)[-1]) { polygon(l2*cos(t+t2)+x0, l2*sin(t+t2)+y0, border=color2[j], col=color2[j]) j <- 3-j } } old <- par(mar=rep(0, 4)) plot(0, 0, type="n", xlim=c(0, 8), ylim=c(0, 6), asp=1, axes=FALSE, xlab="", ylab="") draw <- function(x0, y0) { for (i in 1:15) { parts(x0, y0, i) } } for (x0 in 1:4*2-1) for (y0 in 1:3*2-1) draw(x0, y0) for (x0 in 1:3*2) for (y0 in 1:2*2) draw(x0, y0) text(5, -0.4, "「蛇の回転」Copyright Akiyoshi Kitaoka 2003 (September 2, 2003)", pos=3, xpd=TRUE) par(old) *ハロウィン [#s75f90e1] -[[R でハロウィンカード:http://evol-eco.blogspot.com/2011/10/halloween-card.html]] [#ye3ef3e8] *チェス [#i8659a07] -[[First attempt at Chess Data Mining:http://www.r-bloggers.com/first-attempt-at-chess-data-mining/]] *ロゴ作成 [#o865c787] -[[Using R to create a logo: Simple :http://www.r-bloggers.com/using-r-to-create-a-logo-simple/]] *くじ引き [#gf0ef71e] -[[New Powerball (lottery) Rules Will Cost You More:http://www.r-bloggers.com/new-powerball-lottery-rules-will-cost-you-more/]] -[[宝くじがどのくらい当たるか実感してみよう:http://wofwof.blog60.fc2.com/blog-entry-630.html]] *Pasta Geometrics [#a18d08b6] -[[Pasta Geometrics:http://www.nytimes.com/interactive/2012/01/10/science/20120110_pasta.html]] こんなのでよいのかなあ? 河童の屁は,河童にあらず,屁である。~ Agnolotti PI <- THETA <- KAPPA <- matrix(0, 61, 101) for (i in 0:60) { for (j in 0:100) { PI[i, j] <- (10 * sin(i * pi / 120) ^ 0.5 + i / 400 * sin(3 * j * pi / 10)) * cos(19 * j * pi / 2000 + 0.03 * pi) THETA[i, j] <- (10 * sin(i * pi / 120) + i / 400 * cos(3 * j * pi / 10)) * sin(19 * j * pi / 2000 + 0.03 * pi) KAPPA[i, j] <- 5 * cos(i * pi / 120) ^ 5 * sin(j * pi / 100) - 5 * sin(j * pi / 100) * cos(i * pi / 120) ^ 200 } } library(rgl) plot3d(c(PI), c(THETA), c(KAPPA), aspect = c(1, 1, 0.25)) &ref(Agnolotti.png); plot3d は隠れた部分の消去機能がないので,見た目が悪い。自分で回転させれば形がよくわかる。~ Fagottini PI <- THETA <- KAPPA <- matrix(0, 201, 51) for (i in 0:200) { for (j in 0:50) { alpha <- (0.8 + sin(i * pi / 100) ^ 8 - 0.8 * cos(i * pi / 25)) ^ 1.5 + 0.2 + 0.2 * sin(i * pi / 100) beta <- (0.9 + cos(i * pi / 100) ^ 8 - 0.9 * cos((4 * i + 3) * pi / 100)) ^ 1.5 + 0.3 * cos(i * pi / 100) gamma <- 4 - 4 * j / 500 * (1 + cos(i * pi / 100) ^ 8 - 0.8 * cos(i * pi / 25)) ^ 1.5 PI[i, j] <- cos(i * pi / 100) * (alpha * sin(j * pi / 100) ^ 8 + 0.6 * (2 + sin(i * pi / 100) ^ 2) * sin(j * pi / 50) ^ 2) THETA[i, j] <- sin(i * pi / 100) * (beta * sin(j * pi / 100) ^ 8 + 0.6 * (2 + cos(i * pi / 100) ^ 2) * sin(j * pi / 50) ^ 2) KAPPA[i, j] <- (1 + sin((j - 50) * pi / 100)) * (gamma - 4 * j / 500 * (1 + sin(i * pi / 100) ^ 8 - 0.8 * cos(i * pi / 25)) ^ 1.5) } } library(rgl) plot3d(c(PI), c(THETA), c(KAPPA), aspect = c(1, 1, 0.5)) &ref(Fagottini.png); *CX's 'reality distortion' pie-graph (フジTV のステマ円グラフ) [#nf026bb6] http://blog.livedoor.jp/dqnplus/archives/1692812.html これは、ひどい。 が、遊びで描いてみた。 library(grid) png(filename = "~/Desktop/fuji-pie.png", width = 360, height = 360, units = "px") num <- c(94, 97, 78, 78) distortion <- c(1, 1.2, 1, 1) dist_num <- num * distortion cum <- c(0, cumsum(dist_num)) rad <- cum/sum(dist_num) * 360/180 * pi colors <- c("#0000FFAA", "#FF0000AA", "#000055AA", "#0000AAAA") labels <- paste(c("50ies\n", "10~20ies\n", "30ies\n", "40ies\n"), num, " ps", sep = "") lab_cex <- c(1, 1.5, 1, 1) lab_col <- c("white", "yellow", "white", "white") div <- 200 # 円弧部分の分割数 dx <- 0 # 半径=0.5 として、x 方向への中心のズレ dy <- 0.1 # 半径=0.5 として、y 方向への中心のズレ for (i in 1:length(num)) { x <- c(0.5 + dx, 0.5 + 0.5 * sin(rad[i]), 0.5 + 0.5 * sin(seq(rad[i], rad[i + 1], length.out = div)), 0.5 + 0.5 * sin(rad[i + 1])) y <- c(0.5 + dy, 0.5 + 0.5 * cos(rad[i]), 0.5 + 0.5 * cos(seq(rad[i], rad[i + 1], length.out = div)), 0.5 + 0.5 * cos(rad[i + 1])) grid.polygon(x = x, y = y, gp = gpar(fill = colors[i])) grid.text(x = 0.5 + 0.4 * sin((rad[i] + rad[i + 1])/2), y = 0.5 + 0.4 * cos((rad[i] + rad[i + 1])/2), label = labels[i], gp = gpar(col = lab_col[i], cex = lab_cex[i])) } dev.off() #ref(fuji-pie.png) 古典的グラフィックでも。 fuji.pie <- function(x, center, labels, colors, text.colors, text.cex) { if (missing(center)) center <- c(0, 0.3) i <- (1:360)/360 * 2 * pi arc <- cut(1:360, c(0, round(cumsum(x) * 360/sum(x)), Inf)) plot.new() plot.window(xlim = c(-1, 1), ylim = c(-1, 1), "", asp = 1) l <- levels(arc) for (j in 1:length(x)) { k <- c(i[arc == l[j]], max(i[arc == l[j]]) + 1/360 * 2 * pi) polygon(c(center[1], cos(k)), c(center[2], sin(k)), col = colors[j]) text(mean(cos(k))/1.5, mean(sin(k))/1.5, labels[j], cex = text.cex[j], col = text.colors[j]) } } fuji.pie(c(94, 78, 78, 97), labels = c("50代\n94人", "40代\n78人", "30代\n78人", "10〜20代\n97人"), colors = c("deepskyblue", "dodgerblue1", "dodgerblue3", "brown1"), text.colors = c("white", "white", "white", "yellow"), text.cex = c(1.5, 1.5, 1.5, 3)) #ref(20120131a.png); ->>fuji.pie() お見事、完敗です。でも、この関数を誰かが使うのか?? (笑) エンタメだからいいですよね。 *Music [#h602b67b] -[[Music player in R (Linux):http://www.r-bloggers.com/music-player-in-r-linux/]] [#v642664e] -[[Programming instrumental music from scratch:http://vikparuchuri.com/blog/making-instrumental-music-from-scratch/]] [#wd100e3a] *ウォーリーを探せ [#x362ffe5] -[raster パッケージによるもの:http://stackoverflow.com/questions/8563604/how-to-find-waldo-with-r]] -[[Rでウォーリーを探してみた:http://www.slideshare.net/wdkz/2012-ssp-susermtgwdkzpublished]] -[[Where's Waldo? Image Analysis in R:http://blog.revolutionanalytics.com/2012/05/wheres-waldo-image-analysis-in-r.html]] *Hangman [#o2ea46b4] -[[Hangman in R: A learning experience:http://trinkerrstuff.wordpress.com/2012/07/29/hangman-in-r-a-learning-experience/]] *Minesweeper [#i0b18a04] -[[Minesweeper:http://www.talkstats.com/showthread.php/17845-Minesweeper?p=54524&viewfull=1#post54524]] *カッシーニの卵形線 [#u4521a20] -[[Animation basics for a vacation:http://rsnippets.blogspot.jp/2012/08/animation-basics-for-vacation.html]] *スピログラフ [#adc52baa] -[[Spirograph with R:http://menugget.blogspot.jp/2012/12/spirograph-with-r.html]] -[[スピログラフ:http://blog.goo.ne.jp/r-de-r/e/672225e329b3003b0f259289a320f298]] *[[Solving 9-puzzle with GNU R:http://rsnippets.blogspot.jp/2013/01/solving-9-puzzle-with-gnu-r.html]] [#ofc9ecb1] * 星空 [#y909071f] pchでいつの間にか全角文字が使えるようになっていたのを知ったので、お昼休みに「★」で星空を作成してみた -- [[谷村]] 2013-02-22 (金) 12:48:52 - 星の位置は、CSR (完全空間ランダム)による分布 - 星の大きさは対数正規分布 - 星の色は[[ここ:http://www15.ocn.ne.jp/~kagaku/ocn/tsu_wkk/star/star_color/star_color.htm]]を参照。でも、結果的に適当 :-p - filled.contour()は、keyを内部でハードコーディングしているので、オプションでkeyを取り除けず、仕方がないのでpngパッケージで切り落とした library(splancs) library(png) f <- paste0(tempfile(), ".png") png(file = f) op <- par(bg = "#000022", mai = c(0, 0, 0, 0)) filled.contour(volcano, nlevels = 100, color.palette = colorRampPalette(c("#000000", "#007BC3"), space = "Lab", bias = .5)) n <- 1000 p <- matrix(c(0, 0, 1, 0, 1, 1, 0, 1, 0, 0), ncol = 2, byrow = TRUE) cols <- c(rep("#FFFFFF", 10), "#FAFAFA", "#FFEF85", "#FFB74C") points(csr(p, n), pch = "★", col = cols, cex = rlnorm(n, 0, .5) * .2) par(op) dev.off() p <- readPNG(f) unlink(f) p1 <- p[, -(440:480), ] writePNG(p1, "20130222.png") &ref(20130222.png); *[[Happy St Patrick’s Day:http://freakonometrics.hypotheses.org/5011]] [#e4340810] * [[Rでスネークゲーム:http://rpubs.com/mokjpn/rsnake]] [#k4714d46] * Rで切符問題 [#c8773fb4] rv.kippu<-function(num){ exp <- NULL stackpointer <- 0 stack <- list() perm<-function(v){ temp<-NULL if(length(v) == 1){ v[1] }else{ for(i in 1:length(v)){ temp <- rbind(temp,cbind(v[i],Recall(v[-i]))) } temp } } push <- function(d){ stack[[stackpointer + 1]] <<- d stackpointer <<- (stackpointer + 1) } pop <- function(){ if(stackpointer == 0){ NULL }else{ value <- stack[[stackpointer]] stack[[stackpointer]] <<- NULL stackpointer <<- (stackpointer - 1) value } } rpn2normal<-function(v){ len<-length(v) for(i in 1:len){ if(any(grep("^[-+*/]",v[i])) ){ n2<-pop() n1<-pop() exp<-paste("(",n1,v[i],n2,")",sep="") push(exp) }else{ if(any(grep("[0-9]",v[i]))) { push(v[i]) } } } invisible(exp) } if(num >= 0 && num <= 9999){ n1 <- as.character(n1 <- num %/% 1000) n2 <- as.character(n2 <- num %% 1000 %/% 100) n3 <- as.character(n3 <- num %% 100 %/% 10) n4 <- as.character(n4 <- num %% 10) t<-perm(c(n1,n2,n3,n4)) op <- c("+","-","*","/") exps<-NULL # num num opr num num opr opr for(i in c(1:24)){ nums<-t[i,] tmp<-NULL for(i1 in op){ for(i2 in op){ for(i3 in op){ tmp<-c(nums[1],nums[2],i1,nums[3],nums[4],i2,i3) exps<-c(exps,tmp) } } } } # num num opr num opr num opr for(i in c(1:24)){ nums<-t[i,] tmp<-NULL for(i1 in op){ for(i2 in op){ for(i3 in op){ tmp<-c(nums[1],nums[2],i1,nums[3],i2,nums[4],i3) exps<-c(exps,tmp) } } } } # num num num opr num opr opr for(i in c(1:24)){ nums<-t[i,] tmp<-NULL for(i1 in op){ for(i2 in op){ for(i3 in op){ tmp<-c(nums[1],nums[2],nums[3],i1,nums[4],i2,i3) exps<-c(exps,tmp) } } } } # num num num opr num opr opr for(i in c(1:24)){ nums<-t[i,] tmp<-NULL for(i1 in op){ for(i2 in op){ for(i3 in op){ tmp<-c(nums[1],nums[2],nums[3],i1,nums[4],i2,i3) exps<-c(exps,tmp) } } } } # num num opr num num opr opr for(i in c(1:24)){ nums<-t[i,] tmp<-NULL for(i1 in op){ for(i2 in op){ for(i3 in op){ tmp<-c(nums[1],nums[2],i1,nums[3],nums[4],i2,i3) exps<-c(exps,tmp) } } } } tmp <- apply(matrix(exps,byrow=T,ncol=7),1,rpn2normal) ret <- NULL for(i in tmp){ #print(class(i)) ans <- eval(parse(text=i)) if(is.finite(ans) &&(ans == 10)){ s <- paste(i,"=",ans) #print(s) ret <- c(ret,s) } } ret <- matrix(ret,ncol=1) return(unique(ret)) }else{ print("please input 4 digits' number" ) }}# by Mamekkoro - if(any(grep("^[-\+\*/]",v[i])) ){ は if(any(grep("^[-+*/]",v[i])) ){ でなきゃ,エラーになる。&br;1111 など,不可能な場合に,「以下にエラー matrix(ret, ncol = 1) : 'data' はベクトル型でなくてはなりませんが、'NULL' でした 」エラーを吐くのはみっともない。 - 了解しました by mamekkoro - 定型的な処理を繰り返すのに for を多用するのも善し悪し。少なくとも,i1, i2, i3 の op は,3 重の for ループに共通する 4^3 × 3 の matrix で表すことができる。&br;計算時間はたいして違わないが,視認性には大きな違いがある。&br;2.5倍くらい速くなった。&br;簡潔にしたら,いろいろ不要な部分や間違い?も発見できた。目を通す部分は少ないに越したことはない。 rv.kippu2 <- function(num) { perm <- function(v) { temp <- NULL if (length(v) == 1) { v[1] } else { for (i in 1:length(v)) { temp <- rbind(temp, cbind(v[i], Recall(v[-i]))) } temp } } rpn2normal <- function(v) { stackpointer <- 0 stack <- character(10) for (i in seq_along(v)) { if (grepl("[-+*/]", v[i])) { n2 <- stack[stackpointer] stackpointer <- stackpointer - 1 n1 <- stack[stackpointer] exp <- paste("(", n1, v[i], n2, ")", sep = "") stack[stackpointer] <- exp } else if (grepl("[0-9]", v[i])) { stackpointer <- stackpointer + 1 stack[stackpointer] <- v[i] } } invisible(exp) } if (num < 1000 || num > 9999) stop("please input 4 digits' number") temp <- unlist(strsplit(as.character(num), "")) temp <- perm(temp) nummat <- apply(temp, 2, rep, each = 64) op <- c("+", "-", "*", "/") opmat <- sapply(expand.grid(op, op, op), as.character) opmat <- apply(opmat, 2, rep, 24) exps5 <- cbind(nummat, opmat) # num num num num opr opr opr exps1 <- exps5[, c(1:2, 5, 3:4, 6:7)] # num num opr num num opr opr exps2 <- exps5[, c(1:2, 5, 3, 6, 4, 7)] # num num opr num opr num opr exps3 <- exps5[, c(1:3, 5:6, 4, 7)] # num num num opr opr num opr exps4 <- exps5[, c(1:3, 5, 4, 6:7)] # num num num opr num opr opr exps <- rbind(exps1, exps2, exps3, exps4, exps5) ans <- apply(exps, 1, rpn2normal) ans <- sapply(ans, function(e) eval(parse(text = e))) ans <- ans[ans == 10] return(unique(names(ans))) } # by Mamekkoro. modified by Kappa-no-He さらに 1.8 倍ほど速くなった。 rv.kippu3 <- function(num) { perm <- function(v) { temp <- NULL if (length(v) == 1) { v[1] } else { for (i in 1:length(v)) { temp <- rbind(temp, cbind(v[i], Recall(v[-i]))) } temp } } rpn2normal <- function(v) { return(rbind( sprintf("%s%s(%s%s(%s%s%s))", v[1], v[5], v[2], v[6], v[3], v[7], v[4]), sprintf("(%s%s%s)%s(%s%s%s)", v[1], v[5], v[2], v[6], v[3], v[7], v[4]), sprintf("((%s%s%s)%s%s)%s%s", v[1], v[5], v[2], v[6], v[3], v[7], v[4]), sprintf("(%s%s(%s%s%s))%s%s", v[1], v[5], v[2], v[6], v[3], v[7], v[4]), sprintf("%s%s((%s%s%s)%s%s)", v[1], v[5], v[2], v[6], v[3], v[7], v[4]))) } if (num < 1000 || num > 9999) stop("please input 4 digits' number") temp <- unlist(strsplit(as.character(num), "")) temp <- perm(temp) nummat <- apply(temp, 2, rep, each = 64) op <- c("+", "-", "*", "/") opmat <- sapply(expand.grid(op, op, op), as.character) opmat <- apply(opmat, 2, rep, 24) exps <- cbind(nummat, opmat) ans <- apply(exps, 1, rpn2normal) ans <- sapply(ans, function(e) eval(parse(text = e))) ans <- ans[!is.na(ans) & ans == 10] return(unique(names(ans))) } # by Mamekkoro. modified by Kappa-no-He - すごい簡潔になりました。勉強になります。ありがとうございました。次はHitandBlowを作ってみようともいます。mamekkoro *映画 [#o4ebf578] -[[Predicting movie ratings with IMDb data and R:http://rulesofreason.wordpress.com/2014/03/02/predicting-movie-ratings-with-imdb-data-and-r/]] -[[Who knows the Oscar winners? The betting markets, probably.:http://blog.revolutionanalytics.com/2014/02/oscars-betfair.html]] -[[Top 250 Movies at IMDb:http://www.exegetic.biz/blog/2013/10/top-250-movies-at-imdb/]] *覆面算 [#f9f19763] smm <- function(str) { str <- tolower(gsub("[ \t]", "", str)) str <- unlist(strsplit(str, "")) if (grepl(str[1], "+-")) { stop("Unary minus or plus is invalid.") } str <- c(str, ".") nChar <- length(str) operatorPosition <- NULL for (i in seq_len(nChar)) { if (match(str[i], c("+", "-", "=", "."), 0) != 0) { operatorPosition <- c(operatorPosition, i) } else if (match(str[i], letters, 0) == 0) { stop("Invalid character(s).") } } nTerm <- length(operatorPosition) word <- vector("list", nTerm) op <- rep("+", nTerm + 1) start <- 1 for (i in seq_len(nTerm)) { position <- operatorPosition[i] word[[i]] <- str[start:(position - 1)] op[i + 1] <- str[position] start <- position + 1 } charSet <- unique(unlist(word)) if (length(charSet) > 10) { stop("Too many characters.") } library(e1071) perm <- t(e1071::permutations(10) - 1) term <- matrix(0, nTerm, ncol(perm)) nonZeroTop <- rep(TRUE, ncol(perm)) for (i in seq_len(nTerm)) { subscript <- match(word[[i]], charSet) term[i, ] <- colSums(10^(length(subscript):1-1) * perm[subscript, ]) if (op[i] == "-") { term[i, ] <- -term[i, ] } nonZeroTop <- nonZeroTop & perm[subscript[1], ] != 0 } leftsideTerm <- colSums(term[1:(nTerm - 1), ]) answerFlag <- leftsideTerm == term[nTerm, ] & nonZeroTop ans <- unique(t(term[, answerFlag])) if (nrow(ans) == 0) { "No solution." } else if (nrow(ans) == 1) { op <- op[-nTerm-1] op[1] <- "" cat(gsub("--", "-", paste(op, ans, collapse="", sep=""))) } else { ans } } 実行例 > smm("Send + More = Money") 9567+1085=10652 > smm("Money - Send = More") 10652-9567=1085 > smm("Donald+Gerald=Robert") 526485+197485=723970 > smm("Bill+William+Monica=Clinton") 9600+1600634+457623=2067857 > smm("Green+Orange=Colors") 83446+135684=219130 > smm("Manet+Matisse+Miro+Monet+Renoir=Artists") 78436+7862553+7219+79436+134921=8162565 > smm("apple+grape+plum=banana") 67723+89673+7250=164646 > smm("seven+seven+six=twenty") 68782+68782+650=138214 > smm("earth+air+fire+water=nature") 67432+704+8046+97364=173546 > smm("five+five+nine+eleven=thirty") 4027+4027+5057+797275=810386 > smm("Saturn+Uranus+Neptune+Pluto=Planets") 127503+502351+3947539+46578=4623971 > smm("five+seven+eleven+twelve+fifteen+twenty=seventy") 3209+59094+969094+819609+3238994+819487=5909487
タイムスタンプを変更しない
#contents ---- *数独 [#m8b4a83f] -[[Rで数独:http://www.okada.jp.org/RWiki/?R%20%A4%C7%BF%F4%C6%C8]] *カードゲーム [#qe9f5159] -gamesNws: Playing games using a NWS Server -[[A pure R poker hand evaluator:http://www.r-bloggers.com/a-pure-r-poker-hand-evaluator/]] -[[Playing cards, with R:http://freakonometrics.hypotheses.org/6491]] -[[Playing cards in Vegas?:http://freakonometrics.hypotheses.org/6520]] -[[Simulation of Blackjack: the odds are not with you:http://www.econometricsbysimulation.com/2013/07/simulation-of-blackjack-odds-are-not.html]] *迷路作成 [#u2222b8c] 迷路を抜けろ! maze <- function(xsize=150, ysize=150, color="black") # 河童の屁 { old <- par(mar=c(1,1,1,1)) xsize3 <- xsize+3 ysize3 <- ysize+3 plot(c(2, xsize3), c(2, ysize3), type="n", axes=FALSE, xlab="", ylab="", asp=1) p <- matrix(FALSE, ysize+4, xsize+4) p[3:(ysize+2), 3:(xsize+2)] <- TRUE segments(c(2, 2, 3, xsize3), c(2, ysize3, 2, 2), c(2, xsize3-1, xsize3, xsize3), c(ysize3, ysize3, 2, ysize3), col=color) n <- xsize*ysize n0 <- n%/%20 istart <- 2 check.all <- TRUE repeat { if(n > n0) { repeat { i1 <- sample(2:ysize3, 1) j1 <- sample(2:xsize3, 1) if (p[i1, j1] == FALSE && (i1 != 2 || j1 != 2) && (i1 != ysize3 || j1 != xsize3)) { break } } } else { found <- FALSE for (i1 in istart:ysize3) { for (j1 in 2:xsize3) { if (p[i1+1, j1] || p[i1, j1+1]) { found <- TRUE break } } if(found) { istart <- i1 break } } check.all <- FALSE } repeat { ix <- iy <- integer(3) m <- 0 if (p[i1+1, j1]) { m <- m+1 ix[m] <- 1 } if (p[i1, j1+1]) { m <- m+1 iy[m] <- 1 } if (check.all) { if (p[i1-1, j1]) { m <- m+1 ix[m] <- -1 } if (p[i1, j1-1]) { m <- m+1 iy[m] <- -1 } } if (m == 0) { break } else if (m >= 2) { m <- sample(m, 1) } i2 <- i1+ix[m] j2 <- j1+iy[m] segments(j1, i1, j2, i2, col=color) p[i2, j2] <- FALSE i1 <- i2 j1 <- j2 n <- n-1 } if(n == 0) { break } } par(old) } &ref(maze.png); * N Queen [#o12b9014] N x N チェスボードに,N 個のクイーンを平和共存させよ! N.Queen <- function(N=8) # 河童の屁 { Solve <- function(i) { if (i > N) { Counter <<- Counter+1 cat(sprintf("\nNo. %i\n", Counter)) Board <- matrix(".", N, N) Board[cbind(1:N, Row)] <- "Q" colnames(Board) <- letters[1:N] rownames(Board) <- N:1 print(Board, quote=FALSE) return } for (j in 1:N) { if (Col[j] == TRUE && RightUp.LeftDown[i+j-1] == TRUE && RightDown.LeftUp[i-j+N] == TRUE ) { Row[i] <<- j Col[j] <<- RightUp.LeftDown[i+j-1] <<- RightDown.LeftUp[i-j+N] <<- FALSE Solve(i+1) Row[i] <<- Col[j] <<- RightUp.LeftDown[i+j-1] <<- RightDown.LeftUp[i-j+N] <<- TRUE } } } Row <- integer(N) Col <- rep(TRUE, N) RightUp.LeftDown <- RightDown.LeftUp <- rep(TRUE, 2*N-1) Counter <- 0 Solve(1) } N.Queen(12) の解の最後のもの No. 14200 a b c d e f g h i j k l 12 . . . . . . . . . . . Q 11 . . . . . . . . . Q . . 10 . . . . . . . Q . . . . 9 . . . . Q . . . . . . . 8 . . Q . . . . . . . . . 7 Q . . . . . . . . . . . 6 . . . . . . Q . . . . . 5 . Q . . . . . . . . . . 4 . . . . . . . . . . Q . 3 . . . . . Q . . . . . . 2 . . . Q . . . . . . . . 1 . . . . . . . . Q . . . *ハノイの塔 [#x36d1122] n 枚の板を a から b へ,作業場所として c を使って移せ! Hanoi <- function(n=15) # 河童の屁 { move <- function(a, b, c, n) { if (n) { move(a, c, b, n-1) animation(a, b) move(c, b, a, n-1) } } animation <- function(a, b) { # cat("from", a, "to", b, "\n") for (i in 1:n) { if (hanoi[i, a] != 0) { disc <- hanoi[i, a] hanoi[i, a] <<- 0 draw.disc(a, i, disc, FALSE) break } } for (i in n:1) { if (hanoi[i, b] == 0) { hanoi[i, b] <<- disc draw.disc(b, i, disc, TRUE) break } } } draw.disc <- function(a, i, disc, flag) { x <- n+2*n*(a-1) y <- n+1-i rect(x-disc, y-0.45, x+disc, y+0.45, col=if (flag) "blue" else "white", border="white") } hanoi <- cbind(1:n, rep(0, n), rep(0, n)) old <- par(mar=c(1,1,1,1)) plot(c(0, 6*n), c(0, n+1), type="n", xaxt="n", yaxt="n", xlab="", ylab="", bty="n") text(c(n, 3*n, 5*n), -0.5, letters[1:3], xpd=TRUE) for (i in 1:n) { draw.disc(1, i, i, TRUE) } move(1, 2, 3, n) par(old) } Hanoi() 作業の途中~ &ref(hanoi.png); * R の唄 [#le33cfd7] -[[The Most Romantic Electro-Grunge Statistical Computing Song Ever Made:http://www.r-bloggers.com/the-most-romantic-electro-grunge-statistical-computing-song-ever-made/]] *RLastFM (R interface to last.fm API) [#o46bbff6] -[[RLastFM (R interface to last.fm API):http://cran.r-project.org/web/packages/RLastFM/index.html]] *[[Rでスポーツ統計]] [#rcff260b] *バットマン方程式- バットサインの数式による描画 [#e611802f] **[[the batman equation:http://www.r-bloggers.com/the-batman-equation/]] ggplot2 利用 [#z994f59c] **plot 関数で [#t29ebf63] ggplot2 版の 40 倍の速度 by 河童の屁は,河童にあらず,屁である。 plot(0, 0, xlim=c(-7, 7), ylim=c(-3, 3), type="n", bty="n", axes=FALSE, xlab="", ylab="", asp=1) x11 <- seq(3, 7, 0.001) x12 <- seq(7, 4, -0.001) y1 <- c(3*sqrt(1-(x11/7)^2), -3*sqrt(1-(x12/7)^2)) x2 <- seq(4, 0, -0.001) y2 <- x2/2-(3*sqrt(33)-7)*x2^2/112-3 + sqrt(1-(abs(x2-2)-1)^2) x345 <- c(1, 0.75, 0.5, -0.5, -0.75, -1, 1) y345 <- c(1, 3, 2.25, 2.25, 3, 1, 1) x6 <- seq(1, 3, 0.001) y6 <- 1.5-0.5*x6+6*sqrt(10)*(1/7-sqrt(4-(x6-1)^2)/14) lines(c(x345, x6, x11, x12, x2, NA, -x2, NA, -x11, -x12, NA, -x6), c(y345, y6, y1, y2, NA, y2, NA, y1, NA, y6)) &ref(batman.png);~ やはり,塗りつぶされていないとね。~ &ref(batman2.png); *Le Mond の数学パズルをRで解く [#d111f8cb] -[[Le Monde puzzle [1]:http://www.r-bloggers.com/le-monde-puzzle-1/]] *エレガントな解を探しましょう [#l1ebc16a] **規則に従う要素を持つ正方行列(出題:河童の屁は,河童にあらず,屁である。) [#gbf106bb] n = 2 のとき 1 2 4 3 n = 3 のとき 1 2 3 8 9 4 7 6 5 n = 4 のとき 1 2 3 4 12 13 14 5 11 16 15 6 10 9 8 7 のように,時計回りの渦のように 1:(n^2) を配置する配列を返す関数 a <- function(n) { } の中身を書く。~ どんなライブラリ,関数を使っても良い。~ 空白類(空白,タブ,改行)を除く文字数が最小のものを最良のプログラムとする。~ ~ まあ,面白くもないということのようですが,例解?。174 文字。2011/09/10 a <- function(n) { x <- diag(n) for (i in 1:((n+1)%/%2)) { s <- n+1-2*i if (s == 0) { x[i, i] <- n^2 break } j <- rep(i, s) k <- c(i:(i+s-1), j+s, i+s:1) x[cbind(c(j, k), c(k, j))] <- n^2-(s+1)^2+1:(4*s) } return(x) } ~ これはどうでしょう? 143 文字。2011/10/26 b <- function(n) { A <- function(m){ x <- ncol(m) y <- 2*x+1 rbind(1:(x+1), cbind(m[x:1,x:1] + y, (x+2):y)) } B <- function(m){ if(ncol(m) < n) B(A(m)) else m } B(diag(1)) } これは156文字だけど、もう少し短くできるかな? b <- function(n) { A <- function(m){ x <- ncol(m) y <- 2*x+1 rbind(1:(x+1), cbind(m[x:1,x:1] + y, (x+2):y)) } eval( parse(text = paste(rep(c('A(','diag(1)',')'),c(n-1,1,n-1) )))) } あるいはシンプルに for loop で・・・ 136文字。 b <- function(n) { A <- function(m){ x <- ncol(m) y <- 2*x+1 rbind(1:(x+1), cbind(m[x:1,x:1] + y, (x+2):y)) } out <- diag(1) if(n>1) for(i in 2:n) out <- A(out) out } 文字数最小なのだから,変数名も1文字にすれば,この解は 128 文字解ですね。 ははは。うっかりしていました。アウトですね。 <- を = にするというのはなんとなく自分で許せませんでした。 ** [[お題:文字列を先頭から見て同じところまで除去:http://d.hatena.ne.jp/fumokmm/20110812/1313138407]] [#b4d92297] func <- function(s) # 河童の屁 { x <- lapply(s, function(x) unlist(strsplit(x, ""))) y <- sapply(x, "[", 1:min(sapply(x, length))) z <- sum(cumsum(apply(y, 1, function(y) length(unique(y)) != 1)) == 0) sapply(s, function(x) sub(sprintf(".{%i}", z), "", x)) } 実行結果 > func(c("abc123", "abcdefg", "abrt")) abc123 abcdefg abrt "c123" "cdefg" "rt" > func(c("abc123", "abcdefg", "wabrt")) abc123 abcdefg wabrt "abc123" "abcdefg" "wabrt" > func(c("かみさま", "かみゆい", "かみさん", "かみかぜ")) かみさま かみゆい かみさん かみかぜ "さま" "ゆい" "さん" "かぜ" > func(c("かみさま", "かみゆい", "かみさん", "abc")) かみさま かみゆい かみさん abc "かみさま" "かみゆい" "かみさん" "abc" ** [[お題:アラビア数字・ローマ数字変換:http://d.hatena.ne.jp/fumokmm/20110822/1314013182]] [#z8708644] R には as.roman があるけど,変換例に挙げられているのをやってみると as.roman(3999) は NA になる。これじゃまずいなあ。また,逆変換はない。&br;誰かやってみる?)&br;[[プロジェクトオイラー:http://projecteuler.net/]]の[[問題89:http://projecteuler.net/problem=89]]も参照。 -まあ,余りエレガントでもないけど。 encode <- function(r) # ローマ数字へ { str <- NULL s <- as.integer(rev(c(rep("0", 3), unlist(strsplit(as.character(r), ""))))[1:4]) s4 <- s[4] s3 <- s[3] s2 <- s[2] s1 <- s[1] if (s4 > 0) str <- c(str, rep("M", s4)) if (s3 == 9) str <- c(str, "C", "M") else if (s3 > 5) str <- c(str, "D", rep("C", s3-5)) else if (s3 == 5) str <- c(str, "D") else if (s3 == 4) str <- c(str, "C", "D") else if (s3 > 0) str <- c(str, rep("C", s3)) if (s2 == 9) str <- c(str, "X", "C") else if (s2 > 5) str <- c(str, "L", rep("X", s2-5)) else if (s2 == 5) str <- c(str, "L") else if (s2 == 4) str <- c(str, "X", "L") else if (s2 > 0) str <- c(str, rep("X", s2)) if (s1 == 9) str <- c(str, "I", "X") else if (s1 > 5) str <- c(str, "V", rep("I", s1-5)) else if (s1 == 5) str <- c(str, "V") else if (s1 == 4) str <- c(str, "I", "V") else if (s1 > 0) str <- c(str, rep("I", s1)) return(paste(str, collapse="")) } decode <- function(r) # ローマ数字から { v <- 0 str <- unlist(strsplit(r, "")) repeat { n <- length(str) if (n == 0) break s <- str[1] if (grepl(s, "IXC") && n >= 2) { s2 <- str[2] if (s == "I" && s2 == "V") { v <- v+4 str <- str[-(1:2)] next } else if (s == "I" && s2 == "X") { v <- v+9 str <- str[-(1:2)] next } else if (s == "X" && s2 == "L") { v <- v+40 str <- str[-(1:2)] next } else if (s == "X" && s2 == "C") { v <- v+90 str <- str[-(1:2)] next } else if (s == "C" && s2 == "D") { v <- v+400 str <- str[-(1:2)] next } else if (s == "C" && s2 == "M") { v <- v+900 str <- str[-(1:2)] next } } if (s == "I") { v <- v+1 } else if (s == "V") { v <- v+5 } else if (s == "X") { v <- v+10 } else if (s == "L") { v <- v+50 } else if (s == "C") { v <- v+100 } else if (s == "D") { v <- v+500 } else if (s == "M") { v <- v+1000 } str <- str[-1] } return(v) } 実行例 > as.roman(3999) [1] <NA> > encode(3999) [1] "MMMCMXCIX" > decode("MMMCMXCIX") [1] 3999 * [[錯視のカタログ:http://www.psy.ritsumei.ac.jp/~akitaoka/catalog.html]] [#rb84a4c2] [[北岡明佳の錯視のページ:http://www.ritsumei.ac.jp/~akitaoka/]] 色々な例を見ているだけで面白い&br;Rで作図してみる例題としては,高度のテクニックが必要のものもあるようだ(何で作図しているのだろうかなあ,Rではなさそう(笑)&br; -↑ これはRと何の関係が...。誰かコード書いてってこと? -関係ないと思う人はそう思えばよい。&br;プログラムを書くのがエンターテインメントの人もいるんじゃないかなと思うけど。&br;Rで描いたらどうなるかという,練習問題としてとらえれば良いでしょう。ここは「エンタメ」なんだから,いろいろなエンタメがあって良いと思うけど?&br;「R を使ってなんとかかんとか」というのがありなら,「何とかかんとかを R で描く(書く)」というのがあって何の不都合があるんでしょうか?頼まれてもかけない人は黙っていればよい。 -ちょっと書いてみました。 factor <- 0.04 n <- 20 t1 <- seq(0, 2*pi, length=13) t3 <- seq(0, 2*pi, length=801)[1:n] #plot(l2*cos(t2), l2*sin(t2)) color <- c("black", "white") color2 <- c("#cfc947", "#4e79f5") color2 <- c("aquamarine4", "green1") color2 <- c("aquamarine4", "gold2") parts <- function(x0, y0, i) { l <- 0.8^(i-1) j <- i%%2+1 l4 <- rep(l, n) l4 <- c(l4, l4-l*0.8) for (t in seq(0, 2*pi, length=41)[-1]) { t4 <- t+c(t3, rev(t3)) polygon(l4*cos(t4)+x0, l4*sin(t4)+y0, border=color[j], col=color[j]) j <- 3-j } t2 <- atan(l*factor*sin(t1)/(0.8*l+0.1*l*cos(t1))) l2 <- sqrt((0.9*l+0.1*l*cos(t1))^2+(factor*sin(t1))^2) for (t in seq(0, 2*pi, length=41)[-1]) { polygon(l2*cos(t+t2)+x0, l2*sin(t+t2)+y0, border=color2[j], col=color2[j]) j <- 3-j } } old <- par(mar=rep(0, 4)) plot(0, 0, type="n", xlim=c(0, 8), ylim=c(0, 6), asp=1, axes=FALSE, xlab="", ylab="") draw <- function(x0, y0) { for (i in 1:15) { parts(x0, y0, i) } } for (x0 in 1:4*2-1) for (y0 in 1:3*2-1) draw(x0, y0) for (x0 in 1:3*2) for (y0 in 1:2*2) draw(x0, y0) text(5, -0.4, "「蛇の回転」Copyright Akiyoshi Kitaoka 2003 (September 2, 2003)", pos=3, xpd=TRUE) par(old) *ハロウィン [#s75f90e1] -[[R でハロウィンカード:http://evol-eco.blogspot.com/2011/10/halloween-card.html]] [#ye3ef3e8] *チェス [#i8659a07] -[[First attempt at Chess Data Mining:http://www.r-bloggers.com/first-attempt-at-chess-data-mining/]] *ロゴ作成 [#o865c787] -[[Using R to create a logo: Simple :http://www.r-bloggers.com/using-r-to-create-a-logo-simple/]] *くじ引き [#gf0ef71e] -[[New Powerball (lottery) Rules Will Cost You More:http://www.r-bloggers.com/new-powerball-lottery-rules-will-cost-you-more/]] -[[宝くじがどのくらい当たるか実感してみよう:http://wofwof.blog60.fc2.com/blog-entry-630.html]] *Pasta Geometrics [#a18d08b6] -[[Pasta Geometrics:http://www.nytimes.com/interactive/2012/01/10/science/20120110_pasta.html]] こんなのでよいのかなあ? 河童の屁は,河童にあらず,屁である。~ Agnolotti PI <- THETA <- KAPPA <- matrix(0, 61, 101) for (i in 0:60) { for (j in 0:100) { PI[i, j] <- (10 * sin(i * pi / 120) ^ 0.5 + i / 400 * sin(3 * j * pi / 10)) * cos(19 * j * pi / 2000 + 0.03 * pi) THETA[i, j] <- (10 * sin(i * pi / 120) + i / 400 * cos(3 * j * pi / 10)) * sin(19 * j * pi / 2000 + 0.03 * pi) KAPPA[i, j] <- 5 * cos(i * pi / 120) ^ 5 * sin(j * pi / 100) - 5 * sin(j * pi / 100) * cos(i * pi / 120) ^ 200 } } library(rgl) plot3d(c(PI), c(THETA), c(KAPPA), aspect = c(1, 1, 0.25)) &ref(Agnolotti.png); plot3d は隠れた部分の消去機能がないので,見た目が悪い。自分で回転させれば形がよくわかる。~ Fagottini PI <- THETA <- KAPPA <- matrix(0, 201, 51) for (i in 0:200) { for (j in 0:50) { alpha <- (0.8 + sin(i * pi / 100) ^ 8 - 0.8 * cos(i * pi / 25)) ^ 1.5 + 0.2 + 0.2 * sin(i * pi / 100) beta <- (0.9 + cos(i * pi / 100) ^ 8 - 0.9 * cos((4 * i + 3) * pi / 100)) ^ 1.5 + 0.3 * cos(i * pi / 100) gamma <- 4 - 4 * j / 500 * (1 + cos(i * pi / 100) ^ 8 - 0.8 * cos(i * pi / 25)) ^ 1.5 PI[i, j] <- cos(i * pi / 100) * (alpha * sin(j * pi / 100) ^ 8 + 0.6 * (2 + sin(i * pi / 100) ^ 2) * sin(j * pi / 50) ^ 2) THETA[i, j] <- sin(i * pi / 100) * (beta * sin(j * pi / 100) ^ 8 + 0.6 * (2 + cos(i * pi / 100) ^ 2) * sin(j * pi / 50) ^ 2) KAPPA[i, j] <- (1 + sin((j - 50) * pi / 100)) * (gamma - 4 * j / 500 * (1 + sin(i * pi / 100) ^ 8 - 0.8 * cos(i * pi / 25)) ^ 1.5) } } library(rgl) plot3d(c(PI), c(THETA), c(KAPPA), aspect = c(1, 1, 0.5)) &ref(Fagottini.png); *CX's 'reality distortion' pie-graph (フジTV のステマ円グラフ) [#nf026bb6] http://blog.livedoor.jp/dqnplus/archives/1692812.html これは、ひどい。 が、遊びで描いてみた。 library(grid) png(filename = "~/Desktop/fuji-pie.png", width = 360, height = 360, units = "px") num <- c(94, 97, 78, 78) distortion <- c(1, 1.2, 1, 1) dist_num <- num * distortion cum <- c(0, cumsum(dist_num)) rad <- cum/sum(dist_num) * 360/180 * pi colors <- c("#0000FFAA", "#FF0000AA", "#000055AA", "#0000AAAA") labels <- paste(c("50ies\n", "10~20ies\n", "30ies\n", "40ies\n"), num, " ps", sep = "") lab_cex <- c(1, 1.5, 1, 1) lab_col <- c("white", "yellow", "white", "white") div <- 200 # 円弧部分の分割数 dx <- 0 # 半径=0.5 として、x 方向への中心のズレ dy <- 0.1 # 半径=0.5 として、y 方向への中心のズレ for (i in 1:length(num)) { x <- c(0.5 + dx, 0.5 + 0.5 * sin(rad[i]), 0.5 + 0.5 * sin(seq(rad[i], rad[i + 1], length.out = div)), 0.5 + 0.5 * sin(rad[i + 1])) y <- c(0.5 + dy, 0.5 + 0.5 * cos(rad[i]), 0.5 + 0.5 * cos(seq(rad[i], rad[i + 1], length.out = div)), 0.5 + 0.5 * cos(rad[i + 1])) grid.polygon(x = x, y = y, gp = gpar(fill = colors[i])) grid.text(x = 0.5 + 0.4 * sin((rad[i] + rad[i + 1])/2), y = 0.5 + 0.4 * cos((rad[i] + rad[i + 1])/2), label = labels[i], gp = gpar(col = lab_col[i], cex = lab_cex[i])) } dev.off() #ref(fuji-pie.png) 古典的グラフィックでも。 fuji.pie <- function(x, center, labels, colors, text.colors, text.cex) { if (missing(center)) center <- c(0, 0.3) i <- (1:360)/360 * 2 * pi arc <- cut(1:360, c(0, round(cumsum(x) * 360/sum(x)), Inf)) plot.new() plot.window(xlim = c(-1, 1), ylim = c(-1, 1), "", asp = 1) l <- levels(arc) for (j in 1:length(x)) { k <- c(i[arc == l[j]], max(i[arc == l[j]]) + 1/360 * 2 * pi) polygon(c(center[1], cos(k)), c(center[2], sin(k)), col = colors[j]) text(mean(cos(k))/1.5, mean(sin(k))/1.5, labels[j], cex = text.cex[j], col = text.colors[j]) } } fuji.pie(c(94, 78, 78, 97), labels = c("50代\n94人", "40代\n78人", "30代\n78人", "10〜20代\n97人"), colors = c("deepskyblue", "dodgerblue1", "dodgerblue3", "brown1"), text.colors = c("white", "white", "white", "yellow"), text.cex = c(1.5, 1.5, 1.5, 3)) #ref(20120131a.png); ->>fuji.pie() お見事、完敗です。でも、この関数を誰かが使うのか?? (笑) エンタメだからいいですよね。 *Music [#h602b67b] -[[Music player in R (Linux):http://www.r-bloggers.com/music-player-in-r-linux/]] [#v642664e] -[[Programming instrumental music from scratch:http://vikparuchuri.com/blog/making-instrumental-music-from-scratch/]] [#wd100e3a] *ウォーリーを探せ [#x362ffe5] -[raster パッケージによるもの:http://stackoverflow.com/questions/8563604/how-to-find-waldo-with-r]] -[[Rでウォーリーを探してみた:http://www.slideshare.net/wdkz/2012-ssp-susermtgwdkzpublished]] -[[Where's Waldo? Image Analysis in R:http://blog.revolutionanalytics.com/2012/05/wheres-waldo-image-analysis-in-r.html]] *Hangman [#o2ea46b4] -[[Hangman in R: A learning experience:http://trinkerrstuff.wordpress.com/2012/07/29/hangman-in-r-a-learning-experience/]] *Minesweeper [#i0b18a04] -[[Minesweeper:http://www.talkstats.com/showthread.php/17845-Minesweeper?p=54524&viewfull=1#post54524]] *カッシーニの卵形線 [#u4521a20] -[[Animation basics for a vacation:http://rsnippets.blogspot.jp/2012/08/animation-basics-for-vacation.html]] *スピログラフ [#adc52baa] -[[Spirograph with R:http://menugget.blogspot.jp/2012/12/spirograph-with-r.html]] -[[スピログラフ:http://blog.goo.ne.jp/r-de-r/e/672225e329b3003b0f259289a320f298]] *[[Solving 9-puzzle with GNU R:http://rsnippets.blogspot.jp/2013/01/solving-9-puzzle-with-gnu-r.html]] [#ofc9ecb1] * 星空 [#y909071f] pchでいつの間にか全角文字が使えるようになっていたのを知ったので、お昼休みに「★」で星空を作成してみた -- [[谷村]] 2013-02-22 (金) 12:48:52 - 星の位置は、CSR (完全空間ランダム)による分布 - 星の大きさは対数正規分布 - 星の色は[[ここ:http://www15.ocn.ne.jp/~kagaku/ocn/tsu_wkk/star/star_color/star_color.htm]]を参照。でも、結果的に適当 :-p - filled.contour()は、keyを内部でハードコーディングしているので、オプションでkeyを取り除けず、仕方がないのでpngパッケージで切り落とした library(splancs) library(png) f <- paste0(tempfile(), ".png") png(file = f) op <- par(bg = "#000022", mai = c(0, 0, 0, 0)) filled.contour(volcano, nlevels = 100, color.palette = colorRampPalette(c("#000000", "#007BC3"), space = "Lab", bias = .5)) n <- 1000 p <- matrix(c(0, 0, 1, 0, 1, 1, 0, 1, 0, 0), ncol = 2, byrow = TRUE) cols <- c(rep("#FFFFFF", 10), "#FAFAFA", "#FFEF85", "#FFB74C") points(csr(p, n), pch = "★", col = cols, cex = rlnorm(n, 0, .5) * .2) par(op) dev.off() p <- readPNG(f) unlink(f) p1 <- p[, -(440:480), ] writePNG(p1, "20130222.png") &ref(20130222.png); *[[Happy St Patrick’s Day:http://freakonometrics.hypotheses.org/5011]] [#e4340810] * [[Rでスネークゲーム:http://rpubs.com/mokjpn/rsnake]] [#k4714d46] * Rで切符問題 [#c8773fb4] rv.kippu<-function(num){ exp <- NULL stackpointer <- 0 stack <- list() perm<-function(v){ temp<-NULL if(length(v) == 1){ v[1] }else{ for(i in 1:length(v)){ temp <- rbind(temp,cbind(v[i],Recall(v[-i]))) } temp } } push <- function(d){ stack[[stackpointer + 1]] <<- d stackpointer <<- (stackpointer + 1) } pop <- function(){ if(stackpointer == 0){ NULL }else{ value <- stack[[stackpointer]] stack[[stackpointer]] <<- NULL stackpointer <<- (stackpointer - 1) value } } rpn2normal<-function(v){ len<-length(v) for(i in 1:len){ if(any(grep("^[-+*/]",v[i])) ){ n2<-pop() n1<-pop() exp<-paste("(",n1,v[i],n2,")",sep="") push(exp) }else{ if(any(grep("[0-9]",v[i]))) { push(v[i]) } } } invisible(exp) } if(num >= 0 && num <= 9999){ n1 <- as.character(n1 <- num %/% 1000) n2 <- as.character(n2 <- num %% 1000 %/% 100) n3 <- as.character(n3 <- num %% 100 %/% 10) n4 <- as.character(n4 <- num %% 10) t<-perm(c(n1,n2,n3,n4)) op <- c("+","-","*","/") exps<-NULL # num num opr num num opr opr for(i in c(1:24)){ nums<-t[i,] tmp<-NULL for(i1 in op){ for(i2 in op){ for(i3 in op){ tmp<-c(nums[1],nums[2],i1,nums[3],nums[4],i2,i3) exps<-c(exps,tmp) } } } } # num num opr num opr num opr for(i in c(1:24)){ nums<-t[i,] tmp<-NULL for(i1 in op){ for(i2 in op){ for(i3 in op){ tmp<-c(nums[1],nums[2],i1,nums[3],i2,nums[4],i3) exps<-c(exps,tmp) } } } } # num num num opr num opr opr for(i in c(1:24)){ nums<-t[i,] tmp<-NULL for(i1 in op){ for(i2 in op){ for(i3 in op){ tmp<-c(nums[1],nums[2],nums[3],i1,nums[4],i2,i3) exps<-c(exps,tmp) } } } } # num num num opr num opr opr for(i in c(1:24)){ nums<-t[i,] tmp<-NULL for(i1 in op){ for(i2 in op){ for(i3 in op){ tmp<-c(nums[1],nums[2],nums[3],i1,nums[4],i2,i3) exps<-c(exps,tmp) } } } } # num num opr num num opr opr for(i in c(1:24)){ nums<-t[i,] tmp<-NULL for(i1 in op){ for(i2 in op){ for(i3 in op){ tmp<-c(nums[1],nums[2],i1,nums[3],nums[4],i2,i3) exps<-c(exps,tmp) } } } } tmp <- apply(matrix(exps,byrow=T,ncol=7),1,rpn2normal) ret <- NULL for(i in tmp){ #print(class(i)) ans <- eval(parse(text=i)) if(is.finite(ans) &&(ans == 10)){ s <- paste(i,"=",ans) #print(s) ret <- c(ret,s) } } ret <- matrix(ret,ncol=1) return(unique(ret)) }else{ print("please input 4 digits' number" ) }}# by Mamekkoro - if(any(grep("^[-\+\*/]",v[i])) ){ は if(any(grep("^[-+*/]",v[i])) ){ でなきゃ,エラーになる。&br;1111 など,不可能な場合に,「以下にエラー matrix(ret, ncol = 1) : 'data' はベクトル型でなくてはなりませんが、'NULL' でした 」エラーを吐くのはみっともない。 - 了解しました by mamekkoro - 定型的な処理を繰り返すのに for を多用するのも善し悪し。少なくとも,i1, i2, i3 の op は,3 重の for ループに共通する 4^3 × 3 の matrix で表すことができる。&br;計算時間はたいして違わないが,視認性には大きな違いがある。&br;2.5倍くらい速くなった。&br;簡潔にしたら,いろいろ不要な部分や間違い?も発見できた。目を通す部分は少ないに越したことはない。 rv.kippu2 <- function(num) { perm <- function(v) { temp <- NULL if (length(v) == 1) { v[1] } else { for (i in 1:length(v)) { temp <- rbind(temp, cbind(v[i], Recall(v[-i]))) } temp } } rpn2normal <- function(v) { stackpointer <- 0 stack <- character(10) for (i in seq_along(v)) { if (grepl("[-+*/]", v[i])) { n2 <- stack[stackpointer] stackpointer <- stackpointer - 1 n1 <- stack[stackpointer] exp <- paste("(", n1, v[i], n2, ")", sep = "") stack[stackpointer] <- exp } else if (grepl("[0-9]", v[i])) { stackpointer <- stackpointer + 1 stack[stackpointer] <- v[i] } } invisible(exp) } if (num < 1000 || num > 9999) stop("please input 4 digits' number") temp <- unlist(strsplit(as.character(num), "")) temp <- perm(temp) nummat <- apply(temp, 2, rep, each = 64) op <- c("+", "-", "*", "/") opmat <- sapply(expand.grid(op, op, op), as.character) opmat <- apply(opmat, 2, rep, 24) exps5 <- cbind(nummat, opmat) # num num num num opr opr opr exps1 <- exps5[, c(1:2, 5, 3:4, 6:7)] # num num opr num num opr opr exps2 <- exps5[, c(1:2, 5, 3, 6, 4, 7)] # num num opr num opr num opr exps3 <- exps5[, c(1:3, 5:6, 4, 7)] # num num num opr opr num opr exps4 <- exps5[, c(1:3, 5, 4, 6:7)] # num num num opr num opr opr exps <- rbind(exps1, exps2, exps3, exps4, exps5) ans <- apply(exps, 1, rpn2normal) ans <- sapply(ans, function(e) eval(parse(text = e))) ans <- ans[ans == 10] return(unique(names(ans))) } # by Mamekkoro. modified by Kappa-no-He さらに 1.8 倍ほど速くなった。 rv.kippu3 <- function(num) { perm <- function(v) { temp <- NULL if (length(v) == 1) { v[1] } else { for (i in 1:length(v)) { temp <- rbind(temp, cbind(v[i], Recall(v[-i]))) } temp } } rpn2normal <- function(v) { return(rbind( sprintf("%s%s(%s%s(%s%s%s))", v[1], v[5], v[2], v[6], v[3], v[7], v[4]), sprintf("(%s%s%s)%s(%s%s%s)", v[1], v[5], v[2], v[6], v[3], v[7], v[4]), sprintf("((%s%s%s)%s%s)%s%s", v[1], v[5], v[2], v[6], v[3], v[7], v[4]), sprintf("(%s%s(%s%s%s))%s%s", v[1], v[5], v[2], v[6], v[3], v[7], v[4]), sprintf("%s%s((%s%s%s)%s%s)", v[1], v[5], v[2], v[6], v[3], v[7], v[4]))) } if (num < 1000 || num > 9999) stop("please input 4 digits' number") temp <- unlist(strsplit(as.character(num), "")) temp <- perm(temp) nummat <- apply(temp, 2, rep, each = 64) op <- c("+", "-", "*", "/") opmat <- sapply(expand.grid(op, op, op), as.character) opmat <- apply(opmat, 2, rep, 24) exps <- cbind(nummat, opmat) ans <- apply(exps, 1, rpn2normal) ans <- sapply(ans, function(e) eval(parse(text = e))) ans <- ans[!is.na(ans) & ans == 10] return(unique(names(ans))) } # by Mamekkoro. modified by Kappa-no-He - すごい簡潔になりました。勉強になります。ありがとうございました。次はHitandBlowを作ってみようともいます。mamekkoro *映画 [#o4ebf578] -[[Predicting movie ratings with IMDb data and R:http://rulesofreason.wordpress.com/2014/03/02/predicting-movie-ratings-with-imdb-data-and-r/]] -[[Who knows the Oscar winners? The betting markets, probably.:http://blog.revolutionanalytics.com/2014/02/oscars-betfair.html]] -[[Top 250 Movies at IMDb:http://www.exegetic.biz/blog/2013/10/top-250-movies-at-imdb/]] *覆面算 [#f9f19763] smm <- function(str) { str <- tolower(gsub("[ \t]", "", str)) str <- unlist(strsplit(str, "")) if (grepl(str[1], "+-")) { stop("Unary minus or plus is invalid.") } str <- c(str, ".") nChar <- length(str) operatorPosition <- NULL for (i in seq_len(nChar)) { if (match(str[i], c("+", "-", "=", "."), 0) != 0) { operatorPosition <- c(operatorPosition, i) } else if (match(str[i], letters, 0) == 0) { stop("Invalid character(s).") } } nTerm <- length(operatorPosition) word <- vector("list", nTerm) op <- rep("+", nTerm + 1) start <- 1 for (i in seq_len(nTerm)) { position <- operatorPosition[i] word[[i]] <- str[start:(position - 1)] op[i + 1] <- str[position] start <- position + 1 } charSet <- unique(unlist(word)) if (length(charSet) > 10) { stop("Too many characters.") } library(e1071) perm <- t(e1071::permutations(10) - 1) term <- matrix(0, nTerm, ncol(perm)) nonZeroTop <- rep(TRUE, ncol(perm)) for (i in seq_len(nTerm)) { subscript <- match(word[[i]], charSet) term[i, ] <- colSums(10^(length(subscript):1-1) * perm[subscript, ]) if (op[i] == "-") { term[i, ] <- -term[i, ] } nonZeroTop <- nonZeroTop & perm[subscript[1], ] != 0 } leftsideTerm <- colSums(term[1:(nTerm - 1), ]) answerFlag <- leftsideTerm == term[nTerm, ] & nonZeroTop ans <- unique(t(term[, answerFlag])) if (nrow(ans) == 0) { "No solution." } else if (nrow(ans) == 1) { op <- op[-nTerm-1] op[1] <- "" cat(gsub("--", "-", paste(op, ans, collapse="", sep=""))) } else { ans } } 実行例 > smm("Send + More = Money") 9567+1085=10652 > smm("Money - Send = More") 10652-9567=1085 > smm("Donald+Gerald=Robert") 526485+197485=723970 > smm("Bill+William+Monica=Clinton") 9600+1600634+457623=2067857 > smm("Green+Orange=Colors") 83446+135684=219130 > smm("Manet+Matisse+Miro+Monet+Renoir=Artists") 78436+7862553+7219+79436+134921=8162565 > smm("apple+grape+plum=banana") 67723+89673+7250=164646 > smm("seven+seven+six=twenty") 68782+68782+650=138214 > smm("earth+air+fire+water=nature") 67432+704+8046+97364=173546 > smm("five+five+nine+eleven=thirty") 4027+4027+5057+797275=810386 > smm("Saturn+Uranus+Neptune+Pluto=Planets") 127503+502351+3947539+46578=4623971 > smm("five+seven+eleven+twelve+fifteen+twenty=seventy") 3209+59094+969094+819609+3238994+819487=5909487
テキスト整形のルールを表示する
添付ファイル:
hanoi.png
1818件
[
詳細
]
Koch.png
792件
[
詳細
]
tree.png
806件
[
詳細
]
batman.png
1749件
[
詳細
]
20130222.png
1391件
[
詳細
]
batman2.png
1705件
[
詳細
]
fuji-pie.png
1519件
[
詳細
]
maze.png
2250件
[
詳細
]
dragon.png
846件
[
詳細
]
Agnolotti.png
1579件
[
詳細
]
20120131a.png
1601件
[
詳細
]
Fagottini.png
1667件
[
詳細
]