lisp

Nbitサインな値を変換する

16進数を普通にparseするとunsignedな値に読めてしまうので、signedな値に変換する。 (defun gain-signedness (num &optional (bits 32)) (if (<= (expt 2 (1- bits)) num) (- num (expt 2 bits)) num))

2点を通る直線、直線と点の距離

(defun def-line (p1 p2) "2点を通る直線を定義する。 2点 p1(x1 y1) p2(x2 y2) が与えられたとき、ax + by + c = 0 を満たす(a b c)を返す。" (let ((x1 (car p1)) (y1 (cadr p1)) (x2 (car p2)) (y2 (cadr p2))) (list (- y2 y1) (- x1 x2) (- (* x2 y1) (…

文字列から数字だけ抽出する

(defun nums-string (str) (let ((s 0) res) (while (setq s (string-match "[0-9]+" str s)) (push (parse-integer (match-string 0)) res) (incf s (length (match-string 0)))) res)) (nums-string (get-clipboard-data))

各種ソート

ソートの動作を良く知らなかったので勉強。bubble-sort以外はM.Hiroi's Home Page / xyzzy Lisp Programmingから。ほぼ写経。bubble-sortは破壊的に動作し、他は新しくリストを作るので非破壊的。そのかわりコンシングが多い。 (defun bubble-sort (lst &opt…

順列の列挙

順列を列挙する関数が野暮用で必要になったが、すぐに書けなかったので書き方を調べた。要素を木構造にして深さ優先探索(DFS)で書けば良いらしい。簡単だね! (defun permutation (args &optional num head res) (labels ((iter (args num head res) (if (an…

レーティングランキングを作る

人の強さを1つの指標で表したい。そういった欲求はドラゴンボールの戦闘能力や、筋肉マンの超人強度にも見て取れる。 ただ、数値が何倍だから何倍強い、といった数値を決めるのは難しい。実際に使われている指標はチェスや将棋のレートのようなものだ。これ…

関数のインポートって

正確には関数を示すシンボルのインポートだけれど、これを行うと、インポート先で関数を再定義すると、エクスポート元の関数まで上書きされてしまう。 実際、こういう動作をしたい場合もあるかも知れないが、普通は行わない。また、インポートした後で定義が…

やったー、肉抜きできたよー。

元マクロ:普通のタイマー - 象徴ヶ淵 (defmacro counter-default (slots resets &optional (defaults nil sv)) (let ((f (lambda (l l2 &optional l3) `(if (null ,(car l)) (if (or ,@(cdr l)) (setq ,(car l) ,(car l2)) ,(if l3 `(setq ,(car l) ,(car l…

データ解析作業のためのlisp

データ解析の一般的な流れは知らないが、xyzzyのlisp-interaction-modeで次のように作業している。 データを読み込む データを操作して特徴量などを計算し、変数に記録する 計算した結果を比較したりプロットしたりする 時間のかかる計算でも、結果を保存し…

max min にkeyがない件

sortとかfindにはkeyが付き物なのに、なんでmax minは数値にしか対応していないのか。大体全然汎用性がないじゃん、と思った。このくらい無いわけがないが、探すのも面倒なので書いた。 (defun most (sequence predicate &key (key 'identity)) (let ((res (…

コンプガチャと銀のエンゼル

複数種類のカードを集める(コンプガチャ)のと、同じカードを複数集める(銀のエンゼル)のはどっちが大変なの? ということを確めてみる。 どちらも公平に、1種類あたり100枚に1枚の確率で引けるとしよう。必要な枚数(種類)を変えて、それぞれ何枚引けば揃えら…

タブ幅より長い項目を詰めたい

何かデータを出力するとき、見やすいように整形して出力するのは割と面倒である。 タブはその手間を軽減してくれるが、タブより長い項目があると表示が崩れて読みにくい。 そこで、たまに長いデータが入るような表を簡単に見やすくするために、タブ幅より長…

たらい回し関数の速度比較

aviutl拡張編集がLuaを使っているから、というだけで何となくLuaに手を出してみた。意外と簡単だし、実行速度も速いと感じたので、xyzzy lispと比較してみる。 せっかくなので、c++とも比較してみたいと思い、ベンチマーク用に適当なたらい回し関数を利用す…

ピカチュウのセリフをマルコフ連鎖で生成する

ピカチュウのセリフがどういった構造かよく知らないが、想像の範囲でそれらしいものを生成してくれるジェネレータを作ってみた。生成には教科書的な単純なマルコフ連鎖を使っている。現在の状態から、既知の確率で次の状態に遷移する。それだけだと文の切れ…

abbrevってわざわざ展開する必要があるんでしょうか。

abbrev展開しない方が見やすいんじゃないかとかねがね思っていました。 (defmacro abbr (((abbr long-expression &rest nsubst-conditions) &rest more-args) &body body) (dolist (args (list* (list abbr long-expression) more-args)) (setq body (apply …

独自マクロを気兼ねなく使う

リーダマクロは他に与える影響が大きいので、エディタのスクリプトとして動いているxyzzy上では使いにくい。 しかし、使わないのではもったいないので、うまく使う方法を考える。 リーダは*readtable*に定義されているので、自分のコードを読み込むときだけ*…

もっとオブジェクトっぽく書きたい!

オブジェクトっぽく書きたい! - 象徴ヶ淵は実際のところ使っていなかった。 ちょっと問題点があるのである。 (defmacro radical-macro (var arg) `#[,var car cdr cddr car (setf ,arg)]) | error: ‘,’がバッククオート構文以外に現れました 調子に乗って、…

windowsのファイル名ソートっぽいの

数字の大きさ順に並ぶとかいうアレ。一般的な名称は知らない。実装してる関数も知らないので書いた。 (defun filename< (p1 p2) (while (and (not (equal p1 "")) (not (equal p2 ""))) (let* ((a (string-match "[0-9]+" p1)) (m1 (match-string 0)) (b (st…

数値を整形とか何とか

TeXでまともな資料を作ろうとすると、数値をちゃんと整形する必要がある。数値の大きさと精度により、適切な書式で書かなければならないのだが、これを手作業で行うのは面倒である。そこで、適当に整形してくれる関数を作ってみた。 (defvar *significant-fi…

行列をヒストグラムで描きたい!

例えば、 1 2 3 4 5 6 7 8 9 10 11 12というようなデータをgnuplotでグラフ化したい。 splot "data1" matrix with pm3d で描画させるとこういう感じになる。違う。違うんだ。離散値だからヒストグラムにして欲しいんだ。つまり、3次元の棒グラフを描きたい.…

2次割り当て問題の解を評価する(2)

というわけで、評価関数をc++で書くことにした。適当に書いて100000回計算させて360ms。xyzzy上での344倍の速度である。ここまで差があると、xyzzy上で走らせるのはもったいない・・・。 しかし、探索アルゴリズムをlispで試したい。そこで、c++でdllを作っ…

2次割り当て問題の解を評価する(1)

2次割り当て問題(QAP)は巡回セールスマン問題と似たようなNP困難な問題である。QAPで検索すれば出てくるけど、大雑把にいうと、物資の移動量(流量)×距離がシステム全体で最小になる配置を探す問題だ。答えが分かっている問題例はQAPLIB Home Pageで得られる…

第1種スターリング数とパスカルの三角形

第1種スターリング数とパスカルの三角形も第2種スターリング数と同様に書ける。この形式ではパスカルの三角形が最も基本的な形になるだろう。 (defun stirling-1st-kind-line (&optional lst) (do ((1-n (- 1 (length lst))) (b lst (cdr b)) (x 0 (car b)) …

第2種スターリング数をO(nk/2)で求める関数

第2種スターリング数S(n,k)は、n個の区別できる要素をk個の集合(区別できない箱)にまとめる場合の組合せの数を表す。主な注意点は以下の通り。 n=0のとき、0組に分ける場合が1通りで、それ以外が0通りになる。 n>0のとき、0組に分けられないので、k=0では0通…

第2種スターリング数とフィボナッチ数

第2種スターリング数を求める関数を書いていた。 ;n<20程度にする (defun stirling-2nd-kind (n k) (cond ((= n k) 1) ((zerop k) 0) ((< n k) 0) (t (+ (stirling (1- n) (1- k)) (* k (stirling (1- n) k)))))) これだと,多重再帰となって非常に計算が遅…

誤差逆伝搬法

大学の課題でニューラルネットワークの誤差逆伝搬法*1による学習を作ったので載せてみる。課題自体はC++で作るものだが、適当に書く分にはlispの方がずっと楽である。C++で書いた方はひどいことになってるので載せない。 適当に書いたので、層とユニットの数…

dotimesの挙動

これは知らなかった。 (dotimes (a 10) (format t "~A " (incf a))) | 1 3 5 7 9 dolistで使っているリストは関係なし。 (let ((l '(1 2 3 4 5))) (dolist (a l) (format t "~A ~A " a (setq l (cdr l))))) | 1 (2 3 4 5) 2 (3 4 5) 3 (4 5) 4 (5) 5 nil

人材獲得作戦・試験問題を解いてみた

ネタ元は人材獲得作戦・4 試験問題ほか: 人生を書き換える者すらいた。 単純な経路探索なので、コピペすれば10分もかからないだろうが、なんとなく解いてみた。時間は記事を読み始めてから85分ほどかかった。ただし、xyzzy上で動くプログラムなので、要求は…

速度分布に応じた乱数生成

マクスウェルの速度分布は、定数を省略すると次のような形になる。 正規分布と比較すると、少し数値が大きい部分にせり出していて、平均に対して左右非対称である。ゲームでは正規分布に近い乱数を使うことが多いが、クリティカルボーナス(ある数値以上なら…

format慣らし。

「息吹」の辞書を、JIS X 208を止めて、頻度を元にして並び替えることにした。2打鍵字とは独立して、3打鍵字と4打鍵字を頻度を元に選択する。選択するのは良いのだが、これを辞書の形式に合わせて 亜唖阿哀愛挨逢葵茜悪握旭芦鯵梓圧扱宛姐飴絢綾鮎或粟安…