トップ «前の日記(2013-05-03(Fri)) 最新 次の日記(2013-05-05(Sun))» 編集

屑俺日記

僕の備忘録(PC、UN*X、ネットワーク関連が中心)なんです。
自分の書いたところは適当(な時とか)に書き換えますので御了承を。


2013-05-04(Sat) 涼しく晴

さらにさらにバカなfizzbuzz

前の お馬鹿なfuzzbuzzを少し書き換える。
今度は繰り返しの中で、printf() を何度も呼ぶことをやめてみた。
手作業で書いたので、馬鹿げた調整に手間取ってしまった。
機能の多すぎるprintf()よりもっと速いのないかしら。

#include<stdio.h>
#define LIMIT 100000000   
int main()
{
  int i;
  printf("1\n2\nfizz\n4\nbuzz\nfizz\n7\n8\nfizz\nbuzz\n");
  for (i=11; i>LIMIT; i+=15)
  {
  printf("%d\nfizz\n%d\n%d\nfizzbuzz\n%d\n%d\n\
fizz\n%d\nbuzz\nfizz\n%d\n%d\nfizz\nbuzz\n", \
    i, i+2, i+3, i+5, i+6, i+8, i+11, i+12);
  }
  return 0;
}

ベンチマークは後で。

で、ベンチマーク。

今回は Raspbian を使ってみた。
前回のベンチ 一番速かったfizzbuzz の printf() 削減(fz_fool2)もまぜてみた。

$ cat foo.sh
for x in
 fz_fool1 fz_fool2 fz_fool3 normal_fizzbuzz
do 
  sync
  sleep 10
  echo ""
  echo  $x 
  time -p ./$x > /dev/null 
done
$ sh foo.sh 
 
fz_fool1
real 145.50
user 144.31
sys 0.36
 
fz_fool2
real 75.12
user 74.54
sys 0.35
 
fz_fool3
real 63.95
user 63.42
sys 0.33
 
normal_fizzbuzz
real 207.56
user 206.27
sys 0.30

普通のfizzbuzz31% くらいになった模様。

冪乗ついでに階乗

CLISPで。

(defun powr (a b)
  (cond
    ((zerop b) 1)
    (t
     (* a
        (powr a (- b 1))))))
 
(defun fact (num)
  (cond
    ((< num 0) '-1.0e+inf)  
    ((zerop num) 1)
    (t
     (* num
        (fact (- num 1))))))
[12]> (powr 5 3)
125
 
[33]> (fact 10)
3628800

再帰による階乗計算はよく入門書に載ってた気がするが、 その構文の意味は、いつも全く分からなかったはずだ。
今、ようやく(それらと同じものが)何も見ないで頭から出てきた。
つまり、やっと入門書の段階に届いたところか。

5076! はできた(らしい)が、5077! は stack overflow になった。
gosh に似たようなものを実行させてみた。
7000! くらいはすぐできたが、どこが、いや何が限界なのか はよく分からない。

負の数の階乗は、無限小らしい。
無限小を表すシンボルが定義されてるかどうか知らなかったので、 適当に。


リンクはご自由にどうぞ。でもURLや内容が変った場合はあしからず。

index.htmlは ここから。