<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Serendip &#187; scheme</title>
	<atom:link href="http://www.serendip.ws/archives/tag/scheme/feed" rel="self" type="application/rss+xml" />
	<link>http://www.serendip.ws</link>
	<description>Webデザイン・プログラミング</description>
	<lastBuildDate>Fri, 10 Feb 2012 05:33:58 +0000</lastBuildDate>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2</generator>
		<item>
		<title>Gauche でファイルを読み込み、1行 or 1文字毎に処理を行う</title>
		<link>http://www.serendip.ws/archives/4202</link>
		<comments>http://www.serendip.ws/archives/4202#comments</comments>
		<pubDate>Mon, 25 Jan 2010 14:33:54 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=4202</guid>
		<description><![CDATA[;;; reader を使ってデータを読み込み、fn で処理を行う (define (read-with-function reader fn) (lambda () (let loop ((val (reader))) [...]]]></description>
			<content:encoded><![CDATA[<pre><span class="Comment">;;; reader を使ってデータを読み込み、fn で処理を行う</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>read-with-function reader fn<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">lambda</span> <span class="Special">()</span>
    <span class="Special">(</span><span class="Statement">let</span> loop <span class="Special">((</span>val <span class="Special">(</span>reader<span class="Special">)))</span>
      <span class="Special">(</span><span class="Statement">cond</span> <span class="Special">((</span><span class="Identifier">eof-object?</span> val<span class="Special">)</span> <span class="Special">'())</span>
            <span class="Special">(</span><span class="Statement">else</span> <span class="Special">(</span>fn val<span class="Special">)</span>
                  <span class="Special">(</span>loop <span class="Special">(</span>reader<span class="Special">)))))))</span>

<span class="Comment">;;; ファイルを読み込み、1行毎に処理 fn を適用する</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>read-lines file fn<span class="Special">)</span>
  <span class="Special">(</span><span class="Identifier">with-input-from-file</span> file
    <span class="Special">(</span>read-with-function <span class="PreProc">read-line</span> fn<span class="Special">)))</span>

<span class="Comment">;;; ファイルを読み込み、1文字毎に処理 fn を適用する</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>read-chars file fn<span class="Special">)</span>
  <span class="Special">(</span><span class="Identifier">with-input-from-file</span> file
    <span class="Special">(</span>read-with-function <span class="Identifier">read-char</span> fn<span class="Special">)))</span>
</pre>
<h3>行番号を付加する</h3>
<pre><span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>put-line-number file<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>counter <span class="Constant">0</span><span class="Special">))</span>
    <span class="Special">(</span>read-lines file
                <span class="Special">(</span><span class="Statement">lambda</span> <span class="Special">(</span>line<span class="Special">)</span>
                  <span class="Special">(</span><span class="PreProc">format</span> <span class="Constant">#t</span> <span class="Constant">&quot;~4,'0d : ~a\n&quot;</span> counter line<span class="Special">)</span>
                  <span class="Special">(</span><span class="Type">inc!</span> counter<span class="Special">)))))</span>
</pre>
<h3><code>1</code>文字毎に <code>,</code> を追加する</h3>
<pre><span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>put-comma file<span class="Special">)</span>
  <span class="Special">(</span>read-chars file <span class="Special">(</span><span class="Statement">lambda</span> <span class="Special">(</span>c<span class="Special">)</span>
                     <span class="Special">(</span><span class="Identifier">display</span>
                       <span class="Special">(</span><span class="Statement">cond</span> <span class="Special">((</span><span class="Identifier">char=?</span> c <span class="Constant">#\newline</span><span class="Special">)</span> <span class="Special">(</span><span class="Identifier">string</span> c<span class="Special">))</span>
                             <span class="Special">(</span><span class="Statement">else</span>
                               <span class="Special">(</span><span class="Identifier">string</span> c <span class="Constant">#\,</span><span class="Special">)))))))</span>
</pre>
<div class="amazlet-box" style="margin-bottom:0px;font-size:9pt;">
<div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113482/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51Exg14b4uL._SL160_.jpg" alt="プログラミングGauche" style="border: none;" /></a></div>
<div class="amazlet-info" style="float:left;margin-left:15px;margin-top:10px;line-height:120%">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113482/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">プログラミングGauche</a>
<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4873113482/serendip7822-22/ref=nosim/" title="プログラミングGauche" target="_blank">amazlet</a> at 10.01.25</div>
</div>
<div class="amazlet-detail">Kahuaプロジェクト <br />オライリージャパン <br />売り上げランキング: 202591</div>
<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113482/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer" style="clear: left"></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/4202/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gauche 穴掘り法で迷路作成</title>
		<link>http://www.serendip.ws/archives/4186</link>
		<comments>http://www.serendip.ws/archives/4186#comments</comments>
		<pubDate>Thu, 21 Jan 2010 14:04:28 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=4186</guid>
		<description><![CDATA[穴掘り法という迷路作成アルゴリズムを使って、迷路を作成するプログラムを Gauche で作ってみた。 (use gauche.sequence) ; for-each-with-index (use srfi-27) ; [...]]]></description>
			<content:encoded><![CDATA[<p>穴掘り法という迷路作成アルゴリズムを使って、迷路を作成するプログラムを Gauche で作ってみた。</p>
<pre><span class="Special">(</span><span class="Type">use</span> <span class="PreProc">gauche.sequence</span><span class="Special">)</span> <span class="Comment">; for-each-with-index</span>
<span class="Special">(</span><span class="Type">use</span> <span class="PreProc">srfi-27</span><span class="Special">)</span>         <span class="Comment">; random-source-randomize!</span>
<span class="Special">(</span><span class="Type">use</span> <span class="PreProc">srfi-19</span><span class="Special">)</span>         <span class="Comment">; date-nanosecond</span>
<span class="Special">(</span><span class="Type">use</span> <span class="PreProc">math.mt-random</span><span class="Special">)</span>  <span class="Comment">; &lt;mersenne-twister&gt;</span>

<span class="Comment">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span>

<span class="Special">(</span><span class="Type">define-constant</span> WALL_CHAR    <span class="Constant">#\*</span><span class="Special">)</span>
<span class="Special">(</span><span class="Type">define-constant</span> ROAD_CHAR    <span class="Constant">#\space</span><span class="Special">)</span>
<span class="Special">(</span><span class="Type">define-constant</span> START_CHAR   <span class="Constant">#\S</span><span class="Special">)</span>
<span class="Special">(</span><span class="Type">define-constant</span> GOAL_CHAR    <span class="Constant">#\G</span><span class="Special">)</span>
<span class="Special">(</span><span class="Type">define-constant</span> DEFAULT_SIZE <span class="Constant">10</span><span class="Special">)</span>

<span class="Comment">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span>

<span class="Special">(</span><span class="Type">define-class</span> <span class="Constant">&lt;maze&gt;</span> <span class="Special">()</span>
  <span class="Special">((</span>width     :init-keyword :width    :init-value DEFAULT_SIZE<span class="Special">)</span>
   <span class="Special">(</span>height    :init-keyword :height   :init-value DEFAULT_SIZE<span class="Special">)</span>
   <span class="Special">(</span>maze-map                          :init-value <span class="Special">'())</span>
   <span class="Special">))</span>

<span class="Special">(</span><span class="Type">define-method</span> <span class="PreProc">initialize</span> <span class="Special">((</span>self <span class="Constant">&lt;maze&gt;</span><span class="Special">)</span> initargs<span class="Special">)</span>
  <span class="Special">(</span>next-method<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>width <span class="Special">(</span><span class="PreProc">ref</span> self <span class="Special">'</span>width<span class="Special">))</span>
        <span class="Special">(</span>height <span class="Special">(</span><span class="PreProc">ref</span> self <span class="Special">'</span>height<span class="Special">)))</span>
    <span class="Special">(</span><span class="Type">when</span> <span class="Special">(</span><span class="Identifier">even?</span> width<span class="Special">)</span> <span class="Special">(</span><span class="Statement">set!</span> <span class="Special">(</span><span class="PreProc">ref</span> self <span class="Special">'</span>width<span class="Special">)</span> <span class="Special">(</span><span class="Identifier">+</span> width <span class="Constant">1</span><span class="Special">)))</span>
    <span class="Special">(</span><span class="Type">when</span> <span class="Special">(</span><span class="Identifier">even?</span> height<span class="Special">)</span> <span class="Special">(</span><span class="Statement">set!</span> <span class="Special">(</span><span class="PreProc">ref</span> self <span class="Special">'</span>height<span class="Special">)</span> <span class="Special">(</span><span class="Identifier">+</span> height <span class="Constant">1</span><span class="Special">)))</span>
    <span class="Special">(</span><span class="Statement">set!</span> <span class="Special">(</span><span class="PreProc">ref</span> self <span class="Special">'</span>maze-map<span class="Special">)</span>
          <span class="Special">(</span><span class="Identifier">make-vector</span> <span class="Special">(</span><span class="Identifier">*</span> <span class="Special">(</span><span class="PreProc">ref</span> self <span class="Special">'</span>width<span class="Special">)</span> <span class="Special">(</span><span class="PreProc">ref</span> self <span class="Special">'</span>height<span class="Special">))</span>
                       WALL_CHAR<span class="Special">))))</span>

<span class="Comment">;;; マップを印字</span>
<span class="Special">(</span><span class="Type">define-method</span> print-map <span class="Special">((</span>self <span class="Constant">&lt;maze&gt;</span><span class="Special">))</span>
  <span class="Special">(</span><span class="Type">let1</span> width <span class="Special">(</span><span class="PreProc">ref</span> self <span class="Special">'</span>width<span class="Special">)</span>
    <span class="Special">(</span><span class="PreProc">for-each-with-index</span>
      <span class="Special">(</span><span class="Statement">lambda</span> <span class="Special">(</span>i c<span class="Special">)</span>
        <span class="Special">(</span><span class="Statement">cond</span> <span class="Special">((</span><span class="Identifier">=</span> <span class="Special">(</span><span class="Identifier">remainder</span> i width<span class="Special">)</span> <span class="Special">(</span><span class="Identifier">-</span> width <span class="Constant">1</span><span class="Special">))</span>
               <span class="Special">(</span><span class="Identifier">display</span> c<span class="Special">)</span>
               <span class="Special">(</span><span class="Identifier">newline</span><span class="Special">))</span>
              <span class="Special">(</span><span class="Statement">else</span> <span class="Special">(</span><span class="Identifier">display</span> c<span class="Special">))))</span>
      <span class="Special">(</span><span class="PreProc">ref</span> self <span class="Special">'</span>maze-map<span class="Special">))))</span>

<span class="Comment">;;; 座標 (x y) の vector 対応インデックスを生成</span>
<span class="Special">(</span><span class="Type">define-method</span> pos-to-index <span class="Special">((</span>self <span class="Constant">&lt;maze&gt;</span><span class="Special">)</span> <span class="Constant">.</span> args<span class="Special">)</span>
  <span class="Special">(</span><span class="Identifier">+</span> <span class="Special">(</span><span class="Identifier">car</span> args<span class="Special">)</span>
     <span class="Special">(</span><span class="Identifier">*</span> <span class="Special">(</span><span class="Identifier">cadr</span> args<span class="Special">)</span> <span class="Special">(</span><span class="PreProc">ref</span> self <span class="Special">'</span>width<span class="Special">))))</span>

<span class="Comment">;;; (put maze 1 3 #\S) =&gt; x:1, y:3 に文字 S をセット</span>
<span class="Special">(</span><span class="Type">define-method</span> put <span class="Special">((</span>self <span class="Constant">&lt;maze&gt;</span><span class="Special">)</span> <span class="Constant">.</span> args<span class="Special">)</span>
  <span class="Special">(</span><span class="Identifier">vector-set!</span> <span class="Special">(</span><span class="PreProc">ref</span> self <span class="Special">'</span>maze-map<span class="Special">)</span>
               <span class="Special">(</span>pos-to-index self <span class="Special">(</span><span class="Identifier">car</span> args<span class="Special">)</span> <span class="Special">(</span><span class="Identifier">cadr</span> args<span class="Special">))</span>
               <span class="Special">(</span><span class="Identifier">caddr</span> args<span class="Special">)))</span>

<span class="Comment">;;; (get maze 1 3) =&gt; x:1, y:3 の文字をゲット</span>
<span class="Special">(</span><span class="Type">define-method</span> get <span class="Special">((</span>self <span class="Constant">&lt;maze&gt;</span><span class="Special">)</span> <span class="Constant">.</span> args<span class="Special">)</span>
  <span class="Special">(</span><span class="Identifier">vector-ref</span> <span class="Special">(</span><span class="PreProc">ref</span> self <span class="Special">'</span>maze-map<span class="Special">)</span>
              <span class="Special">(</span>pos-to-index self <span class="Special">(</span><span class="Identifier">car</span> args<span class="Special">)</span> <span class="Special">(</span><span class="Identifier">cadr</span> args<span class="Special">))))</span>

<span class="Comment">;;; 穴掘り</span>
<span class="Special">(</span><span class="Type">define-method</span> dig <span class="Special">((</span>self <span class="Constant">&lt;maze&gt;</span><span class="Special">))</span>
  <span class="Special">(</span><span class="Statement">let*</span> <span class="Special">((</span>width <span class="Special">(</span><span class="PreProc">ref</span> self <span class="Special">'</span>width<span class="Special">))</span>
         <span class="Special">(</span>height <span class="Special">(</span><span class="PreProc">ref</span> self <span class="Special">'</span>height<span class="Special">))</span>
         <span class="Special">(</span>x-left <span class="Constant">1</span><span class="Special">)</span>
         <span class="Special">(</span>y-top <span class="Constant">1</span><span class="Special">)</span>
         <span class="Special">(</span>x-right <span class="Special">(</span><span class="Identifier">-</span> width <span class="Constant">2</span><span class="Special">))</span>
         <span class="Special">(</span>y-bottom <span class="Special">(</span><span class="Identifier">-</span> height <span class="Constant">2</span><span class="Special">)))</span>
    <span class="Special">(</span>put self x-left y-top ROAD_CHAR<span class="Special">)</span> <span class="Comment">; 座標左上に空白文字を配置(スタート位置)</span>
    <span class="Special">(</span><span class="Identifier">call/cc</span>
      <span class="Special">(</span><span class="Statement">lambda</span> <span class="Special">(</span><span class="PreProc">break</span><span class="Special">)</span>
        <span class="Special">(</span><span class="Statement">let</span> loop <span class="Special">((</span>pos <span class="Special">(</span><span class="Identifier">cons</span> x-left y-top<span class="Special">))</span> <span class="Comment">; 現在位置座標</span>
                   <span class="Special">(</span>from-list <span class="Special">'()))</span> <span class="Comment">; これまでたどってきた位置座標リスト</span>
          <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>next-pos-list <span class="Special">(</span>get-next-pos self <span class="Special">(</span><span class="Identifier">car</span> pos<span class="Special">)</span> <span class="Special">(</span><span class="Identifier">cdr</span> pos<span class="Special">))))</span>
            <span class="Special">(</span><span class="Statement">cond</span> <span class="Special">((</span><span class="Identifier">null?</span> next-pos-list<span class="Special">)</span> <span class="Comment">; 移動先が無い場合</span>
                   <span class="Special">(</span><span class="Statement">cond</span> <span class="Special">((</span><span class="Identifier">null?</span> from-list<span class="Special">)</span> <span class="Special">(</span><span class="PreProc">break</span><span class="Special">))</span> <span class="Comment">; スタートに戻ってきたら終了</span>
                         <span class="Special">(</span><span class="Statement">else</span> <span class="Special">(</span>loop <span class="Special">(</span><span class="Identifier">car</span> from-list<span class="Special">)</span> <span class="Special">(</span><span class="Identifier">cdr</span> from-list<span class="Special">)))))</span> <span class="Comment">; 前の位置に戻って繰り返す</span>
                  <span class="Special">(</span><span class="Statement">else</span> <span class="Comment">; 移動先がある場合</span>
                    <span class="Special">(</span><span class="Statement">let*</span> <span class="Special">((</span>next-pos <span class="Special">(</span>list-ref-random next-pos-list<span class="Special">))</span>
                           <span class="Special">(</span>x <span class="Special">(</span><span class="Identifier">car</span> pos<span class="Special">))</span>
                           <span class="Special">(</span>y <span class="Special">(</span><span class="Identifier">cdr</span> pos<span class="Special">))</span>
                           <span class="Special">(</span>nx <span class="Special">(</span><span class="Identifier">car</span> next-pos<span class="Special">))</span>
                           <span class="Special">(</span>ny <span class="Special">(</span><span class="Identifier">cdr</span> next-pos<span class="Special">))</span>
                           <span class="Special">(</span>mx <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">=</span> x nx<span class="Special">)</span> x <span class="Special">(</span><span class="Identifier">/</span> <span class="Special">(</span><span class="Identifier">+</span> x nx<span class="Special">)</span> <span class="Constant">2</span><span class="Special">)))</span>
                           <span class="Special">(</span>my <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">=</span> y ny<span class="Special">)</span> y <span class="Special">(</span><span class="Identifier">/</span> <span class="Special">(</span><span class="Identifier">+</span> y ny<span class="Special">)</span> <span class="Constant">2</span><span class="Special">))))</span>
                      <span class="Special">(</span>put self nx ny ROAD_CHAR<span class="Special">)</span>
                      <span class="Special">(</span>put self mx my ROAD_CHAR<span class="Special">)</span>
                      <span class="Special">(</span>loop <span class="Special">(</span><span class="Identifier">cons</span> nx ny<span class="Special">)</span> <span class="Special">(</span><span class="Identifier">cons</span> pos from-list<span class="Special">)))))))))</span>
    <span class="Special">(</span>put self x-left y-top START_CHAR<span class="Special">)</span>    <span class="Comment">; 座標左上にスタート文字 S を配置</span>
    <span class="Special">(</span>put self x-right y-bottom GOAL_CHAR<span class="Special">)</span> <span class="Comment">; 座標右下にゴール文字 G を配置</span>
    <span class="Special">))</span>

<span class="Comment">;;; 現在座標から2マス先の非空白座標を探す</span>
<span class="Special">(</span><span class="Type">define-method</span> get-next-pos <span class="Special">((</span>self <span class="Constant">&lt;maze&gt;</span><span class="Special">)</span> <span class="Constant">.</span> args<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">let*</span> <span class="Special">((</span>x <span class="Special">(</span><span class="Identifier">car</span> args<span class="Special">))</span>
         <span class="Special">(</span>y <span class="Special">(</span><span class="Identifier">cadr</span> args<span class="Special">))</span>
         <span class="Special">(</span>width <span class="Special">(</span><span class="PreProc">ref</span> self <span class="Special">'</span>width<span class="Special">))</span>
         <span class="Special">(</span>height <span class="Special">(</span><span class="PreProc">ref</span> self <span class="Special">'</span>height<span class="Special">))</span>
         <span class="Special">(</span>next-pos-list <span class="Special">(</span><span class="PreProc">filter</span> <span class="Identifier">pair?</span>
                                <span class="Special">(</span><span class="Identifier">list</span>
                                  <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">&gt;</span> x <span class="Constant">2</span><span class="Special">)</span> <span class="Special">(</span><span class="Identifier">cons</span> <span class="Special">(</span><span class="Identifier">-</span> x <span class="Constant">2</span><span class="Special">)</span> y<span class="Special">)</span> <span class="Special">'())</span>
                                  <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">&lt;</span> x <span class="Special">(</span><span class="Identifier">-</span> width <span class="Constant">3</span><span class="Special">))</span> <span class="Special">(</span><span class="Identifier">cons</span> <span class="Special">(</span><span class="Identifier">+</span> x <span class="Constant">2</span><span class="Special">)</span> y<span class="Special">)</span> <span class="Special">'())</span>
                                  <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">&gt;</span> y <span class="Constant">2</span><span class="Special">)</span> <span class="Special">(</span><span class="Identifier">cons</span> x <span class="Special">(</span><span class="Identifier">-</span> y <span class="Constant">2</span><span class="Special">))</span> <span class="Special">'())</span>
                                  <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">&lt;</span> y <span class="Special">(</span><span class="Identifier">-</span> height <span class="Constant">3</span><span class="Special">))</span> <span class="Special">(</span><span class="Identifier">cons</span> x <span class="Special">(</span><span class="Identifier">+</span> y <span class="Constant">2</span><span class="Special">))</span> <span class="Special">'())))))</span>
    <span class="Special">(</span><span class="PreProc">fold</span>
      <span class="Special">(</span><span class="Statement">lambda</span> <span class="Special">(</span>pos ret<span class="Special">)</span>
        <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">char=?</span> <span class="Special">(</span>get self <span class="Special">(</span><span class="Identifier">car</span> pos<span class="Special">)</span> <span class="Special">(</span><span class="Identifier">cdr</span> pos<span class="Special">))</span> WALL_CHAR<span class="Special">)</span>
            <span class="Special">(</span><span class="Identifier">cons</span> pos ret<span class="Special">)</span>
            ret<span class="Special">))</span>
      <span class="Special">'()</span>
      next-pos-list<span class="Special">)))</span>

<span class="Comment">;;; リストからランダムに要素を1つ取り出す</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>list-ref-random lis<span class="Special">)</span>
  <span class="Special">(</span><span class="Type">let1</span> mt <span class="Special">(</span><span class="PreProc">make</span> <span class="PreProc">&lt;mersenne-twister&gt;</span> :seed <span class="Special">(</span><span class="PreProc">sys-time</span><span class="Special">))</span>
    <span class="Special">(</span><span class="PreProc">mt-random-set-seed!</span> mt <span class="Special">(</span><span class="PreProc">date-nanosecond</span> <span class="Special">(</span><span class="PreProc">current-date</span><span class="Special">)))</span>
    <span class="Special">(</span><span class="Statement">let*</span> <span class="Special">((</span>range <span class="Special">(</span><span class="Identifier">length</span> lis<span class="Special">))</span>
           <span class="Special">(</span>i <span class="Special">(</span><span class="PreProc">mt-random-integer</span> mt range<span class="Special">)))</span>
      <span class="Special">(</span><span class="Identifier">list-ref</span> lis i<span class="Special">))))</span>

<span class="Comment">;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;</span>

<span class="Comment">;;;</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>make-size args<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>args-length <span class="Special">(</span><span class="Identifier">length</span> args<span class="Special">)))</span>
    <span class="Special">(</span><span class="Statement">lambda</span> <span class="Special">(</span>type<span class="Special">)</span>
      <span class="Special">(</span><span class="Statement">cond</span> <span class="Special">((</span><span class="Identifier">&gt;</span> args-length <span class="Constant">2</span><span class="Special">)</span>
             <span class="Special">(</span><span class="Identifier">string-&gt;number</span>
               <span class="Special">(</span><span class="Statement">cond</span> <span class="Special">((</span><span class="Identifier">eq?</span> type <span class="Special">'</span>width<span class="Special">)</span>
                      <span class="Special">(</span><span class="Identifier">cadr</span> args<span class="Special">))</span>
                     <span class="Special">((</span><span class="Identifier">eq?</span> type <span class="Special">'</span>height<span class="Special">)</span>
                      <span class="Special">(</span><span class="Identifier">caddr</span> args<span class="Special">))</span>
                     <span class="Special">(</span><span class="Statement">else</span>
                       <span class="Special">(</span><span class="PreProc">error</span> <span class="Constant">&quot;Unknown type -- MAKE-SIZE&quot;</span> type<span class="Special">)))))</span>
            <span class="Special">(</span><span class="Statement">else</span> DEFAULT_SIZE<span class="Special">)))))</span>

<span class="Comment">;;;</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>main args<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">let*</span> <span class="Special">((</span>w <span class="Special">((</span>make-size args<span class="Special">)</span> <span class="Special">'</span>width<span class="Special">))</span>
         <span class="Special">(</span>h <span class="Special">((</span>make-size args<span class="Special">)</span> <span class="Special">'</span>height<span class="Special">))</span>
         <span class="Special">(</span>maze <span class="Special">(</span><span class="PreProc">make</span> <span class="Constant">&lt;maze&gt;</span> :width w :height h<span class="Special">)))</span>
    <span class="Special">(</span>dig maze<span class="Special">)</span>
    <span class="Special">(</span>print-map maze<span class="Special">)</span>
      <span class="Special">)</span>
  <span class="Constant">0</span><span class="Special">)</span>
</pre>
<p>&quot;穴掘り法&quot;については、以下のサイトを参考にした。</p>
<p><a href="http://www.hi-ho.ne.jp/i-soft/programming/oprg001.htm" class="out">迷路作成プログラムの製作</a><br />
<a href="http://www.ced.is.utsunomiya-u.ac.jp/lecture/2009/prog/p3/kadai4/5.html" class="out">穴掘り法</a></p>
<p>実行結果</p>
<p>引数に横と縦のサイズを渡している。<br />
引数なしの場合は横<code>11</code>、縦<code>11</code>のサイズのマップとなる。</p>
<pre>$ ./makemap.scm 51 15
***************************************************
*S*       *           *   *   *       *       *   *
* *** *** *** *** ***** * * * * *** * * ***** *** *
*     * *   *   * *     * * *   *   * * *       * *
******* *** *** *** ***** * ***** *** * ******* * *
*     *   * *   *   *   *   *   *   * *     * * * *
* ***** * * * *** ***** ***** * *** * ***** * * * *
* *   * *   *           *     *     * *     * *   *
* * * * *************** * *********** * ***** *** *
*   * * *       *       *       *   * *   *     * *
* *** * * ***** *********** *** *** * * * * ***** *
*   * * *   * * *     *   * *   *   * * * *     * *
*** * * *** * * * *** * * *** *** *** *** * *** * *
*   *       *     *     *     *           *   *  G*
***************************************************
</pre>
<p>&quot;<a href="/archives/4155">最短経路探索プログラム Gauche 版 その2</a>&quot; で作ったプログラムを標準入力から読み込みできるように修正して、作成した迷路をパイプで渡して最短経路を見つける。</p>
<pre>$ ./makemap.scm 51 15 | ./maze2.scm
***************************************************
*S*         *     *   *       *      $$$*   *     *
*$* ******* *** * *** * *** *** *****$*$* * * *** *
*$*   *   *     *     * * *   * *$$$$$*$* * *   * *
*$* * * * ***** ******* * *** * *$*****$* * *** * *
*$* * * *   *   *       *   *   *$*$$$$$* *     * *
*$*** * *** ***** ******* * *****$*$***** ******* *
*$$$*   * *       *     * * *$$$$$*$* *         * *
***$* *** ********* *** * ***$*****$* * ******* ***
* *$*               * *   *$$$* *$$$*   *$$$$$*   *
* *$* *************** *** *$*** *$*******$***$*** *
* *$* *$$$$$$$$$$$$$*     *$$$* *$*  $$$*$* *$$$* *
* *$***$***********$*********$* *$***$*$*$* ***$* *
*  $$$$$*          $$$$$$$$$$$*  $$$$$*$$$*    $$G*
***************************************************
</pre>
<p>ファイル引数が与えられなかった場合に、標準入力からマップデータを読み込むために行った修正。</p>
<pre><span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>main args<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">let*</span> <span class="Special">((</span>map-list <span class="Special">(</span>make-map
                     <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">null?</span> <span class="Special">(</span><span class="Identifier">cdr</span> args<span class="Special">))</span>
                         <span class="Special">(</span><span class="PreProc">port-&gt;string</span> <span class="Special">(</span><span class="PreProc">standard-input-port</span><span class="Special">))</span>
                         <span class="Special">(</span><span class="PreProc">file-&gt;string</span> <span class="Special">(</span><span class="Identifier">cadr</span> args<span class="Special">)))))</span>
         <span class="Special">(</span>walked-pos-list <span class="Special">(</span><span class="PreProc">drop-right</span> <span class="Special">(</span>search <span class="Special">(</span><span class="Identifier">cons</span> <span class="Special">(</span><span class="Identifier">cons</span> <span class="Special">(</span>find-pos <span class="Constant">#\S</span> map-list<span class="Special">)</span> <span class="Special">'())</span> <span class="Special">'())</span> map-list<span class="Special">)</span> <span class="Constant">1</span><span class="Special">)))</span>
    <span class="Special">(</span><span class="Statement">let</span> loop <span class="Special">((</span>walked walked-pos-list<span class="Special">)</span>
               <span class="Special">(</span>maps map-list<span class="Special">))</span>
      <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">null?</span> walked<span class="Special">)</span>
          <span class="Special">(</span>print-map maps<span class="Special">)</span>
          <span class="Special">(</span>loop <span class="Special">(</span><span class="Identifier">cdr</span> walked<span class="Special">)</span>
                <span class="Special">(</span>mark-pos <span class="Special">(</span><span class="Identifier">car</span> walked<span class="Special">)</span> maps<span class="Special">))))</span>
    <span class="Special">)</span>
  <span class="Constant">0</span><span class="Special">)</span>
</pre>
<div class="amazlet-box" style="margin-bottom:0px;font-size:9pt;">
<div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113482/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51Exg14b4uL._SL160_.jpg" alt="プログラミングGauche" style="border: none;" /></a></div>
<div class="amazlet-info" style="float:left;margin-left:15px;margin-top:10px;line-height:120%">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113482/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">プログラミングGauche</a>
<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4873113482/serendip7822-22/ref=nosim/" title="プログラミングGauche" target="_blank">amazlet</a> at 10.01.21</div>
</div>
<div class="amazlet-detail">Kahuaプロジェクト <br />オライリージャパン <br />売り上げランキング: 180753</div>
<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113482/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer" style="clear: left"></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/4186/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>最短経路探索プログラム Gauche 版 その2</title>
		<link>http://www.serendip.ws/archives/4155</link>
		<comments>http://www.serendip.ws/archives/4155#comments</comments>
		<pubDate>Mon, 18 Jan 2010 11:59:10 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=4155</guid>
		<description><![CDATA[最短経路探索プログラム Gauche 版 を &#34;「人材獲得作戦・４　試験問題ほか」を解いてみた(2) &#124; 山本隆の開発日誌&#34; で紹介されていた &#34;通った経路に文字を埋めてゆく方法&#34; [...]]]></description>
			<content:encoded><![CDATA[<p><a href="/archives/4143">最短経路探索プログラム Gauche 版</a> を &quot;<a href="http://www.gesource.jp/weblog/?p=2623" class="out">「人材獲得作戦・４　試験問題ほか」を解いてみた(2) | 山本隆の開発日誌</a>&quot; で紹介されていた &quot;通った経路に文字を埋めてゆく方法&quot; で書いてみた。</p>
<p>今回はマップのデータを文字のリストから成る行リストで作る。<br />
隣接する座標に一歩づつ移動して経路を記録して文字を埋めてゆき、ゴールが見つかった時点で <code>call/cc</code> を使ってループを脱出する。<br />
そして、結果の移動経路座標の文字を <code>$</code> に書き換えていったマップデータを印字する。</p>
<pre><span class="Special">(</span><span class="Type">use</span> <span class="PreProc">file.util</span><span class="Special">)</span>       <span class="Comment">; file-&gt;string</span>
<span class="Special">(</span><span class="Type">use</span> <span class="PreProc">srfi-1</span><span class="Special">)</span>          <span class="Comment">; list-index</span>
<span class="Special">(</span><span class="Type">use</span> <span class="PreProc">gauche.sequence</span><span class="Special">)</span> <span class="Comment">; fold-with-index</span>

<span class="Comment">;;; マップ文字列からマップデータリストを作る</span>
<span class="Comment">;;; マップデータリスト</span>
<span class="Comment">;;; ((* * * * * * * * * * * * * * * * * * * * * * * * * *)</span>
<span class="Comment">;;;  (* S *   *                                         *)</span>
<span class="Comment">;;;  ... 省略 ...</span>
<span class="Comment">;;;  (* * * * * * * * * * * * * * * * * * * * * * * * * *))</span>
<span class="Comment">;;;</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>make-map str<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">let</span> loop <span class="Special">((</span>str-list <span class="Special">(</span><span class="Identifier">string-&gt;list</span> str<span class="Special">))</span>
             <span class="Special">(</span>map-list <span class="Special">'())</span>
             <span class="Special">(</span>line-list <span class="Special">'()))</span>
       <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">null?</span> str-list<span class="Special">)</span>
           <span class="Special">(</span><span class="Identifier">reverse</span> map-list<span class="Special">)</span>
           <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>c <span class="Special">(</span><span class="Identifier">car</span> str-list<span class="Special">))</span>
                 <span class="Special">(</span>rest <span class="Special">(</span><span class="Identifier">cdr</span> str-list<span class="Special">)))</span>
                <span class="Special">(</span><span class="Statement">cond</span> <span class="Special">((</span><span class="Identifier">char=?</span> c <span class="Constant">#\newline</span><span class="Special">)</span>
                       <span class="Special">(</span>loop rest <span class="Special">(</span><span class="Identifier">cons</span> <span class="Special">(</span><span class="Identifier">reverse</span> line-list<span class="Special">)</span> map-list<span class="Special">)</span> <span class="Special">'()))</span>
                      <span class="Special">(</span><span class="Statement">else</span>
                        <span class="Special">(</span>loop rest map-list <span class="Special">(</span><span class="Identifier">cons</span> c line-list<span class="Special">))))))))</span>

<span class="Comment">;;; 文字 char の座標 (x . y) を探す</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>find-pos char map-list<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">let</span> loop <span class="Special">((</span>lines map-list<span class="Special">)</span> <span class="Special">(</span>x <span class="Constant">0</span><span class="Special">)</span> <span class="Special">(</span>y <span class="Constant">0</span><span class="Special">))</span>
       <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">null?</span> lines<span class="Special">)</span>
           <span class="Special">(</span><span class="Identifier">cons</span> x y<span class="Special">)</span>
           <span class="Special">(</span><span class="Statement">let*</span> <span class="Special">((</span>line <span class="Special">(</span><span class="Identifier">car</span> lines<span class="Special">))</span>
                  <span class="Special">(</span>_x <span class="Special">(</span><span class="PreProc">list-index</span>
                        <span class="Special">(</span><span class="Statement">lambda</span> <span class="Special">(</span>c<span class="Special">)</span> <span class="Special">(</span><span class="Identifier">char=?</span> char c<span class="Special">))</span>
                        line<span class="Special">)))</span>
                 <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">number?</span> _x<span class="Special">)</span> <span class="Comment">; 文字 char が見つかれば</span>
                     <span class="Special">(</span>loop <span class="Special">'()</span> _x y<span class="Special">)</span> <span class="Comment">; 検索終了</span>
                     <span class="Special">(</span>loop <span class="Special">(</span><span class="Identifier">cdr</span> lines<span class="Special">)</span> x <span class="Special">(</span><span class="Identifier">+</span> y <span class="Constant">1</span><span class="Special">)))))))</span>

<span class="Comment">;;; 座標 pos =&gt; (x . y) の文字を取り出す</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>get-char pos map-list<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>x <span class="Special">(</span><span class="Identifier">car</span> pos<span class="Special">))</span>
        <span class="Special">(</span>y <span class="Special">(</span><span class="Identifier">cdr</span> pos<span class="Special">)))</span>
       <span class="Special">(</span><span class="Identifier">list-ref</span>
         <span class="Special">(</span><span class="Identifier">list-ref</span> map-list y<span class="Special">)</span>
         x<span class="Special">)))</span>

<span class="Comment">;;; 座標 pos =&gt; (x . y) の文字を new-char に書き換えたマップデータリストを返す</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>set-char pos new-char map-list<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>x <span class="Special">(</span><span class="Identifier">car</span> pos<span class="Special">))</span>
        <span class="Special">(</span>y <span class="Special">(</span><span class="Identifier">cdr</span> pos<span class="Special">)))</span>
       <span class="Special">(</span><span class="Identifier">reverse</span>
         <span class="Special">(</span><span class="PreProc">fold-with-index</span>
           <span class="Special">(</span><span class="Statement">lambda</span> <span class="Special">(</span>_y line result<span class="Special">)</span>
                   <span class="Special">(</span><span class="Identifier">cons</span>
                     <span class="Special">(</span><span class="Identifier">reverse</span>
                       <span class="Special">(</span><span class="PreProc">fold-with-index</span>
                         <span class="Special">(</span><span class="Statement">lambda</span> <span class="Special">(</span>_x char rest<span class="Special">)</span>
                                 <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Statement">and</span> <span class="Special">(</span><span class="Identifier">=</span> _x x<span class="Special">)</span> <span class="Special">(</span><span class="Identifier">=</span> _y y<span class="Special">))</span>
                                     <span class="Special">(</span><span class="Identifier">cons</span> new-char rest<span class="Special">)</span>
                                     <span class="Special">(</span><span class="Identifier">cons</span> char rest<span class="Special">)))</span>
                         <span class="Special">'()</span>
                         line<span class="Special">))</span>
                       result<span class="Special">))</span>
           <span class="Special">'()</span>
           map-list<span class="Special">))))</span>

<span class="Comment">;;; 座標 pos に移動済みマーク $ を付ける</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>mark-pos pos map-list<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">let*</span> <span class="Special">((</span>x <span class="Special">(</span><span class="Identifier">car</span> pos<span class="Special">))</span>
         <span class="Special">(</span>y <span class="Special">(</span><span class="Identifier">cdr</span> pos<span class="Special">))</span>
         <span class="Special">(</span>new-char <span class="Constant">#\$</span><span class="Special">))</span>
       <span class="Special">(</span>set-char pos new-char map-list<span class="Special">)))</span>

<span class="Comment">;;; 経路探索処理 search</span>
<span class="Comment">;;; 座標データリストとマップデータリストを渡し、移動可能な次の座標にマークを付けて再帰的に処理していく</span>
<span class="Comment">;;; ゴールを見つけると、最短経路移動座標リスト(スタート位置を含む)を返す</span>
<span class="Comment">;;; 座標データリスト: (&lt;座標データ: (&lt;座標:(x . y)&gt; &lt;移動経路座標リスト:((x . y) (x . y) ...)&gt;)&gt; &lt;座標データ:(...)&gt; &lt;座標データ:(...)&gt; ...)</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>search pos-list map-list<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">null?</span> pos-list<span class="Special">)</span>
      <span class="Special">'()</span>
      <span class="Special">(</span><span class="Identifier">call/cc</span>
        <span class="Special">(</span><span class="Statement">lambda</span> <span class="Special">(</span><span class="PreProc">break</span><span class="Special">)</span>
                <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>next-pos-list <span class="Special">'()))</span>
                     <span class="Special">(</span><span class="Identifier">for-each</span>
                       <span class="Special">(</span><span class="Statement">lambda</span> <span class="Special">(</span>pos-data<span class="Special">)</span> <span class="Comment">; pos-data : 座標データ</span>
                               <span class="Special">(</span><span class="Statement">let*</span> <span class="Special">((</span>pos <span class="Special">(</span><span class="Identifier">car</span> pos-data<span class="Special">))</span>
                                      <span class="Special">(</span>x <span class="Special">(</span><span class="Identifier">car</span> pos<span class="Special">))</span>
                                      <span class="Special">(</span>y <span class="Special">(</span><span class="Identifier">cdr</span> pos<span class="Special">))</span>
                                      <span class="Special">(</span>nexts <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">(</span><span class="Identifier">cons</span> x <span class="Special">(</span><span class="Identifier">-</span> y <span class="Constant">1</span><span class="Special">))</span> <span class="Special">(</span><span class="Identifier">cons</span> x <span class="Special">(</span><span class="Identifier">+</span> y <span class="Constant">1</span><span class="Special">))</span> <span class="Special">(</span><span class="Identifier">cons</span> <span class="Special">(</span><span class="Identifier">-</span> x <span class="Constant">1</span><span class="Special">)</span> y<span class="Special">)</span> <span class="Special">(</span><span class="Identifier">cons</span> <span class="Special">(</span><span class="Identifier">+</span> x <span class="Constant">1</span><span class="Special">)</span> y<span class="Special">))))</span>
                                     <span class="Special">(</span><span class="Identifier">for-each</span>
                                       <span class="Special">(</span><span class="Statement">lambda</span> <span class="Special">(</span>next-pos<span class="Special">)</span>
                                               <span class="Special">(</span><span class="Statement">let*</span> <span class="Special">((</span>next-x <span class="Special">(</span><span class="Identifier">car</span> next-pos<span class="Special">))</span>
                                                      <span class="Special">(</span>next-y <span class="Special">(</span><span class="Identifier">cdr</span> next-pos<span class="Special">))</span>
                                                      <span class="Special">(</span>char <span class="Special">(</span>get-char next-pos map-list<span class="Special">)))</span>
                                                     <span class="Special">(</span><span class="Statement">cond</span> <span class="Special">((</span><span class="Identifier">char=?</span> char <span class="Constant">#\G</span><span class="Special">)</span>
                                                            <span class="Special">(</span><span class="PreProc">break</span> <span class="Special">(</span><span class="Identifier">cons</span> pos <span class="Special">(</span><span class="Identifier">cdr</span> pos-data<span class="Special">))))</span>
                                                           <span class="Special">((</span><span class="Identifier">char=?</span> char <span class="Constant">#\space</span><span class="Special">)</span>
                                                            <span class="Special">(</span><span class="Statement">set!</span> map-list <span class="Special">(</span>mark-pos next-pos map-list<span class="Special">))</span>
                                                            <span class="Special">(</span><span class="Statement">set!</span> next-pos-list <span class="Special">(</span><span class="Identifier">cons</span> <span class="Special">(</span><span class="Identifier">cons</span> next-pos <span class="Special">(</span><span class="Identifier">cons</span> pos <span class="Special">(</span><span class="Identifier">cdr</span> pos-data<span class="Special">)))</span> next-pos-list<span class="Special">))))))</span>
                                       nexts<span class="Special">)))</span> <span class="Comment">; nexts : 移動先座標リスト</span>
                       pos-list<span class="Special">)</span> <span class="Comment">; pos-list : 座標データリスト</span>
                     <span class="Special">(</span>search next-pos-list map-list<span class="Special">))))))</span>

<span class="Comment">;;; マップデータリストからマップを印字する</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>print-map map-list<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">null?</span> map-list<span class="Special">)</span>
      <span class="Special">'()</span>
      <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>line <span class="Special">(</span><span class="Identifier">car</span> map-list<span class="Special">)))</span>
           <span class="Special">(</span><span class="Statement">let</span> loop <span class="Special">((</span>l line<span class="Special">))</span>
                <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">null?</span> l<span class="Special">)</span>
                    <span class="Special">(</span><span class="Identifier">newline</span><span class="Special">)</span>
                    <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>c <span class="Special">(</span><span class="Identifier">car</span> l<span class="Special">)))</span>
                         <span class="Special">(</span><span class="Identifier">display</span> c<span class="Special">)</span>
                         <span class="Special">(</span>loop <span class="Special">(</span><span class="Identifier">cdr</span> l<span class="Special">)))))</span>
           <span class="Special">(</span>print-map <span class="Special">(</span><span class="Identifier">cdr</span> map-list<span class="Special">)))))</span>

<span class="Comment">;;;</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>main args<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">let*</span> <span class="Special">((</span>file <span class="Special">(</span><span class="Identifier">cadr</span> args<span class="Special">))</span>
         <span class="Special">(</span>map-list <span class="Special">(</span>make-map <span class="Special">(</span><span class="PreProc">file-&gt;string</span> file<span class="Special">)))</span>
         <span class="Special">(</span>walked-pos-list <span class="Special">(</span><span class="PreProc">drop-right</span> <span class="Special">(</span>search <span class="Special">(</span><span class="Identifier">cons</span> <span class="Special">(</span><span class="Identifier">cons</span> <span class="Special">(</span>find-pos <span class="Constant">#\S</span> map-list<span class="Special">)</span> <span class="Special">'())</span> <span class="Special">'())</span> map-list<span class="Special">)</span> <span class="Constant">1</span><span class="Special">)))</span>
        <span class="Special">(</span><span class="Statement">let</span> loop <span class="Special">((</span>walked walked-pos-list<span class="Special">)</span>
                   <span class="Special">(</span>maps map-list<span class="Special">))</span>
             <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">null?</span> walked<span class="Special">)</span>
                 <span class="Special">(</span>print-map maps<span class="Special">)</span>
                 <span class="Special">(</span>loop <span class="Special">(</span><span class="Identifier">cdr</span> walked<span class="Special">)</span>
                       <span class="Special">(</span>mark-pos <span class="Special">(</span><span class="Identifier">car</span> walked<span class="Special">)</span> maps<span class="Special">))))</span>
        <span class="Special">)</span>
  <span class="Constant">0)</span>
</pre>
<p>実行結果</p>
<pre>$ ./maze2.scm map.txt
**************************
*S* * $$$                *
*$* *$$*$ *************  *
*$* $$* $$$************  *
*$$$$*    $$$$$          *
**************$***********
* $$$$$$$$$$$$$          *
**$***********************
* $$$$$* $$$$$$$$$$$$$G  *
*  *  $$$$*********** *  *
*    *        ******* *  *
*       *                *
**************************
</pre>
<div class="amazlet-box" style="margin-bottom:0px;font-size:9pt;">
<div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113482/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51Exg14b4uL._SL160_.jpg" alt="プログラミングGauche" style="border: none;" /></a></div>
<div class="amazlet-info" style="float:left;margin-left:15px;margin-top:10px;line-height:120%">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113482/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">プログラミングGauche</a>
<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4873113482/serendip7822-22/ref=nosim/" title="プログラミングGauche" target="_blank">amazlet</a> at 10.01.18</div>
</div>
<div class="amazlet-detail">Kahuaプロジェクト <br />オライリージャパン <br />売り上げランキング: 134071</div>
<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113482/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer" style="clear: left"></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/4155/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>最短経路探索プログラム Gauche 版</title>
		<link>http://www.serendip.ws/archives/4143</link>
		<comments>http://www.serendip.ws/archives/4143#comments</comments>
		<pubDate>Sat, 16 Jan 2010 13:01:52 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=4143</guid>
		<description><![CDATA[最短経路探索プログラムの問題を、今度は Gauche で解いてみた。 こちらは、スタートからの移動距離を記録してゆき、ゴールから戻るかたちで最短経路にマークを付けてゆく方法で作った。 マップ座標(x, y)をキーにするハ [...]]]></description>
			<content:encoded><![CDATA[<p><a href="/archives/4133">最短経路探索プログラムの問題</a>を、今度は Gauche で解いてみた。</p>
<p>こちらは、スタートからの移動距離を記録してゆき、ゴールから戻るかたちで最短経路にマークを付けてゆく方法で作った。</p>
<p>マップ座標(x, y)をキーにするハッシュテーブルでマップデータを作り、マップ上の &quot;文字&quot;、移動先の&quot;座標リスト&quot;、スタートからの&quot;移動距離&quot; を値とした。</p>
<pre><span class="Special">(</span><span class="Type">use</span> <span class="PreProc">file.util</span><span class="Special">)</span>
<span class="Special">(</span><span class="Type">use</span> <span class="PreProc">srfi-1</span><span class="Special">)</span>

<span class="Comment">;;; 文字列から各文字を、ハッシュテーブルに追加していく。</span>
<span class="Comment">;;; 行を y 座標とし、各行の左からの文字位置を x 座標とする (x y) のリストをキーとする。</span>
<span class="Comment">;;; ノードデータリスト構造を (&lt;文字&gt; &lt;移動先座標リスト&gt; &lt;スタートからの距離&gt;) とする。</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>make-map-table str map-table<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>set-table-iter lis key<span class="Special">)</span>
    <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">null?</span> lis<span class="Special">)</span>
        map-table
        <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>c <span class="Special">(</span><span class="Identifier">car</span> lis<span class="Special">)))</span>
             <span class="Special">(</span><span class="PreProc">hash-table-put!</span> map-table
                              key
                              <span class="Special">(</span><span class="Identifier">list</span> c <span class="Special">'()</span> <span class="Constant">0</span><span class="Special">))</span>
             <span class="Special">(</span>set-table-iter <span class="Special">(</span><span class="Identifier">cdr</span> lis<span class="Special">)</span>
                             <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">char=?</span> c <span class="Constant">#\newline</span><span class="Special">)</span>
                                 <span class="Special">(</span><span class="Identifier">list</span> <span class="Constant">0</span> <span class="Special">(</span><span class="Identifier">+</span> <span class="Special">(</span>get-y key<span class="Special">)</span> <span class="Constant">1</span><span class="Special">))</span>
                                 <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">(</span><span class="Identifier">+</span> <span class="Special">(</span>get-x key<span class="Special">)</span> <span class="Constant">1</span><span class="Special">)</span> <span class="Special">(</span>get-y key<span class="Special">)))))))</span>
  <span class="Special">(</span>set-table-iter <span class="Special">(</span><span class="Identifier">string-&gt;list</span> str<span class="Special">)</span> <span class="Special">(</span><span class="Identifier">list</span> <span class="Constant">0</span> <span class="Constant">0</span><span class="Special">)))</span>

<span class="Comment">;;; 座標から x 座標を取り出す</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>get-x key<span class="Special">)</span> <span class="Special">(</span><span class="Identifier">car</span> key<span class="Special">))</span>
<span class="Comment">;;; 座標から y 座標を取り出す</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>get-y key<span class="Special">)</span> <span class="Special">(</span><span class="Identifier">cadr</span> key<span class="Special">))</span>
<span class="Comment">;;; ノードデータリストから文字を取り出す</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>get-char node<span class="Special">)</span> <span class="Special">(</span><span class="Identifier">car</span> node<span class="Special">))</span>
<span class="Comment">;;; ノードデータリストから移動先座標リストを取り出す</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>get-nexts node<span class="Special">)</span> <span class="Special">(</span><span class="Identifier">cadr</span> node<span class="Special">))</span>
<span class="Comment">;;; ノードデータリストからスタートからの移動距離を取り出す</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>get-distance node<span class="Special">)</span> <span class="Special">(</span><span class="Identifier">caddr</span> node<span class="Special">))</span>

<span class="Comment">;;; 特定文字の座標検索</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>search-pos char map-table<span class="Special">)</span>
  <span class="Special">(</span><span class="PreProc">hash-table-map</span> map-table
                  <span class="Special">(</span><span class="Statement">lambda</span> <span class="Special">(</span>key value<span class="Special">)</span>
                          <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">char=?</span> <span class="Special">(</span>get-char value<span class="Special">)</span> char<span class="Special">)</span>
                              key
                              <span class="Special">'()))))</span>
<span class="Comment">;;; スタート座標の検索</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>search-start map-table<span class="Special">)</span>
  <span class="Special">(</span><span class="Identifier">car</span> <span class="Special">(</span><span class="PreProc">filter</span> <span class="Identifier">pair?</span> <span class="Special">(</span>search-pos <span class="Constant">#\S</span> map-table<span class="Special">))))</span>
<span class="Comment">;;; ゴール座標の検索</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>search-goal map-table<span class="Special">)</span>
  <span class="Special">(</span><span class="Identifier">car</span> <span class="Special">(</span><span class="PreProc">filter</span> <span class="Identifier">pair?</span> <span class="Special">(</span>search-pos <span class="Constant">#\G</span> map-table<span class="Special">))))</span>

<span class="Comment">;;; スタート地点からの移動距離をセットし、移動先座標をセットしていく。</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>set-distances nexts current-distance map-table<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>next-nexts <span class="Special">'()))</span>
       <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">null?</span> nexts<span class="Special">)</span>
           <span class="Special">'()</span>
           <span class="Special">(</span><span class="Identifier">for-each</span>
             <span class="Special">(</span><span class="Statement">lambda</span> <span class="Special">(</span>key<span class="Special">)</span>
                     <span class="Special">(</span><span class="Statement">let*</span> <span class="Special">((</span>x <span class="Special">(</span>get-x key<span class="Special">))</span>
                            <span class="Special">(</span>y <span class="Special">(</span>get-y key<span class="Special">))</span>
                            <span class="Special">(</span>move <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">(</span><span class="Identifier">list</span> x <span class="Special">(</span><span class="Identifier">-</span> y <span class="Constant">1</span><span class="Special">))</span> <span class="Special">(</span><span class="Identifier">list</span> x <span class="Special">(</span><span class="Identifier">+</span> y <span class="Constant">1</span><span class="Special">))</span> <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">(</span><span class="Identifier">-</span> x <span class="Constant">1</span><span class="Special">)</span> y<span class="Special">)</span> <span class="Special">(</span><span class="Identifier">list</span> <span class="Special">(</span><span class="Identifier">+</span> x <span class="Constant">1</span><span class="Special">)</span> y<span class="Special">))))</span>
                           <span class="Special">(</span><span class="Identifier">for-each</span>
                             <span class="Special">(</span><span class="Statement">lambda</span> <span class="Special">(</span>k<span class="Special">)</span>
                                     <span class="Special">(</span><span class="Statement">let*</span> <span class="Special">((</span>nd <span class="Special">(</span><span class="PreProc">hash-table-get</span> map-table k<span class="Special">))</span>
                                            <span class="Special">(</span>ch <span class="Special">(</span>get-char nd<span class="Special">))</span>
                                            <span class="Special">(</span>nx <span class="Special">(</span>get-nexts nd<span class="Special">))</span>
                                            <span class="Special">(</span>ds <span class="Special">(</span>get-distance nd<span class="Special">)))</span>
                                           <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Statement">and</span> <span class="Special">(</span><span class="Statement">or</span> <span class="Special">(</span><span class="Identifier">char=?</span> <span class="Constant">#\space</span> ch<span class="Special">)</span>
                                                        <span class="Special">(</span><span class="Identifier">char=?</span> <span class="Constant">#\S</span> ch<span class="Special">)</span>
                                                        <span class="Special">(</span><span class="Identifier">char=?</span> <span class="Constant">#\G</span> ch<span class="Special">))</span>
                                                    <span class="Special">(</span><span class="Identifier">=</span> ds <span class="Constant">0</span><span class="Special">))</span>
                                               <span class="Special">(</span><span class="Statement">begin</span>
                                                 <span class="Special">(</span><span class="Statement">set!</span> next-nexts <span class="Special">(</span><span class="Identifier">cons</span> k next-nexts<span class="Special">))</span>
                                                 <span class="Special">(</span><span class="PreProc">hash-table-put!</span> map-table k <span class="Special">(</span><span class="Identifier">list</span> ch <span class="Special">(</span><span class="Identifier">list</span> key<span class="Special">)</span> <span class="Special">(</span><span class="Identifier">+</span> current-distance <span class="Constant">1</span><span class="Special">)))))))</span>
                             move<span class="Special">)))</span>
             nexts<span class="Special">))</span>
       <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">null?</span> next-nexts<span class="Special">)</span>
           map-table
           <span class="Special">(</span>set-distances next-nexts <span class="Special">(</span><span class="Identifier">+</span> current-distance <span class="Constant">1</span><span class="Special">)</span> map-table<span class="Special">))))</span>

<span class="Comment">;;; ゴールノードから隣接ノードのスタートからの距離がより短いものを探して、文字を $ に変更していく</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>mark-root nexts distance map-table<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">null?</span> nexts<span class="Special">)</span>
      map-table
      <span class="Special">(</span><span class="Statement">let*</span> <span class="Special">((</span>next-key <span class="Special">(</span><span class="Identifier">car</span> nexts<span class="Special">))</span>
             <span class="Special">(</span>next-node <span class="Special">(</span><span class="PreProc">hash-table-get</span> map-table next-key<span class="Special">))</span>
             <span class="Special">(</span>next-char <span class="Special">(</span>get-char next-node<span class="Special">))</span>
             <span class="Special">(</span>next-nexts <span class="Special">(</span>get-nexts next-node<span class="Special">))</span>
             <span class="Special">(</span>next-distance <span class="Special">(</span>get-distance next-node<span class="Special">)))</span>
            <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">char=?</span> next-char <span class="Constant">#\S</span><span class="Special">)</span>
                map-table
                <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">=</span> next-distance <span class="Special">(</span><span class="Identifier">-</span> distance <span class="Constant">1</span><span class="Special">))</span>
                    <span class="Special">(</span><span class="Statement">begin</span>
                      <span class="Special">(</span><span class="PreProc">hash-table-put!</span> map-table next-key <span class="Special">(</span><span class="Identifier">list</span> <span class="Constant">#\$</span> next-nexts next-distance<span class="Special">))</span>
                      <span class="Special">(</span>mark-root next-nexts next-distance map-table<span class="Special">))</span>
                    <span class="Special">(</span>mark-root <span class="Special">(</span><span class="Identifier">cdr</span> nexts<span class="Special">)</span> distance map-table<span class="Special">))))))</span>

<span class="Comment">;;; マップを印字</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>print-map map-table<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>iter x y<span class="Special">)</span>
    <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>key <span class="Special">(</span><span class="Identifier">list</span> x y<span class="Special">)))</span>
         <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="PreProc">hash-table-exists?</span> map-table key<span class="Special">)</span>
             <span class="Special">(</span><span class="Statement">let*</span> <span class="Special">((</span>node <span class="Special">(</span><span class="PreProc">hash-table-get</span> map-table key<span class="Special">))</span>
                    <span class="Special">(</span>char <span class="Special">(</span>get-char node<span class="Special">)))</span>
                   <span class="Special">(</span><span class="Identifier">display</span> char<span class="Special">)</span>
                   <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">char=?</span> char <span class="Constant">#\newline</span><span class="Special">)</span>
                       <span class="Special">(</span>iter <span class="Constant">0</span> <span class="Special">(</span><span class="Identifier">+</span> y <span class="Constant">1</span><span class="Special">))</span>
                       <span class="Special">(</span>iter <span class="Special">(</span><span class="Identifier">+</span> x <span class="Constant">1</span><span class="Special">)</span> y<span class="Special">))))))</span>
  <span class="Special">(</span>iter <span class="Constant">0</span> <span class="Constant">0</span><span class="Special">))</span>

<span class="Comment">;;;</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>main args<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>file <span class="Special">(</span><span class="Identifier">cadr</span> args<span class="Special">)))</span>
       <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>map-table <span class="Special">(</span><span class="PreProc">make-hash-table</span> <span class="Special">'</span>equal?<span class="Special">)))</span>
            <span class="Special">(</span>make-map-table <span class="Special">(</span><span class="PreProc">file-&gt;string</span> file<span class="Special">)</span> map-table<span class="Special">)</span>
            <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>start-key <span class="Special">(</span>search-start map-table<span class="Special">))</span>
                  <span class="Special">(</span>goal-key <span class="Special">(</span>search-goal map-table<span class="Special">)))</span>
                 <span class="Special">(</span>print-map
                   <span class="Special">(</span><span class="Statement">let*</span> <span class="Special">((</span>measured-map <span class="Special">(</span>set-distances <span class="Special">(</span><span class="Identifier">cons</span> start-key <span class="Special">'())</span> <span class="Constant">1</span> map-table<span class="Special">))</span>
                          <span class="Special">(</span>goal-node <span class="Special">(</span><span class="PreProc">hash-table-get</span> measured-map goal-key<span class="Special">))</span>
                          <span class="Special">(</span>goal-nexts <span class="Special">(</span>get-nexts goal-node<span class="Special">))</span>
                          <span class="Special">(</span>goal-distance <span class="Special">(</span>get-distance goal-node<span class="Special">)))</span>
                         <span class="Special">(</span>mark-root goal-nexts goal-distance measured-map<span class="Special">))))))</span>
  <span class="Constant">0</span><span class="Special">)</span>
</pre>
<p>実行結果</p>
<pre>$ ./maze.scm map.txt
**************************
*S* * $$$                *
*$* *$$*$ *************  *
*$* $$* $$$************  *
*$$$$*    $$$$$          *
**************$***********
* $$$$$$$$$$$$$          *
**$***********************
* $$$$$* $$$$$$$$$$$$$G  *
*  *  $$$$*********** *  *
*    *        ******* *  *
*       *                *
**************************
</pre>
<div class="amazlet-box" style="margin-bottom:0px;font-size:9pt;">
<div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113482/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51Exg14b4uL._SL160_.jpg" alt="プログラミングGauche" style="border: none;" /></a></div>
<div class="amazlet-info" style="float:left;margin-left:15px;margin-top:10px;line-height:120%">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113482/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">プログラミングGauche</a>
<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4873113482/serendip7822-22/ref=nosim/" title="プログラミングGauche" target="_blank">amazlet</a> at 10.01.16</div>
</div>
<div class="amazlet-detail">Kahuaプロジェクト <br />オライリージャパン <br />売り上げランキング: 68658</div>
<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113482/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer" style="clear: left"></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/4143/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>カード配り問題(10分プログラミング)</title>
		<link>http://www.serendip.ws/archives/3870</link>
		<comments>http://www.serendip.ws/archives/3870#comments</comments>
		<pubDate>Wed, 16 Dec 2009 02:33:49 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=3870</guid>
		<description><![CDATA[&#34;Latest topics > カード配り問題 &#8211; outsider reflex&#34; や &#34;１０分プログラミング &#8211; hogehoge&#34; を見て、自分も  [...]]]></description>
			<content:encoded><![CDATA[<p>&quot;<a href="http://piro.sakura.ne.jp/latest/blosxom/webtech/javascript/2009-12-16_cards.htm" class="out">Latest topics > カード配り問題 &#8211; outsider reflex</a>&quot; や &quot;<a href="http://d.hatena.ne.jp/teramako/20091215/p1" class="out">１０分プログラミング &#8211; hogehoge</a>&quot; を見て、自分も &quot;<a href="http://ameblo.jp/programming/entry-10001721422.html" class="out">１０分でコーディング｜プログラミングに自信があるやつこい！！</a>&quot; をやってみた。</p>
<p>カード枚数が足りない場合を考えていたら20分かかってしまった・・・</p>
<pre><span class="Identifier">var</span><span class="Special"> deal = </span><span class="Identifier">function</span>(<span class="Special">numPlayers, cards</span>)<span class="Special"> </span><span class="Identifier">{</span>
<span class="Special">    </span><span class="Identifier">var</span><span class="Special"> result = </span><span class="Identifier">[]</span><span class="Special">;</span>
<span class="Special">    </span><span class="Identifier">var</span><span class="Special"> len = Math.floor</span>(<span class="Special">cards.length / numPlayers</span>)<span class="Special"> * numPlayers;</span>
<span class="Special">    </span><span class="Statement">for</span><span class="Special"> </span>(<span class="Identifier">var</span><span class="Special"> i=</span>0<span class="Special">; i&lt;numPlayers; i++</span>)<span class="Special"> </span><span class="Identifier">{</span>
<span class="Special">        result.push</span>(<span class="Constant">''</span>)<span class="Special">;</span>
<span class="Special">    </span><span class="Identifier">}</span>
<span class="Special">    </span><span class="Statement">for</span><span class="Special"> </span>(<span class="Identifier">var</span><span class="Special"> i=</span>0<span class="Special">; i&lt;len; i++</span>)<span class="Special"> </span><span class="Identifier">{</span>
<span class="Special">        result</span><span class="Identifier">[</span><span class="Special">i % numPlayers</span><span class="Identifier">]</span><span class="Special"> += cards</span><span class="Identifier">[</span><span class="Special">i</span><span class="Identifier">]</span><span class="Special">;</span>
<span class="Special">    </span><span class="Identifier">}</span>
<span class="Special">    </span><span class="Statement">return</span><span class="Special"> result;</span>
<span class="Identifier">}</span><span class="Special">;</span>

<span class="Special">console.log</span>(<span class="Special">deal</span>(3<span class="Special">, </span><span class="Constant">&quot;123123123&quot;</span>))<span class="Special">;</span>
<span class="Special">console.log</span>(<span class="Special">deal</span>(4<span class="Special">, </span><span class="Constant">&quot;123123123&quot;</span>))<span class="Special">;</span>
<span class="Special">console.log</span>(<span class="Special">deal</span>(2<span class="Special">, </span><span class="Constant">&quot;123123123&quot;</span>))<span class="Special">;</span>
<span class="Special">console.log</span>(<span class="Special">deal</span>(6<span class="Special">, </span><span class="Constant">&quot;012345012345012345&quot;</span>))<span class="Special">;</span>
<span class="Special">console.log</span>(<span class="Special">deal</span>(4<span class="Special">, </span><span class="Constant">&quot;111122223333&quot;</span>))<span class="Special">;</span>
<span class="Special">console.log</span>(<span class="Special">deal</span>(1<span class="Special">, </span><span class="Constant">&quot;012345012345012345&quot;</span>))<span class="Special">;</span>
<span class="Special">console.log</span>(<span class="Special">deal</span>(6<span class="Special">, </span><span class="Constant">&quot;01234&quot;</span>))<span class="Special">;</span>
<span class="Special">console.log</span>(<span class="Special">deal</span>(2<span class="Special">, </span><span class="Constant">&quot;&quot;</span>))<span class="Special">;</span>
</pre>
<p><ins datetime="2009-12-17T12:42:06+0900">追記：Gauche で作ってみた。</ins></p>
<pre><span class="Special">(</span><span class="Type">use</span> <span class="PreProc">srfi-1</span><span class="Special">)</span>
<span class="Special">(</span><span class="Type">use</span> <span class="PreProc">gauche.sequence</span><span class="Special">)</span>

<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>deal num-players cards<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">let*</span> <span class="Special">((</span>l-cards <span class="Special">(</span><span class="Identifier">string-&gt;list</span> cards<span class="Special">))</span>
         <span class="Special">(</span>util-cards <span class="Special">(</span><span class="PreProc">drop-right</span> l-cards <span class="Special">(</span><span class="Identifier">remainder</span> <span class="Special">(</span><span class="Identifier">length</span> l-cards<span class="Special">)</span> num-players<span class="Special">))))</span>
        <span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>iter i p<span class="Special">)</span>
          <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">=</span> i <span class="Constant">0</span><span class="Special">)</span>
              p
              <span class="Special">(</span>iter <span class="Special">(</span><span class="Identifier">-</span> i <span class="Constant">1</span><span class="Special">)</span>
                    <span class="Special">(</span><span class="Identifier">cons</span>
                      <span class="Special">(</span><span class="Identifier">map</span> <span class="Identifier">cadr</span> <span class="Special">(</span><span class="PreProc">filter</span>
                                  <span class="Special">(</span><span class="Statement">lambda</span> <span class="Special">(</span>x<span class="Special">)</span> <span class="Special">(</span><span class="Identifier">=</span> <span class="Special">(</span><span class="Identifier">remainder</span> <span class="Special">(</span><span class="Identifier">car</span> x<span class="Special">)</span> num-players<span class="Special">)</span> <span class="Special">(</span><span class="Identifier">-</span> i <span class="Constant">1</span><span class="Special">)))</span>
                                  <span class="Special">(</span><span class="PreProc">map-with-index</span> <span class="Identifier">list</span> util-cards<span class="Special">)))</span>
                      p<span class="Special">))))</span>
        <span class="Special">(</span>iter num-players <span class="Special">'())))</span>

<span class="Special">(</span><span class="Identifier">map</span> <span class="Identifier">list-&gt;string</span> <span class="Special">(</span>deal <span class="Constant">3</span> <span class="Constant">&quot;123123123&quot;</span><span class="Special">))</span>
<span class="Special">(</span><span class="Identifier">map</span> <span class="Identifier">list-&gt;string</span> <span class="Special">(</span>deal <span class="Constant">4</span> <span class="Constant">&quot;123123123&quot;</span><span class="Special">))</span>
<span class="Special">(</span><span class="Identifier">map</span> <span class="Identifier">list-&gt;string</span> <span class="Special">(</span>deal <span class="Constant">2</span> <span class="Constant">&quot;123123123&quot;</span><span class="Special">))</span>
<span class="Special">(</span><span class="Identifier">map</span> <span class="Identifier">list-&gt;string</span> <span class="Special">(</span>deal <span class="Constant">6</span> <span class="Constant">&quot;012345012345012345&quot;</span><span class="Special">))</span>
<span class="Special">(</span><span class="Identifier">map</span> <span class="Identifier">list-&gt;string</span> <span class="Special">(</span>deal <span class="Constant">4</span> <span class="Constant">&quot;111122223333&quot;</span><span class="Special">))</span>
<span class="Special">(</span><span class="Identifier">map</span> <span class="Identifier">list-&gt;string</span> <span class="Special">(</span>deal <span class="Constant">1</span> <span class="Constant">&quot;012345012345012345&quot;</span><span class="Special">))</span>
<span class="Special">(</span><span class="Identifier">map</span> <span class="Identifier">list-&gt;string</span> <span class="Special">(</span>deal <span class="Constant">6</span> <span class="Constant">&quot;01234&quot;</span><span class="Special">))</span>
<span class="Special">(</span><span class="Identifier">map</span> <span class="Identifier">list-&gt;string</span> <span class="Special">(</span>deal <span class="Constant">2</span> <span class="Constant">&quot;&quot;</span><span class="Special">))</span>
</pre>
<p>実行結果</p>
<pre>gosh&gt; (&quot;111&quot; &quot;222&quot; &quot;333&quot;)
gosh&gt; (&quot;12&quot; &quot;23&quot; &quot;31&quot; &quot;12&quot;)
gosh&gt; (&quot;1321&quot; &quot;2132&quot;)
gosh&gt; (&quot;000&quot; &quot;111&quot; &quot;222&quot; &quot;333&quot; &quot;444&quot; &quot;555&quot;)
gosh&gt; (&quot;123&quot; &quot;123&quot; &quot;123&quot; &quot;123&quot;)
gosh&gt; (&quot;012345012345012345&quot;)
gosh&gt; (&quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot; &quot;&quot;)
gosh&gt; (&quot;&quot; &quot;&quot;)
</pre>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/3870/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Scheme で音楽</title>
		<link>http://www.serendip.ws/archives/3049</link>
		<comments>http://www.serendip.ws/archives/3049#comments</comments>
		<pubDate>Wed, 16 Sep 2009 12:19:28 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=3049</guid>
		<description><![CDATA[Impromptu: Scheme ベースのライブコーディング環境 &#8211; Radium Software Scheme でリアルタイムにコードを書きながら音楽を作っている。 ryukyu がいい。 おもしろいな [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://d.hatena.ne.jp/KZR/20090915/p2" class="out">Impromptu: Scheme ベースのライブコーディング環境 &#8211; Radium Software</a></p>
<p>Scheme でリアルタイムにコードを書きながら音楽を作っている。<br />
ryukyu がいい。<br />
おもしろいな。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/3049/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gauche で CSV 形式のデータの重複するカラムのあるレコードを削除する</title>
		<link>http://www.serendip.ws/archives/2688</link>
		<comments>http://www.serendip.ws/archives/2688#comments</comments>
		<pubDate>Sat, 25 Jul 2009 09:26:23 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=2688</guid>
		<description><![CDATA[CSV ファイルのレコードに重複するカラムがある場合に、そのレコードを削除する Gauche スクリプト。 以下のコードでは *check-column-index* を定義して2番目のカラムでの重複をチェックしている。 [...]]]></description>
			<content:encoded><![CDATA[<p>CSV ファイルのレコードに重複するカラムがある場合に、そのレコードを削除する Gauche スクリプト。<br />
以下のコードでは <code>*check-column-index*</code> を定義して2番目のカラムでの重複をチェックしている。</p>
<pre><span class="Special">(</span><span class="Type">use</span> <span class="PreProc">text.csv</span><span class="Special">)</span>
<span class="Special">(</span><span class="Type">use</span> <span class="PreProc">gauche.collection</span><span class="Special">)</span>
<span class="Special">(</span><span class="Type">use</span> <span class="PreProc">srfi-13</span><span class="Special">)</span>

<span class="Special">(</span><span class="Statement">define</span> <span class="Constant">*check-column-index*</span> <span class="Constant">1</span><span class="Special">)</span>

<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>quick-sort comp lis<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">null?</span> lis<span class="Special">)</span>
      <span class="Special">'()</span>
      <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>p <span class="Special">(</span><span class="Identifier">car</span> lis<span class="Special">)))</span>
           <span class="Special">(</span><span class="Type">receive</span> <span class="Special">(</span>a b<span class="Special">)</span> <span class="Special">(</span><span class="PreProc">partition</span> <span class="Special">(</span><span class="Statement">lambda</span> <span class="Special">(</span>x<span class="Special">)</span> <span class="Special">(</span>comp x p<span class="Special">))</span> <span class="Special">(</span><span class="Identifier">cdr</span> lis<span class="Special">))</span>
                    <span class="Special">(</span><span class="Identifier">append</span> <span class="Special">(</span>quick-sort comp a<span class="Special">)</span>
                            <span class="Special">(</span><span class="Identifier">cons</span> p <span class="Special">(</span>quick-sort comp b<span class="Special">)))))))</span>

<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>quick-sort-csv comp lis column-index<span class="Special">)</span>
  <span class="Special">(</span>quick-sort <span class="Special">(</span><span class="Statement">lambda</span> <span class="Special">(</span>lis-x lis-y<span class="Special">)</span>
                      <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>x <span class="Special">(</span><span class="Identifier">list-ref</span> lis-x column-index<span class="Special">))</span>
                            <span class="Special">(</span>y <span class="Special">(</span><span class="Identifier">list-ref</span> lis-y column-index<span class="Special">)))</span>
                           <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span>comp x y<span class="Special">)</span> <span class="Constant">#t</span> <span class="Constant">#f</span><span class="Special">)))</span>
              lis<span class="Special">))</span>

<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>delete-repeated-record record-list<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>iter record-list prev-record-item result-list<span class="Special">)</span>
    <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">null?</span> record-list<span class="Special">)</span>
        result-list
        <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>record <span class="Special">(</span><span class="Identifier">car</span> record-list<span class="Special">)))</span>
             <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>current-record-item <span class="Special">(</span><span class="Identifier">list-ref</span> record <span class="Constant">*check-column-index*</span><span class="Special">)))</span>
                  <span class="Special">(</span>iter <span class="Special">(</span><span class="Identifier">cdr</span> record-list<span class="Special">)</span> current-record-item
                        <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">string=?</span> current-record-item prev-record-item<span class="Special">)</span>
                            result-list
                            <span class="Special">(</span><span class="Identifier">cons</span> record result-list<span class="Special">)))))))</span>
  <span class="Special">(</span>iter record-list <span class="Constant">&quot;&quot;</span> <span class="Special">'()))</span>

<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>print-csv record-list<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">null?</span> record-list<span class="Special">)</span>
      <span class="Special">'()</span>
      <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>record <span class="Special">(</span><span class="Identifier">car</span> record-list<span class="Special">)))</span>
           <span class="Special">(</span><span class="PreProc">print</span> <span class="Constant">&quot;\&quot;&quot;</span> <span class="Special">(</span><span class="PreProc">string-join</span> record <span class="Constant">&quot;\&quot;,\&quot;&quot;</span><span class="Special">)</span> <span class="Constant">&quot;\&quot;&quot;</span><span class="Special">)</span>
           <span class="Special">(</span>print-csv <span class="Special">(</span><span class="Identifier">cdr</span> record-list<span class="Special">)))))</span>

<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>read-csv file<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>reader <span class="Special">(</span><span class="PreProc">make-csv-reader</span> <span class="Constant">#\,</span><span class="Special">)))</span>
       <span class="Special">(</span><span class="Identifier">call-with-input-file</span> file
                             <span class="Special">(</span><span class="Statement">lambda</span> <span class="Special">(</span>in<span class="Special">)</span>
                                     <span class="Special">(</span><span class="PreProc">port-&gt;list</span> reader in<span class="Special">)))))</span>

<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>main args<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">null?</span> <span class="Special">(</span><span class="Identifier">cadr</span> args<span class="Special">))</span>
      <span class="Special">(</span><span class="PreProc">error</span> <span class="Constant">&quot;CSV file is required&quot;</span><span class="Special">)</span>
      <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>sorted-csv-list <span class="Special">(</span>quick-sort-csv <span class="PreProc">string&gt;</span> <span class="Special">(</span>read-csv <span class="Special">(</span><span class="Identifier">cadr</span> args<span class="Special">))</span> <span class="Constant">*check-column-index*</span><span class="Special">)))</span>
           <span class="Special">(</span>print-csv <span class="Special">(</span>delete-repeated-record sorted-csv-list<span class="Special">))))</span>
  <span class="Constant">0</span><span class="Special">)</span>
</pre>
<p>実行結果</p>
<pre>$ cat test.csv
&quot;上杉謙信&quot;,&quot;ken@foo.com&quot;,&quot;09023421011&quot;
&quot;織田信長&quot;,&quot;oda@hoge.com&quot;,&quot;08034528761&quot;
&quot;徳川家康&quot;,&quot;toku@yahoo.com&quot;,&quot;0230989124&quot;
&quot;上杉輝虎&quot;,&quot;ken@foo.com&quot;,&quot;09023421011&quot;
&quot;豊臣秀吉&quot;,&quot;saru@gmail.com&quot;,&quot;08013457812&quot;
&quot;長尾景虎&quot;,&quot;ken@foo.com&quot;,&quot;09023421011&quot;
&quot;松平元康&quot;,&quot;toku@yahoo.com&quot;,&quot;0230989124&quot;
&quot;木下藤吉郎&quot;,&quot;saru@gmail.com&quot;,&quot;08013457812&quot;
&quot;毛利元就&quot;,&quot;nari@yahoo.com&quot;,&quot;02056720981&quot;
$ ./delete-repeated-csv-record.scm test.csv
&quot;上杉謙信&quot;,&quot;ken@foo.com&quot;,&quot;09023421011&quot;
&quot;毛利元就&quot;,&quot;nari@yahoo.com&quot;,&quot;02056720981&quot;
&quot;織田信長&quot;,&quot;oda@hoge.com&quot;,&quot;08034528761&quot;
&quot;豊臣秀吉&quot;,&quot;saru@gmail.com&quot;,&quot;08013457812&quot;
&quot;徳川家康&quot;,&quot;toku@yahoo.com&quot;,&quot;0230989124&quot;
</pre>
<div class="amazlet-box" style="margin-bottom:0px;font-size:7pt;">
<div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113482/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51Exg14b4uL._SL160_.jpg" alt="プログラミングGauche" style="border: none;" /></a></div>
<div class="amazlet-info" style="float:left;margin-top:10px;margin-left:15px;line-height:120%">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113482/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">プログラミングGauche</a>
<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4873113482/serendip7822-22/ref=nosim/" title="プログラミングGauche" target="_blank">amazlet</a> at 09.07.23</div>
</div>
<div class="amazlet-detail">Kahuaプロジェクト <br />オライリージャパン <br />売り上げランキング: 51330</div>
<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113482/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer" style="clear: left"></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/2688/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gauche で CSV 形式のデータをソートする</title>
		<link>http://www.serendip.ws/archives/2682</link>
		<comments>http://www.serendip.ws/archives/2682#comments</comments>
		<pubDate>Thu, 23 Jul 2009 20:08:56 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=2682</guid>
		<description><![CDATA[Gauche でクイックソートを利用して CSV 形式のデータをソートする。 クイックソートについては、&#34;M.Hiroi&#8217;s Home Page / お気楽 Scheme プログラミング入門&#038;quo [...]]]></description>
			<content:encoded><![CDATA[<p>Gauche でクイックソートを利用して CSV 形式のデータをソートする。<br />
クイックソートについては、&quot;<a href="http://www.geocities.jp/m_hiroi/func/abcscm28.html" class="out">M.Hiroi&#8217;s Home Page / お気楽 Scheme プログラミング入門</a>&quot; を参考にした。<br />
この例では、CSV ファイルの読み込みは省略して、リスト化されたダミーデータを定義して使っている。<br />
CSV ファイルの読み込みについては、&quot;<a href="/archives/2676">Gauche で CSV 形式のデータを読み込む</a>&quot;。</p>
<pre><span class="Special">(</span><span class="Type">use</span> <span class="PreProc">gauche.collection</span><span class="Special">)</span> <span class="Comment">;; for partition</span>
<span class="Special">(</span><span class="Type">use</span> <span class="PreProc">srfi-13</span><span class="Special">)</span> <span class="Comment">;; for string&gt;</span>

<span class="Comment">;; CSV 形式データをリストに変換したもの。</span>
<span class="Comment">;; port-&gt;list で CSV ファイルを読み込んでリスト化したものと仮定する。</span>
<span class="Special">(</span><span class="Statement">define</span> dummy-csv <span class="Special">'((</span><span class="Constant">&quot;上杉謙信&quot;</span> <span class="Constant">&quot;ken@foo.com&quot;</span> <span class="Constant">&quot;09023421011&quot;</span><span class="Special">)</span>
                    <span class="Special">(</span><span class="Constant">&quot;織田信長&quot;</span> <span class="Constant">&quot;oda@hoge.com&quot;</span> <span class="Constant">&quot;08034528761&quot;</span><span class="Special">)</span>
                    <span class="Special">(</span><span class="Constant">&quot;徳川家康&quot;</span> <span class="Constant">&quot;toku@yahoo.com&quot;</span> <span class="Constant">&quot;0230989124&quot;</span><span class="Special">)</span>
                    <span class="Special">(</span><span class="Constant">&quot;豊臣秀吉&quot;</span> <span class="Constant">&quot;saru@gmail.com&quot;</span> <span class="Constant">&quot;08013457812&quot;</span><span class="Special">)</span>
                    <span class="Special">(</span><span class="Constant">&quot;毛利元就&quot;</span> <span class="Constant">&quot;nari@yahoo.com&quot;</span> <span class="Constant">&quot;02056720981&quot;</span><span class="Special">)))</span>

<span class="Comment">;; クイックソート手続き</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>quick-sort comp lis<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">null?</span> lis<span class="Special">)</span>
      <span class="Special">'()</span>
      <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>p <span class="Special">(</span><span class="Identifier">car</span> lis<span class="Special">)))</span>
           <span class="Special">(</span><span class="Type">receive</span> <span class="Special">(</span>a b<span class="Special">)</span> <span class="Special">(</span><span class="PreProc">partition</span> <span class="Special">(</span><span class="Statement">lambda</span> <span class="Special">(</span>x<span class="Special">)</span> <span class="Special">(</span>comp x p<span class="Special">))</span> <span class="Special">(</span><span class="Identifier">cdr</span> lis<span class="Special">))</span>
                    <span class="Special">(</span><span class="Identifier">append</span> <span class="Special">(</span>quick-sort comp a<span class="Special">)</span>
                            <span class="Special">(</span><span class="Identifier">cons</span> p <span class="Special">(</span>quick-sort comp b<span class="Special">)))))))</span>

<span class="Comment">;; CSV 形式データの col-num 番目のセルを比較してソートする。</span>
<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>quick-sort-csv comp lis col-num<span class="Special">)</span>
  <span class="Special">(</span>quick-sort <span class="Special">(</span><span class="Statement">lambda</span> <span class="Special">(</span>lis-x lis-y<span class="Special">)</span>
                      <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>x <span class="Special">(</span><span class="Identifier">list-ref</span> lis-x col-num<span class="Special">))</span>
                            <span class="Special">(</span>y <span class="Special">(</span><span class="Identifier">list-ref</span> lis-y col-num<span class="Special">)))</span>
                           <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span>comp x y<span class="Special">)</span> <span class="Constant">#t</span> <span class="Constant">#f</span><span class="Special">)))</span>
              lis<span class="Special">))</span>
</pre>
<p>実行結果</p>
<pre>(quick-sort-csv string&gt; dummy-csv 0)
gosh&gt; ((&quot;豊臣秀吉&quot; &quot;saru@gmail.com&quot; &quot;08013457812&quot;) (&quot;織田信長&quot; &quot;oda@hoge.com&quot; &quot;08034528761&quot;) (&quot;毛利元就&quot; &quot;nari@yahoo.com&quot; &quot;02056720981&quot;) (&quot;徳川家康&quot; &quot;toku@yahoo.com&quot; &quot;0230989124&quot;) (&quot;上杉謙信&quot; &quot;ken@foo.com&quot; &quot;09023421011&quot;))

(quick-sort-csv string&gt; dummy-csv 1)
gosh&gt; ((&quot;徳川家康&quot; &quot;toku@yahoo.com&quot; &quot;0230989124&quot;) (&quot;豊臣秀吉&quot; &quot;saru@gmail.com&quot; &quot;08013457812&quot;) (&quot;織田信長&quot; &quot;oda@hoge.com&quot; &quot;08034528761&quot;) (&quot;毛利元就&quot; &quot;nari@yahoo.com&quot; &quot;02056720981&quot;) (&quot;上杉謙信&quot; &quot;ken@foo.com&quot; &quot;09023421011&quot;))

(quick-sort-csv string&gt; dummy-csv 2)
gosh&gt; ((&quot;上杉謙信&quot; &quot;ken@foo.com&quot; &quot;09023421011&quot;) (&quot;織田信長&quot; &quot;oda@hoge.com&quot; &quot;08034528761&quot;) (&quot;豊臣秀吉&quot; &quot;saru@gmail.com&quot; &quot;08013457812&quot;) (&quot;徳川家康&quot; &quot;toku@yahoo.com&quot; &quot;0230989124&quot;) (&quot;毛利元就&quot; &quot;nari@yahoo.com&quot; &quot;02056720981&quot;))

(quick-sort-csv string&gt; dummy-csv 3)
gosh&gt; *** ERROR: argument out of range: 3
Stack Trace:
</pre>
<div class="amazlet-box" style="margin-bottom:0px;font-size:7pt;">
<div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113482/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51Exg14b4uL._SL160_.jpg" alt="プログラミングGauche" style="border: none;" /></a></div>
<div class="amazlet-info" style="float:left;margin-top:10px;margin-left:15px;line-height:120%">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113482/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">プログラミングGauche</a>
<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4873113482/serendip7822-22/ref=nosim/" title="プログラミングGauche" target="_blank">amazlet</a> at 09.07.23</div>
</div>
<div class="amazlet-detail">Kahuaプロジェクト <br />オライリージャパン <br />売り上げランキング: 51330</div>
<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113482/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer" style="clear: left"></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/2682/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gauche で CSV 形式のデータを読み込む</title>
		<link>http://www.serendip.ws/archives/2676</link>
		<comments>http://www.serendip.ws/archives/2676#comments</comments>
		<pubDate>Thu, 23 Jul 2009 11:57:45 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=2676</guid>
		<description><![CDATA[make-csv-reader で、入力ポートを引数とする手続きを作る。 この手続きはポートからレコードを1つ読み込み、フィールドのリストを返す。 port-&#62;list を使って、返されたフィールドのリストをリスト [...]]]></description>
			<content:encoded><![CDATA[<p><code>make-csv-reader</code> で、入力ポートを引数とする手続きを作る。<br />
この手続きはポートからレコードを1つ読み込み、フィールドのリストを返す。<br />
<code>port-&gt;list</code> を使って、返されたフィールドのリストをリストに追加していく。</p>
<pre><span class="Special">(</span><span class="Type">use</span> <span class="PreProc">text.csv</span><span class="Special">)</span>

<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>read-csv file<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">let</span> <span class="Special">((</span>reader <span class="Special">(</span><span class="PreProc">make-csv-reader</span> <span class="Constant">#\,</span><span class="Special">)))</span>
       <span class="Special">(</span><span class="Identifier">call-with-input-file</span> file
                             <span class="Special">(</span><span class="Statement">lambda</span> <span class="Special">(</span>in<span class="Special">)</span>
                                     <span class="Special">(</span><span class="PreProc">port-&gt;list</span> reader in<span class="Special">)))))</span>

<span class="Special">(</span><span class="Statement">define</span> <span class="Special">(</span>main args<span class="Special">)</span>
  <span class="Special">(</span><span class="Statement">if</span> <span class="Special">(</span><span class="Identifier">null?</span> <span class="Special">(</span><span class="Identifier">cadr</span> args<span class="Special">))</span>
      <span class="Special">(</span><span class="PreProc">error</span> <span class="Constant">&quot;CSV file is required&quot;</span><span class="Special">)</span>
      <span class="Special">(</span><span class="PreProc">print</span> <span class="Special">(</span>read-csv <span class="Special">(</span><span class="Identifier">cadr</span> args<span class="Special">))))</span>
  <span class="Constant">0</span><span class="Special">)</span>
</pre>
<p>実行結果</p>
<pre>$ cat test.csv
&quot;上杉謙信&quot;,&quot;ken@foo.com&quot;,&quot;09023421011&quot;
&quot;織田信長&quot;,&quot;oda@hoge.com&quot;,&quot;08034528761&quot;
&quot;徳川家康&quot;,&quot;toku@yahoo.com&quot;,&quot;0230989124&quot;
&quot;豊臣秀吉&quot;,&quot;saru@gmail.com&quot;,&quot;08013457812&quot;
&quot;毛利元就&quot;,&quot;nari@yahoo.com&quot;,&quot;02056720981&quot;

$ ./read-csv.scm test.csv
((上杉謙信 ken@foo.com 09023421011) (織田信長 oda@hoge.com 08034528761) (徳川家康 toku@yahoo.com 0230989124) (豊臣秀吉 saru@gmail.com 08013457812) (毛利元就 nari@yahoo.com 02056720981))
</pre>
<p>参考：<a href="http://practical-scheme.net/gauche/man/gauche-refj_315.html" class="out">Gauche リファレンスマニュアル: CSVテーブル</a><br />
　　　<a href="http://practical-scheme.net/gauche/man/gauche-refj_57.html" class="out">Gauche ユーザリファレンス: 6.19 入出力</a></p>
<div class="amazlet-box" style="margin-bottom:0px;font-size:7pt;">
<div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113482/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51Exg14b4uL._SL160_.jpg" alt="プログラミングGauche" style="border: none;" /></a></div>
<div class="amazlet-info" style="float:left;margin-top:10px;margin-left:15px;line-height:120%">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113482/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">プログラミングGauche</a>
<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4873113482/serendip7822-22/ref=nosim/" title="プログラミングGauche" target="_blank">amazlet</a> at 09.07.23</div>
</div>
<div class="amazlet-detail">Kahuaプロジェクト <br />オライリージャパン <br />売り上げランキング: 51330</div>
<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113482/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer" style="clear: left"></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/2676/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gauche ディレクトリに関する操作</title>
		<link>http://www.serendip.ws/archives/2534</link>
		<comments>http://www.serendip.ws/archives/2534#comments</comments>
		<pubDate>Tue, 07 Jul 2009 08:22:45 +0000</pubDate>
		<dc:creator>iNo</dc:creator>
				<category><![CDATA[blog]]></category>
		<category><![CDATA[scheme]]></category>

		<guid isPermaLink="false">http://www.serendip.ws/?p=2534</guid>
		<description><![CDATA[file.util モジュールを使って、いろいろなディレクトリ操作をする。 (use file.util) ホームディレクトリを調べる (home-directory) gosh&#62; &#34;/Users/hog [...]]]></description>
			<content:encoded><![CDATA[<p><code>file.util</code> モジュールを使って、いろいろなディレクトリ操作をする。</p>
<pre><span class="Special">(</span><span class="Type">use</span> <span class="PreProc">file.util</span><span class="Special">)</span>
</pre>
<h3>ホームディレクトリを調べる</h3>
<pre><span class="Special">(</span><span class="PreProc">home-directory</span><span class="Special">)</span>
gosh&gt; &quot;/Users/hoge&quot;
</pre>
<h3>カレントディレクトリを調べる</h3>
<pre><span class="Special">(</span><span class="PreProc">current-directory</span><span class="Special">)</span>
gosh&gt; &quot;/Users/hoge&quot;
</pre>
<h3>ディレクトリを移動する</h3>
<p>移動先のディレクトリを引数として渡す。</p>
<pre><span class="Special">(</span><span class="PreProc">current-directory</span> <span class="Constant">&quot;foo&quot;</span><span class="Special">)</span>
gosh&gt; #t
<span class="Special">(</span><span class="PreProc">current-directory</span><span class="Special">)</span>
gosh&gt; &quot;/Users/hoge/foo&quot;
</pre>
<p>ディレクトリが存在しなければエラーとなる。</p>
<pre><span class="Special">(</span><span class="PreProc">current-directory</span> <span class="Constant">&quot;foom&quot;</span><span class="Special">)</span>
gosh&gt; *** SYSTEM-ERROR: chdir failed: No such file or directory
<span class="Special">(</span><span class="PreProc">current-directory</span><span class="Special">)</span>
gosh&gt; &quot;/Users/hoge&quot;
</pre>
<h3>テンポラリディレクトリを調べる</h3>
<pre><span class="Special">(</span><span class="PreProc">temporary-directory</span><span class="Special">)</span>
gosh&gt; &quot;/var/folders/yy/yy1T31dmF+af7zKSGI2d1E+++TI/-Tmp-/&quot;
</pre>
<h3>ディレクトリを作成する</h3>
<pre><span class="Special">(</span><span class="PreProc">make-directory*</span> <span class="Constant">&quot;foo&quot;</span><span class="Special">)</span>
gosh&gt; #t
<span class="Special">(</span><span class="PreProc">create-directory*</span> <span class="Constant">&quot;foom&quot;</span><span class="Special">)</span>
gosh&gt; #t
</pre>
<h3>ディレクトリを削除する</h3>
<pre><span class="Special">(</span><span class="PreProc">remove-directory*</span> <span class="Constant">&quot;foo&quot;</span><span class="Special">)</span>
gosh&gt; #t
<span class="Special">(</span><span class="PreProc">delete-directory*</span> <span class="Constant">&quot;foom&quot;</span><span class="Special">)</span>
gosh&gt; #t
</pre>
<p>参考：<a href="http://practical-scheme.net/gauche/man/gauche-refj_128.html" class="out">Gauche ユーザリファレンス: 11.11 file.util &#8211; ファイルシステムユーティリティ</a></p>
<div class="amazlet-box" style="margin-bottom:0px;font-size:7pt;">
<div class="amazlet-image" style="float:left;"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113482/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank"><img src="http://ecx.images-amazon.com/images/I/51Exg14b4uL._SL160_.jpg" alt="プログラミングGauche" style="border: none;" /></a></div>
<div class="amazlet-info" style="float:left;margin-top:10px;margin-left:15px;line-height:120%">
<div class="amazlet-name" style="margin-bottom:10px;line-height:120%"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113482/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">プログラミングGauche</a>
<div class="amazlet-powered-date" style="font-size:7pt;margin-top:5px;font-family:verdana;line-height:120%">posted with <a href="http://www.amazlet.com/browse/ASIN/4873113482/serendip7822-22/ref=nosim/" title="プログラミングGauche" target="_blank">amazlet</a> at 09.07.07</div>
</div>
<div class="amazlet-detail">Kahuaプロジェクト <br />オライリージャパン <br />売り上げランキング: 141505</div>
<div class="amazlet-link" style="margin-top: 5px"><a href="http://www.amazon.co.jp/exec/obidos/ASIN/4873113482/serendip7822-22/ref=nosim/" name="amazletlink" target="_blank">Amazon.co.jp で詳細を見る</a></div>
</div>
<div class="amazlet-footer" style="clear: left"></div>
</div>
]]></content:encoded>
			<wfw:commentRss>http://www.serendip.ws/archives/2534/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

