HaskellでProject Eulerに挑戦してみた
id:gomi-boxに触発されて、Project Eulerに挑戦してみた。
Project Eulerみたいな、アルゴリズム的なものを書いて一人でくねくねする遊びは、Haskellとの相性が良すぎる。
コードは続きで。
id:gomi-boxに触発されて、Project Eulerに挑戦してみた。
Project Eulerみたいな、アルゴリズム的なものを書いて一人でくねくねする遊びは、Haskellとの相性が良すぎる。
コードは続きで。
Haskellを真面目に勉強し始めて10日ほど経つ。一応、Yet Another Haskell Tutorialをだいたい読み終わったわけだが、最後のモナドの章だけは断念した。日本語で何回説明されてもわからないものを英語で説明されてもわかるわけがない。
とはいえ、一応Haskellの文法などは勉強してみて、モナドについてもいろいろと聞きかじってみたわけで、自分なりに「モナドってこんなものなのかな?」っていうようなものはつかめたような気がする。なので、自分なりの理解やら疑問やらをメモっておこうかと思う。
自分の考えの整理のために書き連ねるので、もし間違っていたり考え違いをしているところがあれば (そんなところばっかだろうけど) 、容赦なく突っ込んでもらいたい。
なんか興奮してHaskellとか書いてたけど、一昨日Tsukuba.Rに参加して、Rを勉強してきたんだった。そこで、syou6162先生に教わったsapply()を使ってfizzbuzzを書いてみよう。
↓な感じ。
fizzbuzz <- function(x, y) {
sapply(x:y, function(n) {
ifelse(n %% 15, ifelse(n %% 3, ifelse(n %% 5, n, "Buzz"), "Fizz"), "FizzBuzz")
})
}
sapply()を使ったから、for文が消えて少しRっぽくなった気がするけど、いまいち芸がない。もう少し工夫ができそう。
昨晩、突然ひらめいてHaskellでfizzbuzzを書いてみた。
fizzbuzz :: Integer -> Integer -> [String]
fizzbuzz x y | x > y = []
| (mod x 15) == 0 = "FizzBuzz" : fizzbuzz (x + 1) y
| (mod x 3) == 0 = "Fizz" : fizzbuzz (x + 1) y
| (mod x 5) == 0 = "Buzz" : fizzbuzz (x + 1) y
| otherwise = (show x) : fizzbuzz (x + 1) y
なんかすごくHaskellっぽいコードを書けたような気がするんだけどどうだろう?少なくとも、依然書いた↓のfizzbuzzよりは手続き色が抜けてるんじゃないかな?
XREAのサーバーにMovable Typeを導入するというのは何回もやってきたことなのだが、今回はSSHを使ってやってみた。シェルをほとんど使ったことがなかったから苦戦したが、以前よりもかなり早く導入できるようになった。
今までは、シェルを知らなかったから、↓のようなすごく非効率的なことをやっていた。
今回はXREAのサーバーにSSHで接続してやってみた。
例えば、数値を分数のまま四則演算する有理数クラスが↓のようになっていたとします。
public class Rational {
private int numerator = 0;
private int denominator = 1;
public Rational(int numerator, int denominator) { ... }
public Rational add(Rational x) { ... }
public Rational subtract(Rational x) { ... }
public Rational multiply(Rational x) { ... }
public Rational divide(Rational x) { ... }
}
当然、このクラスを使う側では↓のようなコードを書くわけですね。
Rational add(Rational x, Rational y) {
return x.add(y);
}コンパイラ関係の本を読んで勉強したくて、大学の図書館で探してみた。
とはいうものの、文系単科大学の図書館だからコンパイラ関係の本など探してもほとんどない。
やっとの思いで見つけたのが↓。
1981年刊行とのことだったが、とりあえず借りてみた。
↓貸出期限票を見たところ、俺は20年の眠りを醒ましてしまったらしい。

しかし、目次を見てみると、用語や内容は現在と大きくは変わらないっぽい。言語処理系の本は古い本ほど良いという話は本当だったんだな。
TeXでアームド・レモンというフォントを使えるようにするために使ったバッチファイルをメモ。アームド・レモンのTTFファイル(ArmedLemon.TTF)はC:\WINDOWS\Fontsにインストール済み。
@echo off set FONT=ArmedLemon set TEXDIR=C:\LaTeX set FONTDIR=%TEXDIR%\share\texmf\fonts copy "%FONTDIR%\tfm\ptex\jis.tfm" "%FONTDIR%\tfm\ptex\%FONT%.tfm" cd "%FONTDIR%\vf\ptex" "%TEXDIR%\bin\makejvf.exe" "%FONT%" "%FONT%" move "%FONT%.tfm" "%FONTDIR%\tfm\dvips" echo %FONT% H %FONT%.ttf>>"%FONTDIR%\map\dvipdfm\base\cid-x.map" "%TEXDIR%\bin\mktexlsr.exe"
PDFで表示するだけならこれだけで充分っぽい。なぜこれで充分なのかはまだわかっていない。時間と余力があるときに解説エントリを書ければいいなと思っている。
「LaTeX で多書体 --- 任意のフォントを扱う方法」というサイトを参考にした。
以前、DocBookで文系論文を書いてみるというようなこと言っていたが、結局それは断念してしまった。FOPの日本語組版のレベルが低すぎて使い物にならない上に、DocBook XSLも基本的には英語圏向けであまり日本語環境に向いているとは言えなかったから。なので、結局はTeXを使ってレポートを書くことにした。今さらTeXというのも古臭い感じがして嫌なのだが、他に良い選択肢がないので仕方がない。
ということで、今度はWindows XP上にLaTeX環境を構築するにあたってのメモ書きを残しておこうと思う。
ちなみに、TeXに入門するまでの間に、86世代の人たちにだいぶお世話になった。この場を借りて感謝。
前回までで、一応XMLファイルをXSLを使ってPDFに変換できる環境まではできたと思う。だから今日は、DocBook文書をXSLを使ってPDFに変換してみる。
ということで、やるべきことは以下の2点
ということで、順番に説明していく。