[表示 : 全て 最新50 1-99 101- 201- 301- 401- 501- 601- 701- 801- 2chのread.cgiへ]
Update time : 04/21 19:13 / Filesize : 249 KB / Number-of Response : 867
[このスレッドの書き込みを削除する]
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧] [類似スレッド一覧]


↑キャッシュ検索、類似スレ動作を修正しました、ご迷惑をお掛けしました

【入門】Common Lisp その3【質問よろず】



1 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 21:41:07 ]
lispを触ってみたい入門者のQ&A
初心者のQ&A
本スレでは恥ずかしくて聞けない人のQ&A
本スレは高度すぎて割り込めない人のQ&A
linuxでなくてwindowsでやりたいんですが・・・Q&A
lispを使用してC#やJAVAの代替にするための方法(おまけ)

ま、ゆっくりたりましょう。

「いいものの本質は、いかなる時代においても変わらない」byパワーズ

(list
(url pc8.2ch.net/test/read.cgi/tech/1101386936/l50 :part 1)
(url pc11.2ch.net/test/read.so/tech/1140012484/l50 :part 2))


2 名前: ◆3.JjF77I26 mailto:sage [2007/06/10(日) 23:08:04 ]
2get

3 名前:デフォルトの名無しさん mailto:sage [2007/06/10(日) 23:51:57 ]
(apply #'乙 (>> 1))

4 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 00:12:46 ]
((お勧めの Common Lisp 処理系)
(SBCL: sbcl.sourceforge.net/
:プラットフォーム UNIX, Linux, Mac, Windows(移植中)
:開発 活発
:日本語 使える(UCS4, UTF8, EUC)
:特徴 一番お勧めのコンパイラ。)

(CLISP: clisp.cons.org/
:プラットフォーム UNIX, Linux, Mac, Windows
:開発 そこそこ活発
:日本語 使える
:特徴 バーチャルマシン。遅いがフットプリントが小さい。)

(CMUCL: www.cons.org/cmucl/
:プラットフォーム UNIX, Linux, Mac
:開発 そこそこ活発
:日本語 使えない(回避法有り)
:特徴 高速コンパイラ。SBCL の元になった。)

(OpenMCL: openmcl.clozure.com/index.html
:プラットフォーム PPC-Linux, Mac, x86-Linux と FreeBSD に移植中
:開発 そこそこ活発
:日本語 使えない (pre ver 1.1なら多少扱える。)
:特徴 元々商用のコンパイラ。ネイティブスレッドが使える。))

5 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 00:14:29 ]
((その他)
(ABCL: armedbear-j.sourceforge.net/
:特徴 JavaVM 上で動く。JavaVM のバイトコードを生成。)

(GCL: www.gnu.org/software/gcl/
:特徴 日本発 Kyoto Common Lisp の直系。)

(ECL: ecls.sourceforge.net/
:特徴 Lisp->C コンパイラ。組み込み可能らしい。こちらもKCLの系譜))

6 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 00:22:38 ]
ANSI Commn Lisp 仕様関係
www.lisp.org/HyperSpec/FrontMatter/index.html
www.cs.cmu.edu/afs/cs.cmu.edu/project/ai-repository/ai/html/cltl/cltl2.html
lispdoc.com/

日本語のチュートリアル
ttp://web.sfc.keio.ac.jp/~t02064si/lisp2005/
ttp://www.h7.dion.ne.jp/~matsu/feature/common-lisp/index.html
ttp://www.geocities.jp/m_hiroi/xyzzy_lisp.html
ttp://home.soka.ac.jp/~unemi/LispProlog/
ttp://www.haun.org/kent/lisp1/
ttp://wisdom.sakura.ne.jp/programming/lisp/index.html
ttp://www-kasm.nii.ac.jp/~takeda/lectures03/titech/ai1/Text/CL.txt



7 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 00:24:18 ]
進んだ話題が欲しい人に...
(和文)
ttp://www.geocities.co.jp/SiliconValley-SanJose/7474/index.html
ttp://www.geocities.co.jp/SiliconValley-Cupertino/2478/root-sect-2.html
ttp://lispuser.net
(英文)
wiki.alu.org:80/
www.cl-user.net
www.common-lisp.net
planet.lisp.org/
groups.google.co.jp/group/comp.lang.lisp
www.cliki.net/index
cl-cookbook.sourceforge.net/
www.gigamonkeys.com/book/
( www.apress.com/free/ よりpdf版が入手可能)
www.psg.com/~dlamkins/sl/cover.html
www.cs.cmu.edu/~dst/LispBook/index.html

その他の情報
ja.wikipedia.org/wiki/Common_Lisp

8 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 00:26:37 ]
((おまけの処理系
(POPLOG: www.cs.bham.ac.uk/research/poplog/freepoplog.html
Lisp, Prolog, ML のコンパイラ)
(WCL: wcl.kontiki.com/
Shared Library として使える Lisp)
(Movitz: common-lisp.net/project/movitz/movitz.html
フルスクラッチの Lisp OS)
(CADR LispM: www.heeltoe.com/retro/mit/mit_cadr_lmss.html
MIT で使われていた LispM のソースを公開したもの))

((その他のリンク
(Meme channels: meme.b9.com/start.html
Lisp の IRC Log)
(Paul Graham の ANSI Common Lisp:
www.pearsoned.co.jp/hed/search/onlinecatalog.html?id=276
Common Lisp の 参考書を探しているならこれ一択))

9 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 00:29:13 ]
テンプレコピー終了。lispdoc.comや洋書pdf/hpをくわえた。あとは、on lisp
が和書として登場した事も記しておかないと。

10 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 00:38:53 ]
乙。
テンプレに Allegro って入ってないのね。商用だから?




11 名前:デフォルトの名無しさん mailto:sage [2007/06/11(月) 00:44:52 ]
触った事がないからくわえ忘れた。
商用CL
jp.franz.com/index.html
free downloadから登録して使えるらしい
www.lispworks.com/downloads/index.html
IDEがついているらしい

12 名前:デフォルトの名無しさん [2007/06/11(月) 01:53:11 ]
┌────────────┐
|scheme自重しろww ちょww|
|   ↑自重(ry             |
|ーかそれはないだろww    |
|                  |
|                  |
|                  |
|   リリカルは俺の嫁。   .|
└────────────┘

13 名前:デフォルトの名無しさん [2007/06/13(水) 03:41:07 ]
すいません、明日提出の課題で完全に煮詰まってしまってもう何も浮かんできません
どなたか教えていただけないでしょうか

14 名前:デフォルトの名無しさん [2007/06/13(水) 03:42:31 ]
どうぞ。

15 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 03:43:21 ]
ありがとうございます。

16 名前:デフォルトの名無しさん [2007/06/13(水) 03:44:03 ]
はやくしろ。

17 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 03:45:50 ]
まだか?

18 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 03:46:37 ]
やっぱりもう寝る。
俺のほかにも、少なくとも1人居るみたいだから任せた。

19 名前:デフォルトの名無しさん [2007/06/13(水) 04:07:51 ]
申し訳ありません!お待たせしました

9
(1 1 1 1 1 1 1 0 1)
(1 0 0 0 0 0 0 0 1)
(1 0 1 0 1 1 1 0 1)
(1 0 1 0 0 0 1 0 1)
(1 0 1 1 1 0 1 0 1)
(1 0 1 0 0 0 1 0 1)
(1 1 1 0 1 1 1 0 1)
(1 0 0 0 1 0 0 0 1)
(1 0 1 1 1 1 1 1 1)

上記のようなデータが入ったテキストファイルを読み込んで、迷路を解くという問題です
最初の数字が迷路のサイズを表していて、ここでは9なので9*9です
1が壁、0が道となっています



20 名前:デフォルトの名無しさん [2007/06/13(水) 04:09:07 ]
次の手順を追って作成するようになっています

a.迷路ストラクチャを定義せよ.迷路ストラクチャは,迷路のサイズ(整数値)と迷路の形状データ(2次元配列)を保持する

b.迷路ファイル名を引数に受け取り,それを読み込み迷路ストラクチャを返す関数 load-maze を定義せよ
>(load-maze "m9.txt")
#S(MAZE SIZE 9 DATA
#2A((1 1 1 1 1 1 1 1 1) (1 0 0 0 0 0 1 0 0) (1 0 1 1 1 1 1 0 1)
(1 0 0 0 1 0 0 0 1) (1 0 1 0 1 0 1 1 1) (1 0 1 0 0 0 1 0 1)
(1 0 1 1 1 1 1 0 1) (0 0 0 0 0 0 0 0 1)
(1 1 1 1 1 1 1 1 1)))





21 名前:デフォルトの名無しさん [2007/06/13(水) 04:10:06 ]
.迷路ストラクチャを引数に受け取り,迷路のデータを表示する関数 print-maze を定義せよ
>(setq m (load-maze "m9.txt"))
>(print-maze m)
■■■■■■■ ■
■       ■
■ ■ ■■■ ■
■ ■   ■ ■
■ ■■■ ■ ■
■ ■   ■ ■
■■■ ■■■ ■
■   ■   ■
■ ■■■■■■■

NIL

d.迷路データファイルを入力として受け取り,スタートからゴールまでの最短パスを出力する関数 solve-maze を作成せよ.プログラムがなるべく読みやすくなるよう作成すること
>(solve-maze "m9.txt")
■■■■■■■*■
■  *****■
■ ■*■■■ ■
■ ■***■ ■
■ ■■■*■ ■
■ ■***■ ■
■■■*■■■ ■
■***■   ■
■*■■■■■■■

Solved!
NIL

22 名前:デフォルトの名無しさん [2007/06/13(水) 04:11:17 ]
すいません、迷路が上手く書けませんでした

23 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 06:33:33 ]
まずは教官に「宿題をやってなかったので提出期限を一週間延ばしてください」と
お願いにいくところから始めよう。

24 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 07:01:01 ]
難しいな。
見た事あるけれど、たしか、プログラミングコンテストの問題だった気がする。
本があったかなぁ?

25 名前:デフォルトの名無しさん [2007/06/13(水) 07:10:08 ]
プロコンですか・・・解ける気が全くしないですorz

26 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 07:13:40 ]
朝っぱらから楽しげだなw
cl-user(142): (defstruct maze size data)
maze
cl-user(143): (make-maze :size 4 :data #2a((1 0 0 0) (1 0 0 0) (1 0 0 0) (0 1 0 0)))
#S(maze :size 4 :data #2A((1 0 0 0) (1 0 0 0) (1 0 0 0) (0 1 0 0)))
経路探索はこのデータ構造じゃ面倒臭い気がするけど、
>>6 の hiroi 氏のページ見たら何とかなるんじゃね?

27 名前:デフォルトの名無しさん [2007/06/13(水) 07:30:29 ]
発狂hiroiさんのページを見せてもらったんですが、やっぱりダメみたいです

(1 1 1 1 1 1 1 0 1)
(1 0 0 0 0 0 0 0 1)
(1 0 1 0 1 1 1 0 1)
(1 0 1 0 0 0 1 0 1)
(1 0 1 1 1 0 1 0 1)
(1 0 1 0 0 0 1 0 1)
(1 1 1 0 1 1 1 0 1)
(1 0 0 0 1 0 0 0 1)
(1 0 1 1 1 1 1 1 1)

↑のデータをテキストから読んで、構造体の中の配列に入れることができないです・・・

28 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 07:41:47 ]
>>27
発狂って何?
read 関数はS式単位で読み込めるので何も難しいこと無いと思うが、、
さては授業まったく聞いてないな?w

おれは仕事行くけど誰かこの駄目学生見てあげて、気が向いたらでいいw

29 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 07:47:49 ]
授業料もったいねーなぁ。ところでスタートとゴールの定義がわからねーんだけど。
それぞれ座標固定でいいの?

(defstruct maze size data)

(defun load-maze (file)
(with-open-file (stream file :direction :input)
(let ((size (read stream)))
(make-maze :size size
:data (make-array (list size size)
:initial-contents (loop for data = (read stream nil :eof) until (eq data :eof) collect data))))))

(defun print-maze (maze &aux (size (maze-size maze)))
(loop for row below size do
(loop for col below size do
(princ (if (eq (aref (maze-data maze) row col) 1) "+" " ")))
(terpri)))

30 名前:デフォルトの名無しさん [2007/06/13(水) 07:48:09 ]
発狂しそうです
って書こうと思ってやめたんですけど、発狂だけ残ってましたw
お察しの通り授業全く聞いておりませんでしたorz
一行ずつ配列に追加していこうと思ったんですが、consみたいに配列に追加していく関数もないし、どうすれば良いかわからない状況です
お仕事前にありがとうございました!



31 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 07:50:44 ]
#include <stdio.h>
int W(int x ,int y);
int a[9][9] ={
{1,1,1,1,1,1,1,0,1},
{1,0,0,0,0,0,0,0,1},
{1,0,1,0,1,1,1,0,1},
{1,0,1,0,0,0,1,0,1},
{1,0,1,1,1,0,1,0,1},
{1,0,1,0,0,0,1,0,1},
{1,1,1,0,1,1,1,0,1},
{1,0,0,0,1,0,0,0,1},
{1,0,1,1,1,1,1,1,1}
};
int main (void){
int hoge = 0;
hoge = W(1,1);
printf("%d¥n",hoge);
}
int W(int x, int y){
if(a[x][y]) return 0;
a[x][y] = 1;
return W(x,y-1)+W(x,y+1)+W(x-1,y)+W(x+1,y)+1;
}
C言語だけれど、できたじぇー。
コレをLISPに改造していけばOKなはず。
ちゃんと再帰を使ってるしね。
公立大学経済学部の力を見たカー!


32 名前:29 mailto:sage [2007/06/13(水) 07:52:16 ]
ほほう、近年稀にみる素直さだな。バレバレの嘘よりは好ましい。
はやくゴールとスタートの定義おしえてよ。急いでるんだろ?

33 名前:デフォルトの名無しさん [2007/06/13(水) 07:54:51 ]
>>29さんも>>30さんもありがとうございます
スタートが左下、ゴールは右上となっています

34 名前:デフォルトの名無しさん [2007/06/13(水) 07:56:17 ]
>>30じゃなくて>>31さんです、すいません!

35 名前:31 mailto:sage [2007/06/13(水) 08:18:07 ]
なんかダメダメっぽい。
一応考えを書いておくね。
もしa(x,y)が1ならば、行ける場所は0
そうでなければ、a(x,y)=1にして、周囲4近傍における合計値+1
それの再帰で行ける場所が求まるはずなんだけれど。

36 名前:デフォルトの名無しさん [2007/06/13(水) 08:37:01 ]
そうですか、でも>>29のところまででも凄いタメになりました!
ただ、loop for〜のくだりがこちらでは使えないんですが、どういうものなのか教えてもらえませんか?

37 名前:29 mailto:sage [2007/06/13(水) 08:42:30 ]
(defun solve-maze (maze &aux (start '(8 1)) (goal '(0 7)) (size (maze-size maze)) (buffer (make-array (list size size) :initial-element nil)) (path nil))
(labels ((calc-step (pos n &aux (x (first pos)) (y (second pos)))
(cond ((or (< x 0) (< y 0) (>= x size) (>= y size)) :skip)
((or (= (aref (maze-data maze) x y) 1) (aref buffer x y)) :skip)
(t
(setf (aref buffer x y) n)
(calc-step (list (1+ x) y) (1+ n)) (calc-step (list x (1+ y)) (1+ n)) (calc-step (list (1- x) y) (1+ n)) (calc-step (list x (1- y)) (1+ n)))))
(find-path (pos n &aux (x (first pos)) (y (second pos)))
(cond ((or (< x 0) (< y 0) (>= x size) (>= y size)) :skip)
((or (= (aref (maze-data maze) x y) 1) (null (aref buffer x y))) :skip)
((= (aref buffer x y) n)
(push pos path)
(find-path (list (1+ x) y) (1- n)) (find-path (list x (1+ y)) (1- n)) (find-path (list (1- x) y) (1- n)) (find-path (list x (1- y)) (1- n))))))
(calc-step goal 1)
(let ((n (aref buffer (first start) (second start))))
(cond ((null n) (error ">_<"))
(t
(find-path start n)
(loop for x below size do
(loop for y below size
for wallp = (= (aref (maze-data maze) x y) 1)
for step = (member (list x y) path :test #'equal) do
(princ (cond (wallp "+")
((null step) " ")
(t "*"))))
(terpri))
(write-line "Solved!"))))))


38 名前:29 mailto:sage [2007/06/13(水) 08:44:18 ]
途中で、経路複数とか考えるの止めたのでちょっと冗長だが…って、 LOOP がエラー?
環境は何なの?今時の Common Lisp で LOOP が無い環境なんてあるの?

39 名前:29 mailto:sage [2007/06/13(水) 08:46:02 ]
むしろ俺がそちらの環境を教えてくださいませんか?というキブン。

40 名前:デフォルトの名無しさん [2007/06/13(水) 08:47:13 ]
こんなに長いプログラム作ってくださって本当にありがとうございます
loopは大丈夫なんですけど、forのところで引っかかるみたいなんです



41 名前:デフォルトの名無しさん [2007/06/13(水) 08:49:04 ]
環境はGnu Common Lispというものみたいです

42 名前:29 mailto:sage [2007/06/13(水) 08:51:56 ]
だーから使ってる Lisp 環境を教えろって。それが古すぎるんじゃないか?
LOOP FOR ... は 20 年以上前の ANSI Common Lisp で規格に入った機能。それ以前の
処理系には LOOP FOR はない。(ただの LOOP はある)
CLISP, GCL, SBCL, ABCL, ECL, LispWorks, ACL で LOOP FOR が使えない環境なんてないぞ。
しぬほど古いバージョンの GCL でも使ってるのか?

43 名前:デフォルトの名無しさん [2007/06/13(水) 08:53:07 ]
死ぬほど古いバージョンのGCLのようですorz

44 名前:29 mailto:sage [2007/06/13(水) 08:58:26 ]
あれ? GCL か? -ansi オプションとかそんなんついていない?
うーむ。じゃあ do に直して使って。この書換えはなんか参考書とか教科書とか。

(loop for data = (read stream nil :eof) until (eq data :eof) collect data)

(do ((data (read stream nil :eof) (read stream nil :eof))
(lst nil (cons data lst)))
((eq data :eof)
(reverse lst)))

(loop for x below size do (princ x))

(do ((x 0 (1+ x)))
((>= x size))
(princ x))


45 名前:デフォルトの名無しさん [2007/06/13(水) 08:58:53 ]
といってもバージョンは(2.4.0)みたいです・・・

46 名前:デフォルトの名無しさん [2007/06/13(水) 09:05:40 ]
何から何までありがとうございます
今日の課題を出せば少し暇になるのでまた見直して勉強させて頂きます!

47 名前:29 mailto:sage [2007/06/13(水) 09:23:45 ]
せっかく払った授業料だ。元が取れるようにガンバレよ。今からならまだ遅れも取り戻せるだろう。
歩数マップを作って解く形式だったが、本当はスタートから辿っていくほうがいいのかもしれないなぁ。
別のやり方を考えてみるのもいいと思う。あとは 37 のイケてない所をチェックして直すとかね。

48 名前:デフォルトの名無しさん [2007/06/13(水) 09:54:53 ]
3・4週間前までは課題も楽しくできてたんですが、少し遅れてしまったようです
他の人のプログラムの書き方を見ることができたのは本当にためになりました
ありがとうございます!

49 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 11:51:29 ]
>>24
スタートとゴールがそれぞれ上と下にしかない &
Lispということを考えると再帰使って式書けばFizzBuzz並みに簡単だと思うがね。

50 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 12:01:09 ]
>>31 のコードは何をしてるのか気になる



51 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 16:08:44 ]
迷路を解く問題って非決定性のアルゴリズムを使う必要があるんじゃないの?
教官の狙いはa-bを解ければ合格でcを解いたらBランク。dを解いたらAランクの
評価を与えるのだろう。初心者が解けなくて当然だと思ってよいかもね。

授業で非決定性をやってるかどうか知らないけど、それ以外の方法も含めて
授業でやった事が大きなヒントになってるよ。スキームな人ならcall/ccを
使いそうな気がするね。clでもon lispをみればcall/ccはできる。

52 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 16:53:32 ]
しらみつぶしで簡単に求まる問題でしょ。非決定性なんて必要ないよ。

53 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 19:33:18 ]
>>51 は、自分の豊富な (と思ってる) 知識を披露しただけだろ。

54 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 20:04:03 ]
fizzbuzz並みに簡単かどうか別として、再帰を利用すれば解ける問題だった。
それは一応確認した。豊富な知識(と思ってる)のかしらないけど、
いろんな事は検討してみましたがね。

52や53のような輩にレスを返しても荒れるだけだったな。2ちゃんならではの
このての人種とは関わりたく無い
では失礼。

55 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 20:05:50 ]
日本人じゃなかったみたいだな

56 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:10:46 ]
何で list じゃなくて二次元配列なんだろ。
手抜きで C の課題をそのまま lisp にしたのかな?

57 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:15:25 ]
え??マップは二次元データだから二次元配列でいいじゃん。
ランダムアクセスするし。いちいちリストたぐるなんて無駄じゃん。
この例でわざわざリストを使うなんて CL としてはありえないだろう。

58 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:15:45 ]
縦と横の操作の対称性を考えると配列のほうがベターじゃね?
解くときはランダムアクセスが必要だろうから配列のほうが速いし

59 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:35:18 ]
>>57, 58
配列の方が早いのは勿論分かるけど、宿題レベルだと関係なくない?
>>27 なんてデータを配列に読み込むだけで挫折してるわけだし。


60 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 22:41:53 ]
簡単にできたら宿題の意味が無いかも



61 名前:31 mailto:sage [2007/06/13(水) 22:48:45 ]
>>50
>>>31 のコードは何をしてるのか気になる
えっと、斜めには進めないと考えて、
もしa(x,y)が1ならば、行ける場所は0(壁だから)
そうでなければ、a(x,y)=1にして、周囲4近傍における合計値+1
それの再帰で、最終的にマスすべてをしらみつぶしに調べて
行ける場所(進めるマスの総計)が求まる
はずなんだけれどなぁ、と深く考えずに書いてしまいました。
正直スマンカッタ。
でも、こんな感じの考え方を進めていけばいいんじゃないかなぁと思ったんです。

62 名前:デフォルトの名無しさん mailto:sage [2007/06/13(水) 23:44:57 ]
>>59
「配列の勉強に対する宿題かも」ぐらいの想像力があってもいいと思うんだが。

63 名前:29 [2007/06/14(木) 00:05:31 ]
……なんか荒れてるなぁ。で、他にネタもないので質問者が見てるかもしれないので軽く説明しとこう。
朝のプログラム歩数マップ(ゲームなんかで移動範囲がピコーンって光るやつみたいな)を作成してから、目的地へのルートを撰択するのね。
で、↓がスタート地点から総当たりでルートを探索してゆく(カベにぶつかったり戻ったりはナシのほうこうで)。
途中の通った経路をどんどん覚えていってゴールまでの全ルートを列挙。最後に最短のものを選ぶ。

(defun print-maze (maze &optional path &aux (size (maze-size maze)))
(loop for row below size do
(loop for col below size do
(princ (cond ((eq (aref (maze-data maze) row col) 1) "+")
((member (list row col) path :test #'equal) "*")
(t " "))))
(terpri)))

(defun solve-maze-2 (maze &aux (start '(8 1)) (goal '(0 7)) (data (maze-data maze)) (size (maze-size maze)))
(labels ((find-path (path pos &aux (x (first pos)) (y (second pos)))
(cond ((or (< x 0) (< y 0) (>= x size) (>= y size) (= (aref data x y) 1) (member pos path :test #'equal)) nil)
((equal pos goal) (list (cons pos path)))
(t
(mapcan #'(lambda (d)
(destructuring-bind (dx dy) d
(find-path (cons pos path) (list (+ x dx) (+ y dy)))))
'((1 0) (-1 0) (0 1) (0 -1)))))))
(let ((found (find-path nil start)))
(if (null found) "経路が見つかりません!! >_<" (print-maze maze (first (sort found #'< :key #'length)))))))


64 名前:29 mailto:sage [2007/06/14(木) 00:06:42 ]
age ちった…。で、おそらくこれが 31 が示そうとしたコードかなと思った。

65 名前:29 mailto:sage [2007/06/14(木) 00:13:15 ]
何度もすまん、>>61 にイイ線いってたよと言いたかった。風邪ひいてボケてるな。
おしかったのは行ける方向を数値にして足しちゃうと経路として使えないんだよね。
座標を覚えておくか、歩数マップみたいに移動コストを計算して最短経路を選ぶかすれば正解だった。

66 名前:CLer mailto:lisp [2007/06/14(木) 01:02:39 ]
>65
イイ線いっていないと思うんですが……。
31の回答で(解けていなくて)惜しい点というのが、
最短経路を求める問題そのものなのではないですか?
だいたい、31の方法ではある座標をすでに通過したかどうかが判定できず、
いつまでも同じところを巡回する可能性がありませんか? というか……、
この再帰は抜けられるんですかね……。

67 名前:65 mailto:sage [2007/06/14(木) 01:24:34 ]
周囲を再帰的に探索していくという点が最初の壁だと思うから着眼点はいいと思うよ。
ここがわかればあとは条件を足すだけじゃん。壁チェックはしてあるから
1. 同じところでいったりきたりしない工夫 (経路を覚えるとかマップにマークするとか)
2. ゴールで止まる
の二点が不足してただけ。配列を一回り大きくして外側を全部壁で囲っちゃえば座標チェックは省略できるしー。
31 のままじゃ無限ループに陥いって抜けられないけど、俺は評価したいね。
俺が C しか知らなかった頃には再帰的な探索なんて考えつかなっただろうという個人的理由が大きいけど。

68 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 03:00:42 ]
文字列の最初の一文字を返すのと,それ以外の部分を返す関数ってないっすか?
文字列のcar, cdr見たいなことをしたいっす.

69 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 03:20:00 ]
>>68
(subseq "ABC" 0 1) => "A"
(subseq "ABC" 1) => "BC"

70 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 04:28:35 ]
>>69
ありがとうございます
もう一つ質問させてください
Lispってループを抜けるC言語で言うbreak見たいな
ものってないんですか?



71 名前:デフォルトの名無しさん [2007/06/14(木) 06:40:33 ]
リターンを使えば抜けれますよ、sumっていう変数があるとすると
(return sum)
と書けばループを抜けて、loopの値がsumとなります
(return)
だけだとloopの値はnilになります

72 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 09:01:45 ]
vimでlisp書いてるんだけど、インデントにスペースとタブの両方が使われる。
インデントはスペースだけにしたいんだけど、誰か何とかする方法知らない?

余談:
emacsでCを編集したらインデントにタブとスペースの両方使われて、
vimでCを編集したらインデントはタブだけが使われたはず。
なんでlispだと逆転するのかね……

73 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 09:31:31 ]
vim tab space でググるくらいはしたらどうか。
聞くとしてもスレ違い。

74 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 15:07:33 ]
>>72
スレチだけど、EmacsのCの編集でスペースで統一するのはc-mode-common-hookあたりで
(setq indent-tabs-mode nil)すればよろし。

75 名前:デフォルトの名無しさん mailto:sage [2007/06/14(木) 16:02:36 ]
(defpackage :maze (:use :common-lisp))
(defun read-maze (filename)
(reverse
(with-open-file (s filename)
(let* ((size (read s)) m)
(dotimes (cnt size m) (setq m (cons (read s) m)))))))
(defun print-maze-1 (row)
(format t "~&~A~%"
(loop for b in row collect (elt '(#¥. #¥X #¥Space) b))))
(defun print-maze (maze)
(loop for row in maze do (print-maze-1 row)))
(defun wall (maze x y) (elt (elt maze y) x))
(defun count-ways (maze x y)
(case (wall maze x y)
(1 nil) (2 t)
(otherwise
(loop for dx in '(0 -1 1 0)
for dy in '(-1 0 0 1)
count (zerop (wall maze (+ x dx) (+ y dy)))))))
(defun solve-maze-1 (maze)
(append (list (first maze))
(loop for y from 1 to (- (length maze) 2)
collect (append '(1)
(loop for x from 1 to (- (length (car maze)) 2)
collect (case (count-ways maze x y)
((NIL) 1) ((0 1 t) 2) ((2 3) 0)))
'(1)))
(last maze)))
(defun solve-maze (maze)
(let ((m (solve-maze-1 maze))) (if (equal m maze) m (solve-maze m))))

76 名前:75 mailto:sage [2007/06/14(木) 16:59:33 ]
LISP勉強中の素人ですが
Slimeの操作の練習を兼ねて作ってみますた。
本題と違いますけどSlime便利ですね。

77 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 06:53:25 ]
ちょっと質問なんですが

(cons "aaa" (cons "bbb" "ccc"))
ってやると
("aaa" "bbb" . "ccc")
こうなっちゃいます...
これを
("aaa" "bbb" "ccc")
こうしたいんですが...

すみませんくだらない質問で,どなたかは教えてください...

78 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 07:03:00 ]
> (cons "aaa" (cons "bbb" "ccc"))
> ってやると
> ("aaa" "bbb" . "ccc")
> こうなっちゃいます...

当然だろ。何の不思議もない。

> これを
> ("aaa" "bbb" "ccc")
> こうしたいんですが...

(cons "aaa" (list "bbb" "ccc"))
(cons "aaa" (cons "bbb" (cons "ccc" '())))

79 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 07:21:10 ]
cons cellとか知らないままlisp使ってる人も
最近はたくさんいそうだな。

80 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 07:29:42 ]
>>78
すみません,もう一つ質問させてください
(setf foo (list "aaa" "bbb"))
(cons "aaa" foo)
(cons "bbb" foo)
(cons "ccc" foo))

consの説明を読むと,2番目の引数がListであれば先頭に一つ要素を追加してゆく
と書かれているので,私としては.

最終的に

("ccc" "bbb" "aaa" "aaa" "bbb")
と成るはずだと思ったのですが.
実際にやってみると

("ccc" "aaa" "bbb")
となってしまいます.
ということは
「2番目の引数がListであれば先頭に一つ要素を追加してゆく」というのは
本の間違いですか?



81 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 07:38:12 ]
>>80
cons は先頭に追加する、んじゃないよ。新しいのを返す。
元々の foo は setq しないと変更されないよ。

82 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 07:58:37 ]
>>81
なるほど,よくわかりました

83 名前:デフォルトの名無しさん mailto:sage [2007/06/15(金) 17:08:07 ]
岩波の「Common Lisp 入門」って良いですか?

84 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 03:14:44 ]
良いかどうかはわかんないですけど学校の教科書にはなっとります

85 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 05:03:08 ]
Lisp関数の探し方というか絞り込み方がよくわかりません。
java,c++,等ならパッケージ、ライブラリなどから必要そうなクラスの名前がだいたい検討がつくのですが
関数一覧から探すのはちょいとしんどいです。
なにかカテゴリー分けされた辞書みたいなものは無いものでしょうか?



86 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 07:44:04 ]
>>85
HyperSpec はまさに辞書だけど駄目?
ttp://www.lisp.org/HyperSpec/FrontMatter/Chapter-Index.html
クックブックもあるよ。
ttp://cl-cookbook.sourceforge.net/

おれはようやくHyperSpecの引きかたに慣れてきたよ。やっぱ辞書は
手に馴染むと便利だね。

87 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 09:36:29 ]
ACL で、:zoom によるトレース結果ではなくて、
ソースのエラー発生箇所をそのまま出力させる事はできないですか?

88 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 09:43:11 ]
>>86 このクックブックはいいね〜。

89 名前:デフォルトの名無しさん [2007/06/16(土) 11:13:50 ]
任意の正実数 c,および,2 以上の任意の整数 m が仮引数として与えられたとき c の m 乗根
を計算する関数 root を,初期値を 1.0 かつ err を 0.1 としニュートン法を用いて定義したんですが、うまく作動しません。
>(root 5 5)とか入力します


(defun absolute (x)
(cond ((< x 0) (- 0 x))
((= x 0) 0)
((> x 0) x)))
(defun near (a b err)
(< (absolute (- a b)) err))
(defun betterpwr (x m c)
(+ (* (- 1 (/ 1.0 m)) x)
(/ (+ c 0.0)
(* m (mypwr x (- m 1))))))
(defun root-core (c m x err)
(if (near c (mypwr x m) err)
x
(root-core c m (betterpwr x m c) err)))
(defun root (c m)
(root-core c m 1.0 0.1))

間違っている点はありますか?

90 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 11:17:34 ]
なんかみにくいですねすいません。インデントがうまく反映されませんでした



91 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 11:26:06 ]
あ、解決しました
mypwr入れ忘れてた orz

92 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 11:50:30 ]
>>86
おお、ありがたい、これのローカル参照可能な版があればもっとありがたいです。

15MB,2300fileもあってwgetするのも気が引けるし。
なにより普段からIPリーチャブルじゃないので。






93 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 12:10:48 ]
>>84
どうも、では読んでみます。

94 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 12:44:06 ]
>>92
ttp://www.lispworks.com/downloads/documentation.html
Emacs+SLIMEという環境だけど、ポイント位置のシンボル拾って
hyperspecを引くコマンドもあって便利すぎます><

95 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 12:51:44 ]
>>92
ひょっとして手元にない人も多いのか? LispWorks や Allegro 入れると一緒に入って
ヘルプコマンドが引いてくれるんだよね。フリーの CL でも SLIME から引ける。
www.lispworks.com/documentation/common-lisp.html

lispuser.net で配布されてる clisp + slime のやつもローカルのを引くのが推奨みたいよ。
↓は附属の .emacs から抜粋。俺は Win じゃないんで試してないが、IE が起動するのかな?

(require 'hyperspec)
(setq common-lisp-hyperspec-root
(concat "file://" (expand-file-name "~/doc/HyperSpec/"))
common-lisp-hyperspec-symbol-table
(expand-file-name "~/doc/HyperSpec/Data/Map_Sym.txt"))

96 名前:デフォルトの名無しさん mailto:sage [2007/06/16(土) 13:04:44 ]
>>83
岩波の Common Lisp 入門って ANSI 以前の CLtL の頃の本じゃなかったっけ?
一通り読んだら ANSI Common Lisp あたりに手を出すのが良いと思う。

97 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 01:02:16 ]
>>83
岩波 livejournal lisp でググって見て。
良い点と悪い点がかかれてるページに出くわすから。

98 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 12:50:59 ]
sbclを使っています。requireを使うと、標準出力にぞろぞろとメッセージが出ますが
あれを出さないようにはできないんでしょうか?sb-executableで実行形式にコンパイルすれば
でないのかなとか思ってやってみましたが、実行形式でも出ちゃいます。

99 名前:デフォルトの名無しさん mailto:sage [2007/06/17(日) 15:00:18 ]
>>98
--noinform
を付けると出ないようになると思います
ttp://www.sbcl.org/manual/Command-Line-Options.html


100 名前:98 mailto:sage [2007/06/18(月) 21:59:33 ]
--noinformは付けてましたが、それでも出てしまいます・・・。




101 名前:デフォルトの名無しさん mailto:sage [2007/06/18(月) 22:42:54 ]
ACL(フリーの奴)で、巨大なテキストファイル(数十MB)を調べているのですが、
遅くて困ってます。

with-open-file で開いて普通に read-line で読んでシェルのwlとかgrepみたいな
事をしているのですが、 perl の方が早いんです…コンパイルしてるのに…orz
何か良い方法ないですか?







[ 続きを読む ] / [ 携帯版 ]

前100 次100 最新50 [ このスレをブックマーク! 携帯に送る ] 2chのread.cgiへ
[+板 最近立ったスレ&熱いスレ一覧 : +板 最近立ったスレ/記者別一覧]( ´∀`)<249KB

read.cgi ver5.27 [feat.BBS2 +1.6] / e.0.2 (02/09/03) / eucaly.net products.
担当:undef