Scheme

コインの両替

30分プログラム、その804。コインの両替。 coin.scm - みずぴー日記に再チャレンジ。 使い方 gosh> exchange-coin ((2000 1) (100 1) (10 4) (1 2)) ソースコード #! /opt/local/bin/gosh ;; -*- mode:scheme; coding:utf-8 -*- (use util.match) (use gauch…

マージソート

30分プログラム、その802。 3年前のマージソート(http://d.hatena.ne.jp/mzp/20070421/msort)をまたやってみた。 使い方 gosh> (msort '(3 1 2)) (1 2 3) ソースコード #! /opt/local/bin/gosh ;; -*- mode:scheme; coding:utf-8 -*- (use util.match) (use …

Googolからの引き算

30分プログラム、その796。anarchy golf - Substract from a Googolにインスパイアされて、Googolからの引き算をやってみます。 きっと、32bitの整数しか扱えない処理系でやるとエキサイティングなんでしょうけど、Gaucheだとあっさりできてしましました。ス…

n日後の日付を調べるプログラム

30分プログラム、その789。n日後の日付を調べるプログラムを作ってみました。 EMチャージの30日定額の終了日が知りたかったので作ってみました。もっとも、作ったあとで管理画面で見れることを知りましたけれども。 使い方 $ gosh 789-after.scm 0 2010-08-0…

最小公倍数

30分プログラム、その780。 最小公倍数を求めてみました。 使い方 gosh> (lcm 3 2) 6 gosh> (lcm 21 6) 42 ソースコード #! /opt/local/bin/gosh ;; -*- mode:scheme; coding:utf-8 -*- (define (gcd x y) (if (= y 0) x (gcd y (modulo x y)))) (define (lc…

奇数

30分プログラム、その775。anarchy golf - odd linesをやってみます。 いつものごとく、ゴルフにはこだわりません。 使い方 $ jot 10 | gosh odd-line.scm 2 4 6 8 10 ソースコード #! /opt/local/bin/gosh ;; -*- mode:scheme; coding:utf-8 -*- (use util.…

条件付き確率の問題をモンテカルロ法で解く

30分プログラム、その768。http://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_269にインスパイアされました。こういう打ち切り所をカチっと決めれない問題は、無限リストを使ってやるのがいいですよね。 使い方 gosh> (calc 10) 0.6 gosh> (calc 100)…

最長のコマンド名を探してみる

30分プログラム、その763。最長のコマンド名を探してみます。 やっぱり、素数の計算とかよりかは実践的で楽しいです。 使い方 $ gosh longest-command.scm scrollkeeper-get-extended-content-list ソースコード #! /opt/local/bin/gosh ;; -*- mode:scheme;…

配列から最大値を検索する

30分プログラム、その755。配列から最小値、最大値を検索する - 素人がプログラミングを勉強していたブログにインスパイアされました。 書き始めてすぐに(apply max xs)でいいことに気づいてしまいました。が、それだとつまんないので、色々書いてみました。…

Phone Key Pad

30分プログラム、その745。anarchy golf - Phone Key Padをやってみました。 問題の背景がよく分かんないんですが、変換表に従ってアルファベットを数字に変換する問題らしいです。 使い方 gosh> (string->key-pad "Ruby") "7829" gosh> (string->key-pad "S…

回文素数

30分プログラム、その741。回文素数を求めてみる。 旅先の宿からこんにちは。ただいま旅行中につき、ほとんどネットワークにつなげません。というわけで、今日の30分プログラムは一切ぐぐらずに書いてます。かなりつらいですが、なんとかなるものですね。 Tw…

定規のようなもの

30分プログラム、その734。http://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_260にインスパイアされて、バールのようなもの、もとい定規のようなものを作ってみました。 stty -aで画面の幅を取得してるんですが、そのためには標準入力が端末につなが…

中置記法からS式への変換

30分プログラム、その727。中置記法からS式への変換。きっと中置記法から逆ポーランド記法への変換のノリでスタックをいい感じに使ってやればできる気がします。ただ、そのやり方を思い付けなかったので、再帰降下構文解析でパースしてます。 再帰降下型パー…

ファレイ数列

30分プログラム、その720。mixiの課題コミュニティからのインスパイアです。 趣旨としては、wikipedia:ファレイ数列を生成せよ、という問題です。Wikipediaのページの中盤に書いてある中間数を利用します。 使い方 gosh> (map frac->string (farey 1)) ("0/1…

年齢の計算

30分プログラム、その713。http://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_246にインスパイアされて、年齢を計算する簡単な式を実装してみます。 Schemeは暗黙に文字列を数値に変換してくれないので、awkやPHPほど簡単な式ではありません。 使い方…

vectorを使ったスタック

30分プログラム、その706。Gaucheのvectorの使い方を調べるついでに、スタックを書いてみました。 gacuhe.arrayよりも使いやすいね。 使い方 (define s (make-stack 10)) (stack-push s 1) (stack-push s 2) (stack-push s 3) s (stack-top s) ;; => 3 (stac…

ハッシュテーブルを作ってみた。

30分プログラム、その698。データ構造を作ってみたシリーズ、ハッシュテーブルを作ってみた。 「ハッシュテーブルをハッシュと略すのは、ウィキペディアをウィキと略すのと同じだ」で同じみのハッシュテーブルです。「組込みのhashなんていらないぜ。自分で…

/dev/randomから読み込むプログラム

30分プログラム、その688。/dev/randomから読み込むプログラム。聞くところによると/dev/randomは無限に乱数が書いてある(ように見える)ファイルらしいです。 聞いたことはあっても試したことがないので、読み込むプログラムを作ってみました。数字を延々と…

let*と名前付きletをマクロで

30分プログラム、その681。let*と名前付きletをマクロで書いてみました。 輪講のためにSICPの演習問題を解いてたら、「let*と名前付きletをコード変換で実現しろ」というのがでてきました。 そのとき、パターンマッチが使えなくてフラストレーションが溜りま…

リストの上で集合っぽい演算

30分プログラム、その674。リストの上で集合っぽい演算を定義してみました。 みなさん、知ってます? Rubyって配列を集合みたいに扱えるんです。 >> [1,2,3] - [3,4,5] => [1, 2] [1,2,3] & [3,4,5] => [3] >> [1,2,3] | [3,4,5] => [1, 2, 3, 4, 5] ホントの…

四則演算しかできないeval

30分プログラム、その669。四則演算しかできないevalを作ってみました。 今日、輪講資料を作るためにSICPを読んでました。かの有名な"超言語抽象"の章です。で、そこを読んでたら、evalを書きたくなったので書いてみました。 ちゃんとLispを実行できるevalは…

各要素に平等なconcat

30分プログラム、その667。各要素に平等なconcatを作ってみる。 リストの結合は(append xs ys zs)でできますけど、xsが全部登場したあとにysが始めて登場するので、ysやzsにはちょっと不公平です。具体的には、 ;; urlからファイルをダウンロードする関数 (d…

srfi-9のレコード型を試してみた

30分プログラム、その661。Gauche Users’ Reference: Topを試してみた。 今まで、Schemeで構造化されたデータが欲しいときはリストで表現してました。 (define (make-account name balance) (cons name balance)) (define account-name car) (define account…

ドント方式投票の計算

30分プログラム、その657。ドント方式投票の計算をやってみました。新聞を読んでいたら「ドント式投票は、より民意が反映される」という趣旨のことが書いてありました。"民意が反映される"の意味はよく分からないですが、とりあえずコードを書いてみましょう…

平方根の計算、再び

30分プログラム、その652。平方根の求め方の方法で、平方根の計算方法を試してみました。 「なんで奇数を引くんだよ。わけ解んねーよ」と騒いでたら、id:Roccoさん、別名@hi_saitoさんに、平方根の求め方というサイトを紹介してもらいました。というわけで、…

OCamlのGolfの問題をSchemeで解いてみる

30分プログラム、その648。Users Meeting - OCaml.jpのGolfコンペ用の問題(anarchy golf - Sum of Divisors for OCaml Golf Competition)が公開されました。 Golfにチャレンジするのは上記サイトでやるとして、せっかく問題があるんだから解いておきましょう…

gauche.arrayを試してみた

30分プログラム、その644。gauche.arrayを試してみた。 Schemeで配列ってどうやって扱うんだろう、とふと疑問に思ったので、gauche.arrayを試してみました。SRFI-25に準拠してるらしいので、ほかのSchemeでも大差ないでしょう、たぶん。感想は、 配列の開始…

ファイル末尾の空白行の削除

30分プログラム、その639。ファイル末尾の空白行の削除。 行末の空白行の次に、ファイル末尾の空白行って嫌ですよね。なんとなく。 というわけで、ファイル末尾の空白行を削除するスクリプトを書いてみました。ファイルをその場(in place)で書き換える機能は…

偶数行だけを抜き出してみる

30分プログラム、その635。anarchy golf - even linesにインスパイアされました。 ボクのコードは改行を削っても130バイトだけど、Golfでやると37バイトになってしまうらしい。おそろしい話ですね。 使い方 $ gseq 0 10 | gosh 635-evenline.scm 0 2 4 6 8 1…

自然対数の底eの計算

30分プログラム、その632。自然対数の底eを計算してみよう。 wikipedia:ネイピア数曰く、にx=1を代入することで計算できるらしい。 sumの計算をどうするかがポイントだろうけど、とりあえずutil.streamを使って計算してみた。 使い方 ;; 第100項までを使って…