既約分数クイズ にあるもの。
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
※コメント投稿者のブログIDはブログ作成者のみに通知されます