<?xml version="1.0" encoding="UTF-8" ?><rdf:RDF 
  xmlns="http://purl.org/rss/1.0/"
  xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
  xmlns:atom="http://www.w3.org/2005/Atom"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xml:lang="ja">
  <channel rdf:about="http://w.atwiki.jp/ranha-icfp/">
    <title>ranha-icfp @ ウィキ</title>
    <link>http://w.atwiki.jp/ranha-icfp/</link>
    <atom:link href="https://w.atwiki.jp/ranha-icfp/rss10.xml" rel="self" type="application/rss+xml" />
    <atom:link rel="hub" href="https://pubsubhubbub.appspot.com" />
    <description>ranha-icfp @ ウィキ</description>

    <dc:language>ja</dc:language>
    <dc:date>2008-05-19T01:28:51+09:00</dc:date>
    <utime>1211128131</utime>

    <items>
      <rdf:Seq>
                <rdf:li rdf:resource="https://w.atwiki.jp/ranha-icfp/pages/17.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/ranha-icfp/pages/21.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/ranha-icfp/pages/14.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/ranha-icfp/pages/20.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/ranha-icfp/pages/11.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/ranha-icfp/pages/19.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/ranha-icfp/pages/15.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/ranha-icfp/pages/18.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/ranha-icfp/pages/16.html" />
                <rdf:li rdf:resource="https://w.atwiki.jp/ranha-icfp/pages/1.html" />
              </rdf:Seq>
    </items>
	
		
    
  </channel>
    <item rdf:about="https://w.atwiki.jp/ranha-icfp/pages/17.html">
    <title>2007/問題文/From RNA to Fuun</title>
    <link>https://w.atwiki.jp/ranha-icfp/pages/17.html</link>
    <description>
      *4. RNA から Fuun へ

人間と同様に、ふーん RNA はたんぱく質の合成を指示し、結果として生物の形を得ます。我々は生き物をアセンブルする能力を持っていないので、生き物のアセンブルを実行できるのは宇宙船 Arrow のみということになります。しかし幸いにも、我々は結果として生じる生物の形態と、その環境を示す画像にたどり着くことができます。このセクションでは、ふーん RNA を表示する方法について、我々が把握していることを説明します。

図2から、ふーん RNA がながーい命令のリストであることを思い出してください。それぞれのコマンドは7個の塩基からなる DNA 文字列によって表されますが、最後の RNA 命令だけは7個よりも少ない塩基で表されるかもしれません。ふーんを RNA からビルドする間、それぞれの RNA が処理され、内部の状態はアップデートされていくでしょう。結果として生じる画像は、その内部状態の一部に他なりません。

画像を表すデータ型を図17の中で説明します。「座標（Coord）」は、0 から 599 までの自然数であり、座標のペアは「位置（Pos）」を表します。「Component」は 0 から 255 までの自然数で、3個の component が組み合わさって、「RGB 値（RGB）」になります。「Transparency （もしくは alpha）」は component の1種であり、いくつかの色はあらかじめ定義されています。とりわけ重要なことは、黒は (0, 0, 0) に等しく、白は (255, 255, 255) に等しいということです。また、transparency が 0 であるということは色が完全に透明であることを意味し、transparency が 255 であることは色が完全に不透明であることを意味します。

Bitmap は pos によって索引付けられる配列であり、(0, 0) から (599, 599) までのそれぞれの要素が Pixel になっています。pixel は RGB と transparency のペアからなり、位置 (0, 0) は画像の左上を、位置 (599, 599) は画像の右下を表します。bitmap b の pos p にある pixel について言及するために、我々は b@p という表記を用います。

ふーんをアセンブルする処理はまた、Bucket という一連の Color によって定義付けられるデータを利用します。ここで、Color は RGB 値（postfix rgb によって表される）または transparency 値（postfix α によって表される）のどちらかで表されます。さらに、我々は方向（Dir）というデータ型を必要とします。dir は北（N）、東（E）、南（S）、西（W）のいずれかの値をとります。

**4.1. 状態

RNA を解釈する間、かなりの量の内部状態を表す変数が利用されます。状態を構成するそれぞれの要素は、グローバル変数に保存されます。図18にそれぞれの構成要素の初期値を示します。

一連の color を保存する変数 bucket は空の状態で初期化されます。この bucket がどのように動くかについてはセクション3.4で説明します。変数 position は現在処理している RNA の位置を意味し、ちょうど左上の角にあたる (0, 0) の位置で初期化されます。位置を示す変数としてはもうひとつ、mark と呼ばれるものがあり、これもまた (0, 0) の位置で初期化されます。現在の方向を示す変数 dir は東（E）で初期化されます。この変数はビルド・プロセスの焦点が次にどの方向へ変わるかを表します。

position とmark、そして dir は移動と描画に関する RNA コマンド（それぞれセクション4.4, 4.5で記述される）で使用されます。

そして、一連のビットマップが変数 bitmaps に保存されます。bitmaps は完全に透明なビットマップをひとつ含みます。完全に透明なビットマップとはすなわち、すべての正常な位置オブジェクト p において、transparentBitmap@p = (black, transparent) を満たすようなビットマップのことです。セクション4.6では、一連のビットマップがどのように使われるかについて説明します。

（図17. 座標, 色, ビットマップ）
（図18. ふーんアセンブルにおける状態の初期化）

**4.2. RNA の処理

RNA を処理するフェイズにおける主な関数を図19に示します。その構造は単純です。最初に、入力として rna を読み込みます。このとき、グローバル変数 rna は、前のチャプタのプログラムによって出力された RNA 命令を含んでいるでしょう。

一連の RNA 命令は、左から右へ読み込まれます。我々は順番にそれぞれの命令 r を分析します。Arrow は我々に、ふーんアセンブルに不可欠であるらしい 20 の RNA コードに関する情報を提供してくれました。命令 r がそれら既知の RNA コードのうちのひとつであるならば、我々は状態を更新するなんらかの処理を行います。もし命令 r が未知のものであるならば、我々はそれを無視して次に進みます。

（図19. RNA からふーんをビルドする）

処理の終わりに、我々は一連の bitmaps から最初のひとつに注目し、それを画像として描きます。結果として生じる画像は bitmaps[0] に含まれる RGB値 によって決定されます。bitmaps[0] に含まれる Trancparency値 は無視され、画像の描画においては完全に不透明なもの（255）として処理されます。

既知の RNA 命令は、4つのグループに分類することができます。そのグループとは、bucket に影響を及ぼすもの、焦点を変えるもの、画像を描画するもの、そして bitmaps に影響を及ぼすものです。それぞれの命令のグループに関する詳細を、以下のセクションに示します。

**4.3. Bucket コマンド

既定の8個の color と2個の transparency 値のために、既定の Color を bucket の先頭に追加する命令が存在します。この命令は図20に示す addColor 関数を使用します。また、命令 &#039;PIIPICP&#039; は bucket を空にします。

bucket は pixel に関する情報をエンコードします。ここで、pixel とは現在の color と transparency 値を意味します。addColor と共に図20に示される関数 currentPixel は、この Pixel の値を決定するために使用されます。

（図20. 色バケツ）
（図21. currentPixel のためのサンプル）

現在のアルファ値 a_c は bucket のすべての transparency 値の平均です。もし bucket に transparency 値が存在しなければ、アルファ値 a_c は不透明なピクセル（255）と見なされます。

それぞれの color component は、現在 bucket の中にある color components の値の平均となります。そして、それらの color component は現在の transparency 値によってノーマライズされます。変数 bucket が空のとき、currentPixel 関数は (black, opaque) という黒くて不透明な pixel を返すことに注意してください。

currentPixel は、bucket に含まれる一連の Component の平均を計算するために average 関数を使用します。もし Components が空であれば、この関数はデフォルトの値を返すでしょう。さもなければ、average 関数はそれぞれの component を合計し、さらに components の個数で割り、切り捨てたあとの値を返します。図21に currentPixel の呼び出し例を4つ示します。それぞれの例は異なった bucket を生成するでしょう。

（図22. 焦点の移動）

**4.4. 移動コマンド

命令 &#039;PIIIIIP&#039; は dir の現在の値に応じて位置を変更します。現在の位置と方向があれば、図22に示される関数 move は新たな位置を返します。例えば、もし方向が東で、現在の位置が (324, 210) であったならば、新たな位置は (325, 210) になります。もし新たな位置が不正であるならば（ビットマップの領域外にあるならば）、我々は新たな位置を逆側に設定します。例えば、(100, 0) の位置から北に移動する場合、新たな位置は (100, 599) として与えられます。

RNA コード &#039;PCCCCCP&#039; は方向を反時計回りに回転させます。この回転のために関数 turnCounterClockwise が使用されます。例えば、現在の移動方向が南であるならば、新たな方向は東になります。

RNA コード &#039;PFFFFFP&#039; は方向を時計回りに回転させます。この回転のために関数 turnClockwise が使用されます。turnClockwise はちょうど turnCounterClockwise の逆の動作をします。例えば、現在の移動方向が南であるならば、新しい方向は西になります。

**4.5. Draw commands

**4.6. Bitmap commands    </description>
    <dc:date>2008-05-19T01:28:51+09:00</dc:date>
    <utime>1211128131</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/ranha-icfp/pages/21.html">
    <title>画像置き場</title>
    <link>https://w.atwiki.jp/ranha-icfp/pages/21.html</link>
    <description>
      生成物(画像)を置きましょう    </description>
    <dc:date>2008-05-18T17:07:19+09:00</dc:date>
    <utime>1211098039</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/ranha-icfp/pages/14.html">
    <title>2007/問題文/From DNA to RNA</title>
    <link>https://w.atwiki.jp/ranha-icfp/pages/14.html</link>
    <description>
      *3. DNA から RNA へ

右側の酵素に触れることにより、Fuun の DNA は変化しながら、RNA を作り出しはじめます。これを、「&quot;DNA文字列&quot;を実行する」と呼びます。泥臭いこと（化学的な意味で）は Arrow がよきにはからってくれるので、われわれはアルゴリズムの記述に専念することができます。以下は、Arrow によって与えられた（Fuun の DNA に関する）概要です。地球の変態諸氏の読みやすいように書き直してあります。

前述のとおり、DNA は図2で定義された塩基配列です。
塩基として I, C, F, P の4つが利用可能で、引用符によってDNA文字列であることを示します。例えば &quot;ICFP&quot; などです。結果として生成される RNA は、DNA 文字列のシーケンスです。

シーケンスは、DNA 文字列の実行にあたり重要な役割を担います。シーケンスは、ゼロかより多くの要素から成ります。シーケンスにおいての基本的な操作と、その記法を図3に示します。図3の操作はいずれも失敗せず、ゼロベースであることに注意してください。

サブシーケンス命令は、シーケンスの範囲外を指定したり、長さが 0 以下の範囲を指定したりすると、空のシーケンス ε を返します。範囲内を指定したとき、その部分をシーケンスとして返します。また、添字操作の例外としても ε を使います。図4は DNA 文字列に対して操作をするいくつかの例を示しています。

図5で与えられている DNA の実行の全体的な流れを見て見ましょう。このアルゴリズムは、21行目で宣言されているグローバルな DNA シーケンスに対して動作します。まず、初期 DNA が読み込まれます。初期 DNA は、コンテストの Web ページからダウンロードできる遠藤の DNA とあとに続く prefix（我々が求めることになっている）から成ります。

例外的な状態に至る（DNA 文字列が完全に消費される）まで、以下の3ステップが繰り返されます。

+DNA の接頭辞をパターンに変換(26行目)
+残りの DNA の接頭辞をテンプレートに変換(27行目)
+残りの DNA に対してパターンマッチを行い、テンプレートを使用して新しい DNA を生成

この手続きは、最終的な RNA 文字列を出力して、プログラムを終えます。そして、ビルドプログラムにその RNA 文字列を渡します。以降では、それぞれのステップを詳細に見ていきます。

**3.1 パターンの解読

図6にパターンの構文を示します。パターンは一連のパターンアイテムからなり、パターンアイテムには次の5種類があります。

-「I」, 「C」, 「F」, 「P」 からなる塩基アイテム（34行目）
-n 個の塩基をスキップするアイテム 「!n」 （35行目）
-DNA 配列 s を探すアイテム 「?s」 （36行目）
-グループを開閉する2つのアイテム 「(」 と 「)」 （37-38行目）

パターンの認識は関数 pattern によって実行されます。そして、それは図7に示されます。
関数 pattern はグローバル変数 dna を読み込み、その一部を消費します。そして、途中で局所変数 p にパターン（40行目）を保存します。現在のグループレベル（自然数）は、局所変数 lvl （41行目）に保存されます。変数を初期化した後はループに入ります。各々の繰り返しにおいて、我々は DNA の現在の prefix に従い分岐します。1つの分岐は、繰り返すたびに実行されます！

最初の4つのケースは、恒常的なアイテム（44-47行）を生成します。5回目の事例は、『スキップ』アイテム（第48行）を生成します。最初の『IP』を消費した後に、nat 関数は、dna から自然数 n を取得するために呼ばれます。nat 関数は、セクション3.2で記述されます。自然数 n は、『スキップ』アイテムのパラメータになります。

6回目の事例は『検索』アイテム（第49行）を生産します。このアイテムにはパラメータとして塩基シーケンスが渡されます。したがって、最初の『IF』とさらに1つの塩基を消費した後に、consts 関数（セクション3.2で記述される）は DNA 文字列化された塩基シーケンス s を検索するために呼ばれます。そして、それは consts 関数から発生するアイテムのパラメータになります。7回目の事例は『開いた』アイテム（第50行）を生産して、同時に lvl 変数を増加させます。

dnaの先頭が『IIC』または『IIF』（第51行）であるならば、8回目の事例に合致します。両方の場合とも、dna の先頭にある3つの塩基は削除されます。現在のlvlが0であるならば、パターン認識はこの点で終わります。そして、関数 pattern は p に代入されたパターンを返却します。lvl が正数であるならば、それはデクリメントされます。そして、『閉じる』アイテムが生産されます（第54行）。

（図7: パターン認識）
（図8: パターン認識の例）

dna の最初の3つの塩基が『III』であるならば、次の7つの塩基は RNA 命令を作って、出力シーケンス rna に加えられます。ここで、10個の塩基（3つの I と RNA 命令）が消費されます（第56行）。RNA 命令は DNA 変化プロセスの次の段階であり、チャプタ4で記述されています。

与えられた prefix のどれも合わないならば、DNA 解読の終わりも近いといえます。RNA を出力してプログラムを終了する関数 finish を呼ぶことによって、最後のケースは終了します（57行）。パターン認識の仕様では、与えられた prefix のどれも合わないか、認識プロセスが順調に進み、lvl が 0 と等しいときに繰り返しの始めに『IIC』または『IIF』と遭遇することによって、プログラムは終了します。pattern 関数によって返されるパターンの括弧は、常にバランスが保たれます。
図8は、pattern 関数の2つの例呼び出しを提示します。2番目のケースでは、次に記述される自然数エンコードを利用します。

（図10: テンプレート）

**3.2 ヘルパー関数群

ここでは、パターン認識とテンプレートの間で利用される nat と consts について記述します。どちらも、図9にあるように非常に似通った構造をしています。

関数 nat は、大域変数 dna から自然数を解読します。次のPまでのすべてを読み込みます。基本的に、I と F は 0 として解釈されます。P が見つかる前にDNA文字列が終了すれば（＝ DNA 文字列に P が含まれていなければ）、RNA 文字列を出力して終了します。関数 consts は塩基配列（つまり DNA 文字列）を解読します。DNA 文字列のはじめが &#039;IC&#039;, C, F, P からはじまれば、それを取り除いて再帰的に関数 consts を呼び出します。どれにも該当しなければ終了します。

**3.3 テンプレートの解読

DNA 文字列からテンプレートを解読するフェイズは、パターンを認識するフェイズとほとんど同様に行われます。テンプレートの構文は図10で説明されています。テンプレートは一連のテンプレートアイテムからなり、アイテムは次の3点を満たします。

-塩基を表すアイテム（78行目）は「I」「C」「F」「P」に一致する
（図11. パターン認識）
-保護レベル l 付きの参照番号 n のためのアイテム（79行目）は nl で表される
-参照 n の長さをエンコードしたアイテム (80行目)は |n| で表される

テンプレートの解読は、図11にあるようにtemplate関数で実行されます。1つの局所変数（Template:t）しか存在しないので、この関数の構造は pattern 関数よりも少し単純です。テンプレートのグループは存在しないので、現在のグループレベルの経過を追う必要はありません。

変数 t の初期化の後、残りのテンプレート解読はループによって行われます。それぞれのループにおいて、dna の現在の内容が解析されます。prefix に従い、分岐のうちひとつが選ばれます。定数アイテムを表すケース（85-88行目）と RNA を生成するケース（92行目）とそれ以外のすべてに対応するケース（93行目）は、pattern 関数（セクション3.1を参照せよ）と全く同様になっています。

『IF』または『IP』prefix で、『参照』アイテムは発生します: prefix を消費した後に、2つの自然数 l と n が DNA 文字列からデコードされ、セクション3.2の nat 関数に渡されます。そして、アイテム nl が発生します（第89行）。prefix『IIC』または『IIF』は、テンプレートの端をマークします。これらの prefix は消費され、t の現在の内容が template 関数から返却されます（90行目）。

prefix『IIP』は、『長さ』アイテム |n| を生成します。ここで、n は3個の塩基が取り除かれたあとに解読される prefix の長さを表しています（91行目）。

**3.4 パターンマッチング

関数 matchreplace は、図12に示されます。この関数は2つの引数として、DNA からデコードされた（そして削除される）パターン pat とテンプレート t を取ります。関数 matchreplace において、我々は pat と dna 文字列を読み込み、dna の内容と pat 中のパターンアイテムを照合しようとします。それぞれのパターンアイテムが適切に解析される間、我々は変数 i（98行目）にDNA文字列における現在の位置を保持します。

（図12. パターンマッチング）

マッチング処理を行っている間、我々は環境 e を作り上げます。環境は一連の DNA 文字列からなり、それぞれの文字列はグループ（「開く」アイテムと「閉じる」アイテムの間にあるすべて）にマッチした DNA の一部を表します。

局所変数を初期化したあと、それぞれの pat 中のパターンアイテム p は適切に考慮されます。塩基 b を表すパターンが DNA 文字列の現在の位置 i に存在するならば、塩基 b はマッチします。マッチすれば i はインクリメントされ、もしそうでなければ（あるいは位置 i が DNA 文字列の終端を越えていれば）、マッチは失敗し、我々は dna を更新することなく関数から抜けます。

「スキップ」アイテムがあれば、現在の位置はこのアイテムに従って調節されます（107行目）。もし新しい位置がDNA文字列の範囲を超えるのであれば、マッチは失敗します。

「検索」アイテムがあれば、我々は dna から文字列 s を検索し、最初に一致する部分を取り除きます。検索が成功し、n が 文字列 s の終端に続く最初の位置であるならば、我々は i を n に代入します（109-110行目）。もし、文字列 s が dna[i] に含まれないのであれば、マッチは失敗します。

「開く」アイテムがあれば、我々は現在の位置 i を開始位置 c に保存します（113行目）。

（図13. 置換）

「閉じる」アイテムがあれば、我々は対応する「開く」アイテムの位置を取得するために、変数 c を読み出します。その位置と現在の位置 i の間の範囲は、現在のグループにマッチするアイテムの部分を表します。そして、我々はこの範囲を環境 e に追加します。最後に、このグループが閉じられるので、c の最初のアイテムは取り外されます（114行目）。

もしパターンの終わりに達したならば、マッチは成功です。この場合、我々は dna（117行目）から現在の位置 i まですべてを取り除き、replace 関数を用いて、テンプレート t から生成された DNA 文字列とこれまでに集められた環境 e で置換します。

**3.5 置換

それでは、図13を見ながら置換の操作について考えましょう。この操作は引数として、テンプレート tpl （以前 DNA 文字列からデコードしたもの）と環境 e （マッチング処理が成功した結果）の2つを受け取ります。この操作の間、我々はアイテムごとにテンプレートを読み込み（122行目）、少しずつ DNA の置換部分 r を作ります。そして、それは結局グローバルな DNA 文字列 dna の先頭に付加されます。

アイテム b のため、我々は適用な塩基 b を置換文字列に追加します。また、「参照」アイテム nl のために、我々は環境の n 番目の要素を調べます。もし n が e の長さよりも大きいのならば、この検索が ε で終わることに注意しましょう。我々は protect 関数を使うため、それが r に追加される前に、結果として生じる文字列を l 回引用します。

「長さ」アイテム |n| のために、我々もまた環境のn番目の要素を調べて、その長さを算出します。n が範囲外の場合は長さを算出するとεが返されるので、そのような n の値が与えられた場合は長さは 0 となるでしょう。そして、我々はその長さを表す自然数を asnat 関数を用いてエンコードし、置換文字列に追加します。

**3.6 保護

関数 protect は、引数として レベル l と部分DNA文字列 d の2つを受け取ります。この関数は d を l 回 quote し、その結果として生じる文字列を返します。ここで、quote は、I を C で、C を F で、F を P で、そして P を &#039;IC&#039; で置換する関数を表します。

（図14: 保護）
（図15: 自然数のエンコーディング）
（図16: 完全な繰り返しの例）

**3.7 自然数のエンコーディング

asnat 関数は、ほとんど nat 関数の逆の動作をします。この関数は引数として数値 n を受け取り、数値をエンコードした結果として DNA 文字列を生成します。数値は最上位ビットを最後に置いたバイナリ表現でエンコードされ、0 は I、1 は C で置換されます。さらに、エンコードされた文字列は P で終端されます。

**3.8 サンプル

実行に関する説明のまとめとして、図16にいくつかのサンプルを示します。これは、パターンのデコードやテンプレートのデコード、そして matchreplace 以降の処理の間に、dna 変数がどのように変わっていくかを表すものです。    </description>
    <dc:date>2008-05-17T02:25:11+09:00</dc:date>
    <utime>1210958711</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/ranha-icfp/pages/20.html">
    <title>データ構造を考える</title>
    <link>https://w.atwiki.jp/ranha-icfp/pages/20.html</link>
    <description>
      endo.dnaの文字数は7523060字。

これだけの文字数を、例えばC++ならナイーブにstd::stringに持たせると
多分酷い事に成る。

なんせ行われる操作の殆どが文字の切り出し(部分文字列の取得)と連結だらけですもの。


取りあえずstd::stringは主な操作にどれくらいのオーダーがかかるのか、というのを
sgi stlのドキュメントを読んで考えてみる。

http://www.sgi.com/tech/stl/basic_string.html

Note that the C++ standard does not specify the complexity of basic_string operations.
In this implementation, basic_string has performance characteristics very similar to those of vector: access to a single character is O(1), while copy and concatenation are O(N).

ランダムアクセスはO(1)の定数時間で出来るらしいが、コピーと結合はO(N)掛かるとの事。
しかもこれ係数が分からん。
内部的にはvectorに似てるんですって。
substrとか何をしでかしてるのか分かりませんね。

で、ちょっと調べてみるとsubstrは内部的にコピーを行っているようなので、piece of adviceの最後に書かれていた
線形時間オーダーO(n)より良い計算量では無い。


だいたい内部構造がvectorとかいう時点で750万文字も持たせたくは無い。
さて、どうするか?    </description>
    <dc:date>2008-05-16T17:51:07+09:00</dc:date>
    <utime>1210927867</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/ranha-icfp/pages/11.html">
    <title>2007/問題文</title>
    <link>https://w.atwiki.jp/ranha-icfp/pages/11.html</link>
    <description>
      *問題文の訳おきば

-[[2007/問題文/Background]] (chap1)
-[[2007/問題文/Fuun DNA]] (chap2)
-[[2007/問題文/From DNA to RNA]] (chap3)
-[[2007/問題文/From RNA to Fuun]] (chap4)
-[[How to make Endo live(chap 5.) ]]
-[[A piece of advice(chap 6.)]]    </description>
    <dc:date>2008-05-16T17:44:16+09:00</dc:date>
    <utime>1210927456</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/ranha-icfp/pages/19.html">
    <title>pseudo code解説</title>
    <link>https://w.atwiki.jp/ranha-icfp/pages/19.html</link>
    <description>
      ちなみに、このPDFで書かれてる疑似コードはBNF(っぽい)
*疑似コード解説
**Fig2 DNAデータ型
 BASE ::= I | C | F | P
 DNA  ::= Base* (Baseの繰り返し)
 RNA  ::= DNA*  (DNAの繰り返し、DNAと同じ)

 DNA = array&lt;BASE&gt;
 RNA = array&lt;DNA&gt;
という事
**Fig3 シーケンス型
 X* X型の要素から成り立つシーケンス
 ε  空っぽのシーケンス
 x &lt;| xs 要素x + シーケンスxsで結合する
 xs |&gt; x シーケンスxs + 要素xで結合する
 xs &lt;&gt; ys シーケンスxs + シーケンスys
 xs[m..n] xsの部分シーケンスで index m 〜 index (n-1)
 xs[m..] xsの部分シーケンスで　index mから最後まで(index len-1)
 xs[n] xsのindex n(xs[n..(n+1)]とも書ける)。不正なindexの場合はε
 len xs シーケンスxsの長さ
**Fig5 DNAの実行
 global dna : DNA &lt;- ε(グローバル変数dnaを空に初期化)
 global rna : RNA &lt;- ε(グローバル変数rnaを空に初期化)
 proc execute () =
  dna &lt;- read(入力を読み込む　遠藤DNAの事か)
  repeat
    let p &lt;- pattern () (patternを呼び出し返値を得る)
    let t &lt;- template() (templateを呼び出し返値を得る)
    matchreplace(p,t) (2つの返値を引数としてmatchreplaceを呼び出す)
  end repeat


 proc finish () =
  write rna (rnaを書き出す)
  exit      (&quot;プログラム&quot;を終了させる)

**Fig6 パターン
 Pattern ::= PItem* (Pattern is array&lt;PItem&gt;)
 PItem   ::= Base (I | C | F | P　一つ)
           | !N   ( skip(N) )
           | ?DNA ( search(DNA) )
           | (    (groupのopen)
           | )    (groupのend)

**Fig7 Pattern評価
 function pattern () : Pattern =
  let p  : Pattern &lt;- ε;(Pattern型のローカル変数pを空に初期化)
  let lvl: N       &lt;- 0;(現在のグループ数を表す自然数lvlを0で初期化)
  repeat
    case dna starts with
      &#039;C&#039;         =&gt; dna &lt;- dna[1 . . ]; p &lt;- p |&gt; I
      &#039;F&#039;         =&gt; dna &lt;- dna[1 . . ]; p &lt;- p |&gt; C
      &#039;P&#039;         =&gt; dna &lt;- dna[1 . . ]; p &lt;- p |&gt; F
      &#039;IC&#039;        =&gt; dna &lt;- dna[2 . . ]; p &lt;- p |&gt; P
      &#039;IP&#039;        =&gt; dna &lt;- dna[2 . . ]; let n &lt;- nat (); p &lt;- p |&gt; !n
      &#039;IF&#039;        =&gt; dna &lt;- dna[3 . . ]; let s &lt;-consts (); p &lt;- p |&gt; ?s
      &#039;IIP&#039;       =&gt; dna &lt;- dna[3 . . ]; lvl &lt;- lvl + 1; p &lt;- p |&gt; (
      &#039;IIC&#039;|&#039;IIF&#039; =&gt; dna &lt;- dna[3 . . ]
                     if lvl = 0
                     then return p
                     else lvl &lt;- lvl -1; p &lt;- p |&gt; )
                     end if
      &#039;III&#039;       =&gt; rna &lt;- rna |&gt; dna[3..10];dna &lt;- dna[10..]
       anything else =&gt; finish ()
    end case
  end repeat

&#039;III&#039;の部分からも分かるが、rnaに対してdnaは要素(operator |&gt; と &lt;|)
なので RNA is array&lt;DNA&gt;

**Fig9 DNAデコーディングの為の補助関数
 function nat () : N = (返値は自然数)
  case dna starts with
    &#039;P&#039;      =&gt; dna &lt;- dna[1..]; return 0
    &#039;I&#039;|&#039;F&#039;  =&gt; dna &lt;- dna[1..]; let n &lt;- nat (); return 2*n
    &#039;C&#039;      =&gt; dna &lt;- dna[1..]; let n &lt;- nat (); return 2*n + 1
    nothing (i.e., is empty) ) =&gt; finish ()
  end case

 function consts () : DNA = (返値はDNA)
  case dna starts with
    &#039;C&#039;  =&gt; dna &lt;- dna[1..]; let s &lt;- consts (); return I &lt;| s
    &#039;F&#039;  =&gt; dna &lt;- dna[1..]; let s &lt;- consts (); return C &lt;| s
    &#039;P&#039;  =&gt; dna &lt;- dna[1..]; let s &lt;- consts (); return F &lt;| s
    &#039;IC&#039; =&gt; dna &lt;- dna[2..]; let s &lt;- consts (); return P &lt;| s
    anything else =&gt; return ε
  end case

**Fig10 テンプレート
 Template ::= TItem*
 Template is array&lt;TItem&gt;

 TItem ::= Base(塩基)
         | N^N(保護レベルlのreference numberはn^lと書かれる Nは自然数を表す)
         | |N|(reference nの長さをエンコードする要素で|n|と書かれる)

**Fig11　テンプレート評価
 function template () : Template = (返値はTemplate)
  let t : Template &lt;- ε;
  repeat
    case dna starts with
      &#039;C&#039;           =&gt; dna &lt;- dna[1..]; t &lt;- t |&gt; I
      &#039;F&#039;           =&gt; dna &lt;- dna[1..]; t &lt;- t |&gt; C
      &#039;P&#039;           =&gt; dna &lt;- dna[1..]; t &lt;- t |&gt; F
      &#039;IC&#039;          =&gt; dna &lt;- dna[2..]; t &lt;- t |&gt; P
      &#039;IF&#039;|&#039;IP&#039;     =&gt; dna &lt;- dna[2..]; let l &lt;- nat (); let n &lt;- nat (); t &lt;- t |&gt; n^l
      &#039;IIC&#039;|&#039;IIF&#039;   =&gt; dna &lt;- dna[3..]; return t
      &#039;IIP&#039;         =&gt; dna &lt;- dna[3..]; let n &lt;- nat (); t &lt;- t |&gt; |n| 
      &#039;III&#039;         =&gt; rna &lt;- rna |&gt; dna[3..10]; dna &lt;- dna[10..]
      anything else =&gt; finish ()
    end case
  end repeat

**Fig12　パターンマッチング
 Environment ::= DNA* (Environment is array&lt;DNA&gt;)

 proc matchreplace (pat : Pattern, t : Template) = (引数はPattern型とTemplate型)
  let i : N  &lt;- 0
  let e : Environment &lt;- ε
  let c : N* &lt;- ε (c is array&lt;N&gt;)
  foreach p in pat(foreach文は分かる?　分からなかったらRuby,Python,C#あたりとセットでググる)
    case p is of the form
      b =&gt; if dna[i] = b
           then i &lt;- i + 1
           else return
           end if
     !n =&gt; i &lt;- i + n
           if i &gt; len(dna) then return end if
     ?s =&gt; if there is a smallest (n : N) such that n &gt;= i and s is a postfix of dna[i..n]
           (index i以降で最初に文字列sが出てくる場所を探し、文字列sの最後の文字のindex+1をnとする。失敗する可能性もある)
           then i &lt;- n
           else return
           end if
      ( =&gt; c &lt;- i &lt;| c
      ) =&gt; e &lt;- e |&gt; dna[c[0]..i]; c&lt;-c[1..]
    end case
  end foreach
  dna &lt;- dna[i..]
  replace(t,e)
  return

**Fig13　置換
 proc replace (tpl:Template, e:Environment) = (引数の型はTemplate型とEnvironment型)
  let r : DNA &lt;-　ε
  foreach t in tpl
    case t is of the form
      b   =&gt; r &lt;- r |&gt; b
      n^l =&gt; r &lt;- r &lt;&gt; protect(l,e[n])
      |n| =&gt; r &lt;- r &lt;&gt; asnat(len(e[n]))
    end case
  end foreach
  dna &lt;- r &lt;&gt; dna
  return

**Fig14 保護
 function protect (l : N, d : DNA) : DNA = (引数の型はN,DNA　返値の型はDNA)
  if l = 0
  then return d
  else return protect(l−1,quote(d))
  end if

 function quote (d : DNA) : DNA = (引数の型はDNA,返値の型はDNA)
  case d starts with
    I =&gt; return C &lt;| quote(d[1..])
    C =&gt; return F &lt;| quote(d[1..])
    F =&gt; return P &lt;| quote(d[1..])
    P =&gt; return &#039;IC&#039; &lt;&gt; quote(d[1..])
    anything else =&gt; return ε
  end case

**Fig15　自然数エンコード
 function asnat (n : N) : DNA =
  case n is
    0 =&gt; return &#039;P&#039;
    positive even =&gt; return I &lt;| asnat(floor(n/2))
    positive odd  =&gt; return C &lt;| asnat(fllor(n/2))
  end case

floor関数は、与えられた数を超えない最大の整数の事。
普通のプログラミング言語では 整数/整数 の演算は切り捨てられるので
単に割れば良いだけかもしれない。

ただ、 n&gt;&gt;1　にはするべき。    </description>
    <dc:date>2008-05-16T12:11:23+09:00</dc:date>
    <utime>1210907483</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/ranha-icfp/pages/15.html">
    <title>2007/問題文/Fuun DNA</title>
    <link>https://w.atwiki.jp/ranha-icfp/pages/15.html</link>
    <description>
      *Fuun DNA
Fuun DNAは、有限長の連続する4種の塩基から成り立っている。
ここでいう4つの塩基とは
 I(infinine), C(continuine), F(functorine), P(polymorphine)
の事である。
地球でのDNAとは、build planを圧縮したプログラムで、実行するとRNAを生成する。RNAは順番にタンパク構造に指示し、タンパクは全生物の品種の構造区画を構築します。

Fuunの為に、状態はほぼ同様ですが、2,3の例外が存在します。
+RNAを生産する際に、Fuun DNAを実行するとDNA自体を操作することになります。人間の場合と同じく、Fuun RNAタンパクの生成・合成を指示し、生きている状態で終了します。
+Fuun DNAはもう一つの一部を変えることが可能です。これは、もうひとつへのprefixとしてのDNAを用いることで達成されます。もう一つのFuun DNAにFuun DNAを前に付加することは、やや異なったFuunを生成します。
+Fuun DNAは作用するだけでなく即座に環境に適応するという驚くべき特徴を備えています
+地球の生物に反して、Fuunは知的デザインの結果としてそうなったと仮定されます。Endoを変える計画を助けてくれるプレゼントして、ArrowはDNAの中に作者からの「メッセージ」が含まれているかもしれない。そして、遺伝子がすでに存在するかもしれないという事実がある。とヒントを出しています。なので、我々はそれを信用しています。
我々は構築プランの作成と、その実行をシュミレートする方法を知っています。我々には、Endoをアセンブルする能力が欠如しています。Arrowはそれをすることができます。幸いにも、生物形態と、その環境の二次元の画像として、Arrowは視覚的にFuun DNAを適用する方法を説明してくれました。我々はEndoのDNAを持っており、現在の状態を視覚的に表現した画像を持っています。
Arrowは、Endoの最適修正を視覚化した「目標」画像も備えていました。完全に目標にマッチしない間、我々はEndoの生き残りの可能性をあげるため、なるべく間近まで行かなければなりません。
再連続しているDNAは、危険な事柄であり、より長いものはprefixである、より高いものは変化が失敗するという、あるいは、Endoの心が回復不能なほど損害を受けるという可能性があります。したがって我々は、出来る限り密接に目標にマッチさせるだけでなく、出来る限り短くもあるDNA prefixも見つけなければなりません。
また、再連続しているDNAは、多くのエネルギー（Arrowが損害を受けた状態があればそれは同様に不十分なリソースです）を消費して、更なる制約に至ります。
図1は、DNA変化プロセスの2段階的な構造を表します。我々は、2つの段階を2つのプログラムのパイプラインと言います。
以降は、方法に関する情報を提供します。
----
**図2:DNAデータ型
+Base ::= I|C|F|P
+DNA ::= Base*
+RNA ::= DNA*

**図3:シーケンスの種類
+X* タイプXの要素によるシーケンスのタイプ
+ε 空シーケンス
+x＜xs シーケンスxsの&quot;前&quot;に要素xを付加
+xs＞x シーケンスxsの&quot;後&quot;に要素xを追加
+xs◇ys 2つのシーケンスxsとysを連結
+xs[m..n] xsの結果は、index mからindex nの一つ前(つまりindex (n-1))。決して失敗しない
+xs[m..] xsの結果(mで始まる)(xs[m..len xs]の省略形)
+xs[n] 第n番目の要素(ひとつの要素 xs[n..(n + 1)])またはε
+len xs シーケンスxsの長さ

-DNAをRNAに変化させてください。(プログラムの実行についてはchap3)
-画像を生成することで、RNAから生合成をシュミレーションしてください。(プログラムの構築についてはchap4)
-特定のDNA prefixを与えられるEndoの生き残りの可能性を推定して、そのようなprefixを我々に提出してください。(chap5)
-元のDNA文字列で始まって、我々がこの説明を集めている間、我々自身実行することができた微小な実験に基づいてください。(chap6)    </description>
    <dc:date>2008-05-16T09:35:16+09:00</dc:date>
    <utime>1210898116</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/ranha-icfp/pages/18.html">
    <title>A piece of advice(chap 6.)</title>
    <link>https://w.atwiki.jp/ranha-icfp/pages/18.html</link>
    <description>
      *A piece of advice(ちょっとしたアドバイス)
遠藤を助けようとしているあなたに、最高の謝意を表します。

私達が助けに応えるべくこの詳細とインフラストラクチャーを準備している間に、
不幸にも遠藤のDNAを自力で少々解析する事になってしまいました。
しかし、私達はあなた方と共有したい少数の事柄を発見したのです。

まず、DNA文字列から遠藤を合成し出す事は非常に複雑で、
プロセスのシミュレーションでさえ効率的な実装を要求します。

アイディアを与えるならば、遠藤のDNA実行で、executeは1891886 iterations呼ばれ、
302450のRNAコマンドを生成し、そのコストは192646205にも及びます。
特別重要に思われるのは、skipsと、unquoted references(何の事やら)との結合の2つの実行が線形時間よりも
良く(多分対数時間)で実行される必要があるという事。

次に、私達は次のprefixを使った時に気になる事が起こるのに気がついたのです
	IIPIFFCPICICIICPIICIPPPICIIC
幸運を、そしてモーフィングを楽しんで！！    </description>
    <dc:date>2008-05-16T02:16:52+09:00</dc:date>
    <utime>1210871812</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/ranha-icfp/pages/16.html">
    <title>How to make Endo live(chap 5.)</title>
    <link>https://w.atwiki.jp/ranha-icfp/pages/16.html</link>
    <description>
      *5 How to make Endo live(如何にして遠藤を生かすか)
我々の仕事は遠藤を生かすDNA prefixを作る事である。
遠藤のオリジナルDNAは&quot;source&quot;image(ページにある画像の事か?)を生成する。
あなたのオリジナルDNAが後に続くあなたのprefixは、出来るだけtargetの画像に近い方が良い。
(つまり、我々がRNAに変換すべきはnewDNA = prefix+DNA)

加えて、あなたのprefixは長く無い方が良い。
それから、遠藤を修正するプロセスは多くのエネルギーを消費する様なものでは良く無い。
本セクションでは、あなたの戦略を如何に評価するかについて説明する。

**5.1 Risk of a prefix(prefixの危険性)
prefixはriskをはらんでいる。
riskは自然数で、低いriskではより遠藤の生存率が有る。
riskは次の様に定義される
	risk = 10*(不正なピクセル数)+prefix長
さて、不正なピクセルというのは、画像の206ライン上RGB値がtarget画像とずれている様なピクセルである。
注意すべきはdrawコマンド時のbitmaps[0]の透明値は255になるということ、
で、(0,0)は左上、(599,599)は右下です。
prefix長とは、prefixを構成するI,C,F,Pの数である。
**5.2 Resource limitations(限られた資源)
risk値に加えて、資源制約についても扱わなければならない。
Arrowは最終プロセスを実行し、僅かのエネルギーしか残されていない。
そういうわけで、我々はEndoを助ける前にエネルギーを使い切る様なprefixを送る事は出来ない。

次の2つの制約がある。
1.DNA文字列長は、実行時のどの段階においても2500万文字を超えてはいけない。
2.DNAコストエネルギーの検査と見積もり。プロセス実行中に、我々は3*10^9を超え無いcostコンテナを持っている。
+patternかtemplateの中で、一つの塩基は1コストを消費する。
+matchreplace時に、
++現在の塩基と定数塩基を比較する時にコスト1
++サーチの成功でコストn - i,109ラインが評価された後(??)
++サーチの失敗ではDNA長 - i,109ラインが評価された後(??)
++skipsはコスト0
+1以上のレベルのprotect呼び出しにおいて、返されるDNA文字列の長さと等しいコストが必要。だが、protectレベル0の呼び出しにおいてはコストは不要。

prefix+DNAの実行と作成においては上記の制約を満たすもののみ、
Arrowはprefixを適用させる。
制約を満たさない場合、エネルギーの大きさから排除されてしまう。
最低限のリスクの、制約を満たすコンテスト期間中に受け取ったprefixは、
遠藤を助ける為に有効手段として用いる。

その様なprefixを送ったチームの勝利である。
**5.3 submission procedure(提出手続き)
さて、ここまでで我々はふーん星人のDNAがどのように働くかを解明してきた。
ここからはあなた次第です。

しかしながら、私達はあなたがたが生み出すDNA prefixに興味がある。
ですから、&quot;prefix&quot;だけを我々に送ってください。その他はいらないので。

私達は自動的に送られてきたprefixに遠藤のDNAをくっつけてArrowで実行します。
prefixは登録済みのチームがコンテスト期間中にアップロードする事が出来ます。
何度でも送れます！
提出時に、あなたのprefixリスク値が計算され、少し後に有効になります。
コンテストの終了時、私達は各々のチームで最もリスク値が低かったDNA prefixを
取り扱います。

コンテスト期間中、中間結果をスコアボード上で見る事が出来ます。
他のコンテスト参加者にはあなたの提出物以外に何の情報も出しません。
とりわけ、あなたの送ったprefixの生成する画像を他のチームが見る事は出来ません。

有効な提出とは、大文字のI,C,F,Pを含むASCIIテキストファイルである、という事です。
もし他の文字、空白でさえも、含んでいた場合は受理されません。
prefixを含むファイル名はprefix.dnaと呼ばれるべきで、そのファイルだけを含む
zipを提出してください。    </description>
    <dc:date>2008-05-16T01:36:09+09:00</dc:date>
    <utime>1210869369</utime>
  </item>
    <item rdf:about="https://w.atwiki.jp/ranha-icfp/pages/1.html">
    <title>トップページ</title>
    <link>https://w.atwiki.jp/ranha-icfp/pages/1.html</link>
    <description>
      *とりあえず
-2007年度問題文の翻訳まとめ [[2007/問題文]]    </description>
    <dc:date>2008-05-16T00:53:32+09:00</dc:date>
    <utime>1210866812</utime>
  </item>
  </rdf:RDF>
