裏 RjpWiki

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

既約分数クイズ

2011年11月29日 | ブログラミング

既約分数クイズ にあるもの。

0/q, q/q は自明なので,除く。いかにもRらしい解??。ただし,メモリ節約も最適化も何にも考えない。既存関数を利用し,ひたすら短く難解なプログラムを目指す。

> func <- function(d0)
+ {
+     euclid <- function(m, n)
+     {
+         m0 <- m
+         n0 <- n
+         while ((temp <- n %% m) != 0) {
+             n <- m
+             m <- temp
+         }
+         return(c(m0/m, n0/m))
+     }
+     a <- unique(data.frame(t(combn(d0, 2, function(x) euclid(x[1], x[2])))))
+     apply(a[order(a[,1]/a[,2]), 1:2], 1, function(x) cat(sprintf("%d/%d  ", x[1], x[2])))
+     cat("\n")
+ }
> func(9)
1/9  1/8  1/7  1/6  1/5  2/9  1/4  2/7  1/3  3/8  2/5  3/7  4/9  1/2  5/9  4/7  3/5  5/8  2/3 
5/7  3/4  7/9  4/5  5/6  6/7  7/8  8/9 

別解(さらに横着)

> library(gmp)
> func <- function(d0)
+ {
+     euclid <- function(m, n)
+     {
+         k <- as.numeric(gcd.bigz(m, n))
+         return(c(m/k, n/k))
+     }
+     a <- unique(data.frame(t(combn(d0, 2, function(x) euclid(x[1], x[2])))))
+     apply(a[order(a[,1]/a[,2]), 1:2], 1, function(x) cat(sprintf("%d/%d  ", x[1], x[2])))
+     cat("\n")
+ }
> func(9)
1/9  1/8  1/7  1/6  1/5  2/9  1/4  2/7  1/3  3/8  2/5  3/7  4/9  1/2  5/9  4/7  3/5  5/8  2/3
5/7  3/4  7/9  4/5  5/6  6/7  7/8  8/9 

さらに短く複雑に

> library(gmp)
> func <- function(d0)
+ {
+     a <- unique(data.frame(t(combn(d0, 2, function(x) {k <- as.numeric(gcd.bigz(x[1], x[2]));
+          return(c(x[1]/k, x[2]/k))}))))
+     apply(a[order(a[,1]/a[,2]), 1:2], 1, function(x) cat(sprintf("%d/%d  ", x[1], x[2])))
+     cat("\n")
+ }
> func(9)
1/9  1/8  1/7  1/6  1/5  2/9  1/4  2/7  1/3  3/8  2/5  3/7  4/9  1/2  5/9  4/7  3/5  5/8  2/3
5/7  3/4  7/9  4/5  5/6  6/7  7/8  8/9 

コメント    この記事についてブログを書く
  • X
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« sd(データフレーム) は廃止-... | トップ | pbirthday の改訂 »
最新の画像もっと見る

コメントを投稿

ブログラミング」カテゴリの最新記事