Clojure

逆FizzBuzz問題

オートマトンっぽい問題なのは分かるけど、それを実装するのは面倒くさいので必要と思われる長さのFizzBuzzシーケンスを切り出して全チェックしてます。 与えられた「Fizz Buzz リスト」 の長さを len とすると、解が含まれる範囲は先頭から高々「7 + (len -…

partitionしてmapする関数

こんなのあったら便利かもしれない関数。 partition したシーケンスを map で処理したいということがたまにある。それを簡略できると楽なことがたまにはあるかも。 実は欲しかったのは (mapncat 2 f coll) のパターン。 下のようなコードを書きたくて作った…

Clojureでもクリスマスツリーを飾りました

この記事はClojure Advent Calendar 2011の13日目の記事です。一日+α 遅れましたが。シーケンス(リスト)でクリスマスツリーが作れるらしいので作ってみました。 ●元ネタ vallog: クリスマスツリーを飾りました。Lispで。 パラメトロン計算機: クリスマス…

seq と LazyList

window.twttr = (function(d, s, id) { var js, fjs = d.getElementsByTagName(s)[0], t = window.twttr || {}; if (d.getElementById(id)) return t; js = d.createElement(s); js.id = id; js.src = "https://platform.twitter.com/widgets.js"; fjs.paren…

F# で Project Euler 26 を解いたら遅かった

問題はこれ : Problem 26 ● F# での解答 何故か遅い。うちの環境だと 15秒以上かかる。 ideone.com で試したらやはり同じくらいかかっているようで、タイムアウトでプロセスを kill されてた。 recurringLength に 再帰回数が大きくなるような引数*1を与える…

emacs lisp にも clojure の ->> が欲しいよね

試しに書いてみたんだけど、これはいいかも... (require 'cl) (defmacro my:-> (&rest exprs) (when exprs (reduce '(lambda (acc expr) (if (listp expr) (cons (car expr) (cons acc (cdr expr))) (list expr acc))) exprs))) (defmacro my:->> (&rest exp…

not-empty には ? が付かない

理由は単純。評価結果が 真/偽じゃないから。 (empty? []) ;=> true (empty? [1 2]) ;=> false (not-empty []) ;=> nil (not-empty [1 2]) ;=> [1 2] not-empty の実装を見ると (defn not-empty "If coll is empty, returns nil, else coll" {:added "1.0"} …

左から適用される合成関数

F# の >> がClojureにも欲いですね。 Clojure では関数合成は comp を使いますが、comp で作った合成関数は、右から順に適用されます。 F#の e >> f >> g >> h が、Clojure では (comp h g f e) と書かなければなりません。でも、ソースコード読むときはなる…

「数字混じりソート」さらに改

昨日のコードを更に改造。 (use '[clojure.contrib.str-utils :only (re-partition)] '[clojure.contrib.core :only (-?>)]) (defn apply-flip [f a b] (f b a)) (defn parse [s] (->> (re-partition #"\d+" s) (apply-flip concat [nil nil]) (partition 2)…

「数字混じり文字列ソートをClojureで」を改良してみた

一昨日のコードがどうも納得いかなかったので改良しました。 元ネタはどう書く?.org 「数字混じり文字列ソート」 ;; clojure 1.2.1 (use 'clojure.contrib.str-utils 'clojure.contrib.core) (defn apply-flip [f a b] (f b a)) (defn parse [s] (->> (re-p…

数字混じり文字列ソートをClojureで

面白そうな問題見付けたのでやってみた。 数字混じり文字列ソート ~ Rubyとの血みどろの闘い ~ 元は、どう書く.org のちょっと前のネタみたい。 (use 'clojure.contrib.str-utils) (defn apply-flip [f a b] (f b a)) (defn prepare [n xs] (->> xs (re-part…

無限シーケンスから組み合わせ生成

組み合わせ生成関数(無限シーケンス対応版)を作ってみました。 ;; Ver.1 (defn- combinations* [xs combs] (when-first [x xs] (let [new-combs (map (fn [c] (conj c x)), combs)] (lazy-cat new-combs (combinations* (rest xs) (concat combs new-combs…

続・エラトステネスの無限の篩

本題の前に、前回のコードを少し書き換えた*1ので、まずはそちらから。 ♯エラトステネスの無限の篩 Ver.1 アルゴリズム上の変更点は倍数リスト*2を「n を除く n の倍数」ではなく、「n^2 を初期値とする n の倍数」にしただけです。 (defn- diff-seq [s1 s2]…

エラトステネスの無限の篩

♯エラトステネスの篩とは 一般にエラトステネスの篩(ふるい)というと求める素数の上限を決めてそれ以下の整数(2以上)から素数の倍数を消すことで素数を篩い出すアルゴリズムです。詳細はwikipediaに分かり易く書かかれていますのでそちらをどうぞ。 こ…

プログラミングHaskellのunfoldを3言語で

プログラミングhaskell 7章の練習問題にある unfold について。 ※Haskell 標準関数 unfoldr の話ではないです。 ●まず haskellで 本で提示されてるコード unfold p h t x | p x = [] | otherwise = h x : unfold p h t (t x) わかりにくいので、パラメータの…

1000以下の回文素数で最大のものを示す

1000以下の回文素数で最大のものを示せ 示してみる。 (use '[clojure.contrib.lazy-seqs :only (primes)]) (defn palindromic-number? [n] (let [v (vec (str n))] (= v (reverse v)))) (defn last-palindromic-prime-number [limit] (->> primes (take-whil…

tree-seq と flatten

◆tree-seq をちゃんと理解したい 理解していなかったのでいろいろやってみた。 (defn tree-seq "Returns a lazy sequence of the nodes in a tree, via a depth-first walk. branch? must be a fn of one arg that returns true if passed a node that can h…

4引数で partition

一見単純だけど色々お世話になってる便利な関数 partition。4引数で呼び出せるのをしらなかった。 (def a [1 2 3 4 5 6 7 8 9 10 11]) ;; 2引数 (partition 4 a) ;=> ((1 2 3 4) (5 6 7 8)) ;; 3引数 (partition 4 3 a) ;=> ((1 2 3 4) (4 5 6 7) (7 8 9 1…

Clojureで連番リストの歯抜け取得

古い記事ですが、ちょっと面白い問題なのでやってみた。=> 連番リストの歯抜け ■(partition 2 1) って便利 (defn pick-toothless [coll] (->> coll (partition 2 1) (remove #(= -1 (apply - %))) (mapcat (fn [[a b]] (range (inc a) b)))))(pick-toothless…

Clojure で棒読みちゃんクライアント再び

以前実験的に作りましたが、あれから色々コードの書きかたを憶えたので、もうすこしちゃんと書いてみました。アドバイスなどありましたら是非。 ■棒読みちゃんクライアントプログラム (ns bouyomi-client.core (:gen-class)) (defmacro create-ctor "デフォ…

整数を Java のバイト配列に変換する。

以下、試行錯誤した内容を順を追って書く。 急いで結論が見たい人は、ここへジャンプしてください。 ■整数をバイト列(シーケンス)へ変換 これはそれ程難しくない。方法はいろいろあると思いますがここでは末尾再帰で。 (defn byte-split [n] (loop [n n, col…

Clojureのマップ(連想配列)のキホン その1

2011年5月現在、最新Release版である clojure 1.2 を前提にしています。 ■マップの種類 Clojureのマップは三種類あります。repl等での表示は同じに見えますが型はそれぞれ違います。 (array-map :a 10 :b 20 :c 30) ;=> {:a 10, :b 20, :c 30} (hash-map :a …

Python で Clojure っぽい関数チェーン。

■便利なメソッドチェーンが欲しい。 Rubyならこんなに直感的なコード、 # ruby a = [1,4,3,2] p a.sort.reverse.map{|x| x.to_s}.join('-') Pythonだとイケてない。 # python a = [1,4,3,2] print '-'.join(map(str, reversed(sorted(a)))) 操作対象の a を…

require と use

Clojureで書かれた外部コードを参照する時、require や use を使います。ちょっとまとめてみました。使用しているClojureは 1.2.0-master-SNAPSHOTです。 require と use の違い 例えば、clojure.pprint 名前空間に定義されている、pprint という関数を使う…

Clojure 環境を 1.1 から 1.2 へ移行

leiningen と Clojure を同時に 1.2 へ移行してみた。 とりあえず作成中のプロジェクトの依存ライブラリを 1.2.0-SNAPSHOT とし、lein deps → lein compile。 コンパイルエラーになったのは、clojure.contrib.seq-utils の flatten と shuffle の2つの関数…

Clojureのコマンドライン引数解釈が特殊かも

プログラムに対して空白を含む文字列を与えたとき、C や Java ならばこうなります $ ./program '[1 2 3]' => "[1 2 3]" という文字列1つが引数しかし、Clojureだとこうなるみたいです。 $ ./program '[1 2 3]' => "[1" "2" "3]" という3つの文字列ひとつの…

ClojureとGStreamerで動画再生

はこべにっき#さんの記事を参考に Clojure バージョンを書いてみました。leiningen で作ったプロジェクトの lib ディレクトリに gstreamer と jna の jar を放り込むだけで動作しました。OS は Ubuntu9.10 です。 ミニマムコード (ns sample_gst.core (:imp…

clojureで棒読みちゃんクライアント

ニコ生等でお馴染の「棒読みちゃん」のクライアントプログラムを作ってみました。socket通信なのでネット越しに棒読みさせることもできます。 棒読みちゃんはWindowsのアプリですが、これを使えば仮想OSのLinuxからホストのWindowsで稼動している棒読みちゃ…

Clojureでイメージファイルのリサイズ

思ったより処理速度早かった。リアルタイムな処理中でも使えそう。 出力はJpegだけですが、ちょっといじれば拡張できます。ImageIOが対応している形式なら出力できると思う。 (ns resize-image (:import [java.awt.image BufferedImage] [java.awt Image] [j…

対応する括弧で閉じてくれる elisp

3種類の括弧の閉じ分けが面倒なので作ってみた。デバッグ不十分なので不具合あるかも。あと、ナローイングとか考慮されていません。 ;; 開き括弧 { or ( or [ に対応した閉じ括弧 } or ) or ] を挿入する (defun clj-close-sexp () (interactive) (let ((cl…