Harvestは小説の題名。苦闘の末に勝ちえた偏見からの解放は命との引換になったという悲しい物語2014-07-21Haskellでクイズ「嫉妬深い男たち」を解く(5)Haskellプログラミング講座(中級編)1.次の場面を求める舟が一方の岸から他方の岸にわたり、今度は逆に折り返してきたときの場面を得る関数nextShotを考える。折り返しの時は、乗客となる候補がいくつかあるので、複数の場面が存在することとなる。この関数は、岸についたとき乗客を降ろし、その後で、舟に乗る候補を得ることで求められるので、mergeGroupをした後で、separateGroupを行うことで得られる。関数nextShotは、左岸についたときの関数nextLShotと右岸についたときの関数nextRShotで実現される。次のようになっている。mergeGroupsで左岸にいた人たちと乗船していた人たちを一緒にした後、この人たちから、左岸に残る人たちと乗船する人たちをseparateGroupで得て、次の場面を作り出す。]関数nextRShotも同じである。]2.プログラムを完成させるクイズ「嫉妬深い男たち」を解くための準備が整ったので、舟が川を行き来したとする。舟が渡る回数を\(n\)としたとき、(船が何回渡ったかで勘定するので、一往復は2回となる)。舟が\(n\)回渡った時の取りえる場面をデータ型Stepで表すこととする(すなわち、深さ優先検索を実行しているときの深度\(n\)での候補)。Stepはレコードで、フィールドは現在取りえる場面と過去に現れた場面からなっている。次のようになっている。関数moveは、初期状態から始めて、舟が行き来をした時のStepの列を与えるものとする。同じパターンを繰り返さないために、過去に出てきた場面は選択しないようにしてある。Haskellで記述すると次のようになる。past1なお、上記の関数でnubが出てくるが、これはリストの構成要素が重複しているときは、一つだけにするものである。この関数を使用する時は、次のモジュールをロードしておく必要がある。問題moveの関数を実行し、どのように場面が変わっていくか様子を観察しなさい。次の例はtset5を初期状態とし、場面の推移をtest30で表したものである。関数moveを改良し、解が得られたら終了するようにしなさい。解はいくつもあるので、最初の解で終了するようにする。これが舟が行き来する回数が最も少ないものである。関数moveでは、行き来の回数が示されていないので、これが示されるようにしなさい。関数moveでは、どのような順序で乗船したかが分からないので、改良してこれが分かるようにしなさい。参加グループ知識リンクはてなブログブログをはじめる週刊はてなブログはてなブログProはてなブログをはじめよう!bitterharvestさんは、はてなブログを使っています。ブログを報告する引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。