No Such Blog or Diary

«Prev || 1 | 2 | 3 |...| 1263 | 1264 | 1265 |...| 1292 | 1293 | 1294 || Next»

Haskell で実行トレース

Haskell でプログラムを動かしたときに,その実行とレースを取りたいことが時々?ある.でも,一般にHaskellで文字列を出力しようとするとモナドが出てきて面倒.

で,簡単にそれをやる方法があった.Debug.Trace.trace という関数でそれが簡単にできる.例えば mis の途中結果を知りたければ

import Debug.Trace
mis [] i = i
mis (x:xs) i = trace (show x ++" with "++show i) (mis xs (max i 0 + x))

とすれば途中結果が見れる.かなりありがたいかも.ただ,表示ために本来計算しない部分を計算したりすると動作が変わるので注意.

縁取りで文字列表示

D3DXFont を使うと GDI を使わずに DirectX の世界だけで文字列を表示できる.で,早速それを使って描いてみたわけだが文字の縁がないので少々見にくい.そこで縁取りを入れてみることにした.

やり方は一番単純なやつで,縁の色で上下左右にずらした文字を先に描画,そのあと目的のを真ん中にと.これをやると5回描画が必要だけど,たかが文字列なので気にしない.他にうまいやり方ってあるのかなぁ?

fps 固定成功?

DirectX でプログラムを組んで遊んでいるわけだが,fps の固定にも少々てこずったり.時間間隔を得るのに timeGetTime() を使ってたら分解能が 5ms でfps 固定できないし... 結局, QueryPerformanceCounter, QueryPerformanceFrequency を使うはめになった.こっちの精度はばか高いので,fps もかなり固定できるようになった.ただ,まだ 0.02 程度の揺らぎがあるけど...

クオータニオン

DirectX のプログラムを書こうとしてクオータニオンが何なのか分からず調べることに.結果としてはただの四元数のことだったのだが,これが三次元上の任意軸の上の回転を現していることははじめて知った.ということで,検索に引っかかったよさげな解説書のリンクを張っておこう.阪大基礎工の方が書かれたらしい.

Haskell で冪のソートを

Haskell を使って「冪の下の桁から辞書順ソート」を組んでみた.メモリを節約するアイデアは Java のときと同様,必要な下の桁だけ計算すること.Java の実装では必要になった上位桁の再計算を明示的に書かなければならなかったが,Haskell だと遅延評価で勝手に必要なところだけを計算してソートしてくれる.おかげでコードもすっきり.いやぁ,遅延評価って本当に良いですねぇ.

> module Main (main) where
> import List
> import System
> import Char
> atoi :: String -> Int
> atoi = foldl (\x y-> x*10 + ord y - ord '0') 0
> main = getArgs >>= \lines -> let (n,b) = getOpt lines (10000, 2) in printans n b
> getOpt :: [String] -> (Int, Int) -> (Int, Int)
> getOpt [] p = p
> getOpt [x] p = p
> getOpt (x:y:zs) (n, b) = case x of 
>                               "-b" -> getOpt zs (n, atoi y)
>                               "-n" -> getOpt zs (atoi y, b)
>                               _    -> getOpt (y:zs) (n, b)
> printans n b = putStr (sortedliststring n b)
> sortedliststring n b = (foldr (\x y-> show b ++ "^"++(show x) ++"\n"++y) [] (sortedlist n b))
> sortedlist n b = map (\(x,y)->y) (List.sort(take n (powers b)))
> powers k = pows ([1], 0) 
>  where 
>  pows (an, n) = (map nrev p, n+1):pows (p, n+1)
>   where p = mmult an 0
>  base = 1000
>  mmult [] c   = if c == 0 then [] else (c `mod` base):mmult [] (c `div` base)
>  mmult (x:xs) c = let v = x * k + c in (v `mod` base):mmult xs (v `div` base)
>  nrev x = nrev' base 0 x
>   where 
>   nrev' 1 r n = r
>   nrev' b r n = nrev' (b `div` 10) (r * 10 + (n `mod` 10)) (n `div` 10) 

ちなみに,b = 2, n = 1000000 でうちのマシンだと 46秒 + Mem500M ていど.Java で 25秒 + Mem80M ていどなので,まあスピードはこんなもんでしょう.メモリは簡約を続けるために覚えとく分が多いからしょうがないし.

2^2000000 までで 2分+Mem1G. 限界... ついでなのでソースを置いておこう.Haskellバージョン, Javaバージョン

新聞屋の勧誘員は馬鹿なのだろうか?

新聞の勧誘員に対して「新聞要らない」と答えたところ「なぜ?」と返された.要らない物が要らない事に「要らない」以外の理由はない.とりあえずこのとおりに答えてドアをバタン.学習能力のない集団なのでどうせまたくるだろうけど.ホンと邪魔だなぁ.

«Prev || 1 | 2 | 3 |...| 1263 | 1264 | 1265 |...| 1292 | 1293 | 1294 || Next»
Search
Feeds

Page Top