SML

改行しかしない

30分プログラム、その797。anarchy golf - Carriage no returnにインスパイアされました。 使い方 - no_return "abc\ndef"; val it = "abc\n def" : string ソースコード fun lines s = String.tokens (fn c => c = #"\n") s; fun unlines xs = String.conca…

文字を重複させる

30分プログラム、その791。anarchy golf - Duplicate charactersにインスパイアされました。 使い方 - dup_str "hello";; val it = "hheelllloo" : string ソースコード fun dup [] = [] | dup (x::xs) = x :: x :: dup xs; fun dup_str str = String.implod…

括弧の対応のチェック

30分プログラム、その782。anarchy golf - Bracket Matchingにインスパイアされました。 問題の詳細はリンク先を参照してください。要するに括弧の対応がとれているかどうかのチェックです。正規表現じゃ無理なことで有名なアレです。 簡易パーサコンビネー…

縦書き出力

30分プログラム、その777。anarchy golf - Vertical writingにインスパイアされて縦書き出力をやってみました。 使い方 - run "Hello"; H e l l o ソースコード fun interperse x [] = [] | interperse x (y::ys) = y::x::interperse x ys; fun vertical s =…

二進数変換

30分プログラム、その770。整数を二進数に変換してみる。 SMLには右シフトとかのビット演算ないらしく、ちょっととまどった。 使い方 - bits 0; val it = [0] : int list - bits 3; val it = [1,1] : int list - bits 2; val it = [1,0] : int list ソースコ…

でかいXを出力する

30分プログラム、その756。 anarchy golf - Xにインスパイアされて、でっかいXを出力してみました。 使い方 - print (x 3); x x x x x x x x x x x x xval it = () : unit ソースコード open String; fun repeat _ 0 = [] | repeat c n = List.tabulate (n, …

チェックサムの計算を目指した何か

30分プログラム、その749。チェックサムの計算をしようといて失敗しました。 wikipedia:チェックサムによると、チェックサムは「各ワードの合計の下位nビット」の合計として定義されています。 が、これを勘違いして「全ワードの合計の下位nビット」だと思っ…

円周率を求めてみる

30分プログラム、その743。今日3/14は円周率の日らしいです。というわけで、円周率を求めてみました。 計算式は円周率の計算 - みずぴー日記で使ったやつと同じです。 直接計算するのは芸がないので、無限ストリームを定義して、その上でだんだんと精度が上…

HQ9+のインタプリタを作ってみた

30分プログラム、その737。HQ9+のインタプリタを作ってみました。 HQ9+の仕様はHQ9+ - Wikipediaを見てください。要するに、おどろくほど実用性ををもたないネタ言語です。 使い方 sml> run "HHQ+HQ++"; val it = "Hello,world!Hello,world!HHQ+HQ++Hello,wo…

破壊的なstack

30分プログラム、その729。破壊的なstack。 SMLの参照型ってどうやって使うのか気になったので作ってみた。http://www.mpi-sws.org/~rossberg/sml-vs-ocaml.htmlによるとmutableレコードはないらしい。 使い方 - val s : (int Stack.t) = Stack.make(); val …

10000以下の完全数を求める

30分プログラム、その721。10000までの完全数をもとめる(Haskell)にインスパイアされました。 元々は、mixiにあった問題らしいです。 使い方 - perfects 10000; val it = [0,6,28,496,8128] : int list ソースコード fun id x = x; fun range n = List.tabul…

ならしコストによるキュー

30分プログラム、その715。ならしコストによるキューを作ってみる。 基本的にならしコストによるQueueを実装した - みずぴー日記の焼直しです。むしろ、いくつかの関数の実装をさぼってます。あと、いまさらながらhttp://www.mpi-sws.org/~rossberg/sml-vs-o…

yesコマンド

30分プログラム、その707。yesコマンドを作ってみた。 yesコマンドというのは、延々とyesを出力し続けるコマンドです。一般的なUnixシステムならインストールされているはずなので、ターミナルでyesと打てば使えるはずです。 非常に簡単に作れちゃうんですが…

いつ、どこで、誰が、何をしたジェネレータ

30分プログラム、その699。いつ、どこで、誰が、何をしたジェネレータ。 ランダムに文章を生成するよ! Printfがとっても欲しいよ! 使い方 昨日、海でキミが寝たval it = () : unit - println (make ()); 昨日、地の中で知らない人が食事をした val it = () :…

2分木

30分プログラム、その689。ML系の言語といえばバリアント、バリアントと言えば木構造なので、2分木を作ってみました。 そのうち、B木とかに拡張できたらいいね。 使い方 - val t = List.foldl (curry insert) empty [10,3,1,4]; val t = Branch (10,Branch (…

シーザ暗号

30分プログラム、その683。シーザ暗号化をやってみました。 シーザ暗号がなんぞやかは、シーザー暗号 - Wikipediaを参考にしてください。 使い方 (* 3文字ずらす * - val (f,g) = make 3; val f = fn : string -> string val g = fn : string -> string (* …

リストのシャッフル

30分プログラム、その676。リストのシャッフルをやってみました。 簡単に書けると思いきや、意外と落とし穴にはまりました。 乱数が生成できない! FAQによると、Randomというアンドキュメントなstructureがあるらしい。 List.sortがない。 自分で書いた。 fs…

自分で遅延リストを作って、素数計算

30分プログラム、その668。自分で遅延リストを作って、素数計算をしてみました。 明日、研究室で発表をしなければいけないことを考えてると憂鬱になるので、素数を数えるコードを書いてみました。こういう無心で書けるコードは心が落ちつくので、わりとあり…

2人の相性度は? (EPOCH@まつやま - 本選3)

30分プログラム、その660。http://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_219より。 SMLはまだまだ不慣れなので、これくらいがちょうどいいです。 使い方 - friend "Alice" "Bob"; val it = 5 : int ソースコード fun toNum c = Char.ord (Char.t…

ln2を計算しよう

30分プログラム、その656。ln2を計算してみよう。 SICPによると、らしいです。本来は無限ストリームを使って解く問題ですが、今回は有限の長さのリストを使っています。そのせいで、第何項までで計算するかを指定しなければいけません。 無限ストリームを使…

SMLで階乗

30分プログラム、その640。SMLで階乗を書いてみた。 StandardMLは学部の授業で習ったけれども、一切記憶に残っていない。 さすがにそれはまずい気がするので、当時の教科書(プログラミング言語StandardML入門)をひっぱりだして、階乗のコードを何個か書いて…