2011年7月1日金曜日

scheme(gauche) でquicksort

haskellではquicksortがやたらエレガントに書ける。
([1]を参考にしました)


quicksort :: Ord a => [a] -> [a]
quicksort [] = []
quicksort (x:xs) = qsort smaller ++ [x] ++ qsort larger
  where
    smaller = [ a | a <- xs, a <= x]
    larger  = [ b | b <- xs, b > x ]

これの発想をちょっと真似たらschemeでもなかなかうまくかけた。(気がする)

(use srfi-11)

(define (lefter&righter ord a lst)
  (let loop ((rmn lst) (lefter '()) (righter '()))
    (cond ((null? rmn) (values lefter righter))
 ((eq? (car rmn) a) (loop (cdr rmn) lefter righter))
 ((ord (car rmn) a) (loop (cdr rmn) (cons (car rmn) lefter) righter))
 (else (loop (cdr rmn) lefter (cons (car rmn) righter))))))

(define (quicksort ord lst)
  (if (null? lst) lst
      (let-values (((lefter righter) (lefter&righter ord (car lst) (cdr lst))))
(append (quicksort ord lefter) `(,(car lst)) (quicksort ord righter)))))

初めにHaskell版のwhere以下に相当する関数を作っている。
(これ自体きっと有用だろう。)
あとはHaskell版とほとんどおなじだ。

新しい点としては順序ordを指定できること。
これで文字列間の順序なんかも定め整列させることができる。

あとこのプログラムを作っている過程で多値に目覚めてしまった。
別になくてもいいけどあるととても楽!



[1] プログラミングHaskell Graham Hutton 著 山本和彦 訳

2011年5月12日木曜日

正方形のpdfファイル

なぜかプレゼンテーションを正方形でやりたくなった。
情報まとめ

step1 psファイルを作成する
step2 正方形にする
step3 pdfにする

step1 
TeXを使用していたのでここはdvipsで問題ない。

step2 
できあがったpsファイルをテキストエディタで開く。
冒頭の

%!PS-Adobe-2.0



%!PS-Adobe-2.0 EPSF-2.0

に変更。(バージョンは適当に)
%%DocumentPaperSizes をa4からsquareに変更。
BoundingBoxを正方形にしないと上が適応されない模様。

Step3
オプション
ps2pdf14 -dEPSCrop foo.ps
によって正方形のPDFファイルができるが、BoundingBoxがうまく設定されていない。
しかしPDFのそれを変更する方法が分からなかったので、Step2でできたPSファイルを一ページずつPDFに変換し結合するという方法をとった。これはシェルスクリプトでできる。
以下のようなかんじ

#!/bin/bash

for i in `seq 1 2`
do
    psselect -p $i $1.ps $1_00$i.ps
    ps2pdf14 -dEPSCrop $1_00$i.ps
done
pdftk $1_[0-9][0-9][0-9].pdf cat output $1.pdf
rm $1_*ps
rm $1_*pdf

これで美しい正方形が!
これからTeXのレイアウトなどを調整せねばならぬが、 それはおいおい

参照文献
http://www11.atwiki.jp/physnote/pages/24.html#id_08937a2a
に大変助けられました。

2011年2月17日木曜日

asirで作業内容を記録する

linuxなら

asir | tee filename

で起動し、

ctrl("echo",1);

で入力内容も出力するようにしてやれば一連の作業内容をfilenameに記録することができる。