Scheme

Engadget JapaneseのHaruka Uedaさんがすごいらしいので調べてみた

id:Yuichirouが「最近のEngadget 日本版 : 最新ガジェットと家電、テクノロジーのニュースとレビューの記事は複数のひとが書いてるんですよ。で、そのなかでもHaruka Uedaさんが主宰者のIttousaiさんに迫る勢いで記事を書いてるんですよ。実際にどれぐらいの…

Schemeでuniq -- 隣り同士で重複してる要素を消す

30分プログラム、その625。隣り同士で重複してる要素を消すほうのuniqを作ってみる。リスト中の全重複を消す関数もuniqとか呼ぶけど今回作ったのは、隣り同士の重複を消すだけのやつ。全重複を消すほうのやつは昔やったからね。 http://d.hatena.ne.jp/mzp/2…

ClojureのcondをSchemeでも使いたい

30分プログラム、その621。ClojureのcondをSchemeでも使いたい。ClojureのCondは余計な括弧を省略できるらしいです。 (define (f n) (cond (even? n) "this is even" (odd? n) "this is odd")) 括弧が本当に余計なのかどうかはよく分からないけれど、とりあ…

金額と枚数を指定した両替

30分プログラム、その617。金額と枚数を指定した両替(本当に分からないので教えてください4 - C・C++・C# 締切済み| 【OKWAVE】)をやってみよう。 金額と枚数を入力する. 硬貨,紙幣の合計が入力金額,合計枚数が入力枚数になる場合を1つ見つけるプログ…

経路からツリーへの変換

30分プログラム、その614。昨日やっていたやつ(id:mzp:20090630:tree)の逆変換。一晩寝たら、すんなり解けた。 (foo) (foo bar) (foo bar baz) (foo xyzzy) (foo baz) みたいな木の根から末端までの経路リストがあったとする。これから、木を再構築したい。 …

Treeから経路への変換

30分プログラム、その613。Treeから経路への変換。例えば、こんな木があったとする。 (define *tree* (make-tree 'foo (make-tree 'bar (make-tree 'baz)) (make-tree 'xyzzy) (make-tree 'baz))) で、これから、根から各末端への経路のリストを求める。例え…

述語と比較関数の合成

30分プログラム、その611。Let Over Lambdaにのってた述語と比較関数を合成する関数が、おもしろかったので作ってみよう。 gosh> (sort '(1 2 3 4 5 6 7 8) (predicator-compare even? <)) (2 4 6 8 1 3 5 7) のように使うと、偶数と奇数でグループ分けしつ…

LOLのdefmacro!gをGaucheで

30分プログラム、その607。id:athosに影響されて、Let Over LambdaのマクロをGaucheで書いてみる。今回書くのはdefmacro!gというマクロ。これは、g!で始まるシンボルを自動でgensymにしてくれる。使い方は下に書いてあるのを見てください。 で、このdefmacro…

循環リストの判定

30分プログラム、その606。循環リストの判定をしてみよう。たしか昔、Common Lispの勉強をしてたときに判定アルゴリズムを読んだ気がする。 おっと、これだこれ。 循環リストのチェックは「うさぎとかめ」のアルゴリズムを使うと簡単です。「うさぎ」と「か…

名前付きletを試してみよう

30分プログラム、その601。名前付きletを試してみよう。 Let Over Lambdaを読んでたら「Schemeには名前付きletってのがあるんだぜー。うらやましいからマクロで作ろうぜ」と書いてあった。 「へー、そんなのがあるんだ」と思ったので試してみた。マクロの定…

今日は第何火曜日?

30分プログラム、その596。今日が第何火曜日かを調べるプログラム。 ウチのCATVターミナルは頭があまり良ろしくなくて、録画予約をするときは「第3火曜日の9:00〜」という指定しかできない。 というわけで、今日が第何火曜日かを調べる関数を書いてみる。あ…

16進数から10進数への変換

30分プログラム、その592。16進数から10進数への変換 via Haskellで遊ぶよ - haskell。 16進数を10進数に変換してください。 ただし、入出力は文字列とし、次の変換は最低必ずできなければいけないこととします。1. 0x12437308CCB6 →20080902065334 2. 0…

何秒前にさわったファイルなのかを調べる

30分プログラム、その586。何秒前にさわったファイルなのかを調べてみる。 おおむねhttp://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_129にインスパイアされてます。ただ、10秒より前かどうかを出力するのでなく、何秒前に触られたのかを出力するよ…

1-100までの素数

30分プログラム、その579。「何も見ずに、1-100までの素数を計算してみよう」という電波を受けとったので、やってみた。 思い付いたのを全部書いて、3つか4つぐらい作ってやるぜー、といきごんで始めてみたけど、2つしか書けなかった。 というか、そもそもエ…

円周率の計算

30分プログラム、その573。円周率を計算してみる。 SICP曰く の無限級数でπ/8が計算できるらしい。 無限ストリームを使って、だんだんと精度が上っていくπのストリームを作ってみた。 使い方 gosh> (stream-for-each print pi) 0.0 2.6666666666666665 2.895…

世界時計

30分プログラム、その566。世界時計 via エロと風俗情報満載 どう抜く?。 プログラムを実行した端末のロケールと、グリニッジ標準時と、ロサンゼルスの現在時刻をそれぞれ表示してください。時刻の表示はリアルタイムでなく、一回限りで構いません。時刻の…

MacBookのバッテリー残量表示

30分プログラム、その561。MacBookのバッテリー残量表示をしてみる。 Linuxなら/proc/acpi/battery/BAT1にバッテリーの情報が書いてあるけど、Macの場合はsystem_profilerで取得できるらしい。-xmlをつければXMLで出力できるけど、驚くほど構造化されていな…

レポジトリの状態をscreenのステータスラインに表示する

30分プログラム、その556。レポジトリの状態をscreenのステータスラインに表示する。 ボクは自分の書いた文章やら設定ファイルやらを~/cにつっこんで、gitで管理してる。青木さんのオレポータビリティをマネしてるんだけど。 でも、このレポジトリのコミット…

ディレクトリのTree表示

30分プログラム、その545。http://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_040あたりに触発されて、ディレクトリのツリー表示をやってみる。 末尾の処理をさぼったので、ちょっと表示表示が変。 +[a] | +--hoge | +[c] | | +--bar | +[b] | | +--f…

ドメインを逆順にしてみる

30分プログラム、その540。パッケージ名のようにドメインを逆順で表示してみる。 すんなり書けてしまったので、特にコメントはない。 使い方 gosh> (domain-rev "mzp.sakura.ne.jp") "jp.ne.sakura.mzp" ソースコード #! /opt/local/bin/gosh (define (domai…

一番長いファイル名は?

30分プログラム、その536。一番長いファイル名が何か調べてみる。 ファイルの一覧の取得はlsやfindに任せればいいので、文字列の長さによるソートをコマンドとして実装した。ネットワークがない環境で書いたので、infoやmanを駆使しようと思ったけど、さっぱ…

日本語ファイル名のファイルを探し出せ

30分プログラム、その530。日本語ファイル名のファイルを探し出すプログラム。 日本語ファイル名を持つファイルって、コマンドラインから操作するとき、とってもうざいですよね。ホントやめて欲しいものです。 とはいえ、ボクもうっかり日本語ファイル名のフ…

0から51の中から重複のない5つをランダムに選ぶにはどうしますか

30分プログラム、その526。0から51の中から重複のない5つをランダムに選ぶにはどうしますか - うんたらかんたらRuby - Rubyistをやってみる。 自分で配列をランダムに入れ替える関数を書いていたら、Gauche Users’ Reference: Topにshuffle関数を見つけた。…

要素をn回繰り替えしてリストを作る関数。

30分プログラム、その519。要素をn回繰り替えしてリストを作る関数。同じ文字列のn回繰り返しを作る最速の方法を探求してみた - muddy brown thangに影響を受けて書き始めたら、全然違うところに行ってしまった。元ネタは"Javascriptで文字列の結合はどうす…

ローマ字をひらがなに変換する関数

30分プログラム、その512。ローマ字をひらがなに変換する関数を書いてみた。 今日、b:id:banjunと"John"を"慈音"に変換できたらおもしろいんじゃね?みたな話をしてたので、とりあえずローマ字をひらがなに変換する関数を作ってみた。Schemeで。 本気でやるん…

クロージャでオブジェクト

30分プログラム、その505。ひさしぶりなので、簡単なやつからゆっくりと。 先延ばしにしてきた年金をそろそろ払わないといけないけど、MacBookAirを買ってしまってお金がない! というわけで貧乏人のオブジェクトこと、クロージャで銀行口座オブジェクトを作…

13日の金曜日を数える

30分プログラム、その449。http://gauc.no-ip.org/awk-users-jp/blis.cgi/DoukakuAWK_047より。元ネタはエロと風俗情報満載 どう抜く?らしい。 使い方 ;; 2008年には1回だけ gosh> (count-13-friday 2008) 1 ;; 2009年は3回ある gosh> (count-13-friday 200…

99の一覧

30分プログラム、その441。99の一覧を出力してみる。 どう書く.orgで、これと同じ出力をするプログラムを0-9の数字をソースコードに入力せずに作れ、という問題が出たといううわさを聞いた気がする。どうやるんだろう?チャーチ数的なことかな? それを30分で…

Schemeのdefineってレキシカルスコープじゃないよね

Schemeの場合 Schemeのdefineはset!と似た感じになるので、変数を2回defineすると最初の値が変わる。 (define x 1) (define (f) x) (define x 2) (print (f)) ;; => 2 OCamlの場合 で、みんな大好きOCamlの場合は、二回letしても最初の値は変わらない。 let …

ローマ数字を整数に変換

30分プログラム、その435。ローマ数字を整数に変換してみる。 またもmixiの課題コミュからぱくって、ローマ数字計算機の前段階のローマ数字の変換部分を作ってみた。 簡単だと思いきや、割と難しい。こんなんを常用していた昔のひとはすごいと思う。 使い方 …