最近の更新 (Recent Changes)

2014-01-01
2013-01-04
2012-12-22
2012-12-15
2012-12-09

Wikiガイド(Guide)

サイドバー (Side Bar)

← 前のページに戻る

ウルフラム氏のチューリングマシン

1. チューリングマシン

チューリングマシンというのは、イギリスの数学者であるアラン・チューリングが1936年に 提唱した計算機のモデルです。 数学的に検証するための基礎的な動作のモデルとして、 理想化、単純化された仮想的な計算機です。

チューリングマシンは、以下のような要素で構成されています。

1) 一本のテープ(長さは無限)

2) テープに複数種類(c色)のデータを読み書きする一個のヘッド

3) 計算機の内部の複数の状態(s個の状態)を保持するメモリー


チューリングマシンを動作させる場合は、まず、テープに問題を記述し、メモリを初期状態に設定します。

チューリングマシンは、起動するとテープを読み取り、その値とメモリのパターンに従って、メモリを操作して、テープを書き換え、 テープを左右どちらかにずらすか、または、そのままの位置に置きます。それをどんどん繰り返していきます。

このような単純な構成のチューリングマシンではありますが、なんと、あらゆる計算可能な機械と同等な計算を 実行することが可能な万能チューリングマシンが実現可能であることが証明されています。

つまり、コンピュータで計算できることはすべて、万能チューリングマシンでも計算できるということです。

2. もっともシンプルなチューリングマシン

チューリングマシンには、前項で説明したとおり、テープに書き込む複数の種類のデータと、メモリの取り得る複数の状態を持ちます。

- テープに書き込むデータの種類の数は、種類を色に例えてc色ということにします。

- メモリの取り得る状態の数は、s状態ということにします。

構成するcやsの値によって、チューリングマシンとして完全であるかどうかが決まります。

さて、ここでチューリングマシンを考えるとき、考えられるありとあらゆる計算問題を解く能力を持ち、 考え得る限りで最もシンプルな万能チューリングマシンとはどのようなものでしょうか?

それは、構成するcとsの値が最小になる万能チューリングマシンを求めることです。

いくつの状態と色を持ったチューリングマシンが、もっともシンプルで完全な万能チューリングマシンとなるかというのが問題なのでした。

3. ウルフラム氏のチューリングマシン

スティーブン・ウルフラム(Stephen Wolfram)が、2つの状態と3つの色を持つ装置が 最も単純な万能チューリングマシンだという仮説を立てました。

ウルフラム氏は、技術・科学計算ソフト「Mathematica」や ナレッジエンジン「Wolfram|Alpha」を開発した天才として有名な人です。

このようなウルフラム氏が、2つの状態と3つの色を持つチューリングマシンが、もっとも単純な万能チューリングマシンだと 考えたのですが、しかし、証明はしていませんでした。 そこで、2007年にウルフラム氏はこの仮説を証明した者に、2万5000ドルの賞金を払うとコンテストの開催を 広く呼びかけたのです。 そして、それからわずか47日後に、イギリスのバーミンガム大学コンピューター科学部の学生Alex Smithさん(20歳)が、 見事にこれを証明して見せました。

どちらも素晴らしいですね。

Alex Smithさんの実際の証明は次のリンクの先のPDFファイルにあります。

http://www.wolframscience.com/prizes/tm23/TM23Proof.pdf

4. 動作のルール

ウルフラム氏のチューリングマシンについては、次に示すリンクにコンテスト開催時のサイトがあります。

http://www.wolframscience.com/prizes/tm23/index.html

詳しくは中身を見てください。

まず最初に一番上に書いてある2段の箱の並びに注目してみましょう。これは、何でしょうか?

wtrule0.jpg

こんな感じの絵があるはずです。これが、2状態3色のチューリングマシンの動作のルールを示しています。

wtrule1.jpg

黒い三角は、状態を示します。上向きの三角▲は、状態1であることを示します。下向き三角▼は、状態2であることを示します。 状態は、チューリングマシンのメモリ内に保存され、参照することができます。

色は白、黄、橙の3色があります。 色は、チューリングマシンのテープに書き込まれる印を色で示します。

wtrule2.jpg

2段の箱は、上の段が現在のチューリングマシンの状態と、読み書きするヘッドの指すテープの色を示します。

2状態で3色なので6つのパターン(2x3)がありえます。

現在、上の段の箱のどれに相当するかによって、該当する下の段の箱の状態と色に変更されます。 また、ヘッドの位置も左右どちらかに動きます。 下の段でヘッドの位置を示す三角が、箱の左右どちらに描いてあるかによって、ヘッドの位置は決まります。

次の状態に遷移した後、新しいヘッドの示すテープの位置の色とメモリの状態によって、さらに次の動作を起こします。

これを自動的に繰り返していくことによって、チューリングマシンとしての計算を行っていくのです。

5. チューリングマシンの実装

では、チューリングマシンをデカルト言語で実装してみましょう。

ウルフラム氏の2状態3色のチューリングマシンだけではなく、汎用的なものにしようと思います。

まず、状態と色の表現をキャラクタ文字で表現できるように変えます。

wtrule3.jpg

状態は1,2のような数字で表します。色は、アスキーの記号文字で表現することとします。

ソース全体を次に示しましょう。


::<state
        <Tm 1 2 1 1 -1>;
        <Tm 1 1 1 2 -1>;
        <Tm 1 0 2 1 1 >;
        <Tm 2 2 1 0 1 >;
        <Tm 2 1 2 2 1 >;
        <Tm 2 0 1 2 -1>;
        <Tm #s #c #s #c 0>;
>;

::<TuringMachine
        <head 0>
        ;
        <state 1>
        ;
        <init>
                ::self <delVar tape>
                <set 0>
        ;
        <set #color>
                <head #head>
                ::self <setArray tape #color #head>
        ;
        <get #color #pos>
                ( <tape #color #pos>
                | <is #color 0>)
        ;
        <get #color>
                <head #head>
                <tape #color #head>
        ;
        <transition>
                <head #head>
                <state #state>
                <get #color #head>
                ::state <Tm #state #color 
                            #state1 #color1 #offset>
                <set #color1>
                <#head1 = #head + #offset>
                ::self <setVar head #head1>
                ::self <setVar state #state1>
        ;
        <printTuringMachine>
                <head #head>
                <state #state>
                <for (#i -19 19)
                        <get #color #i>
                        ( <compare #i == #head>
                          <printf <%_"1d"  #state>>
                        |
                          <printf " ">
                        )
                        (
                          <compare #color == 0>
                          <printf "_">
                        |
                          <compare #color == 1>
                          <printf "%">
                        |
                          <compare #color == 2>
                          <printf "#">
                        |
                          <#code = 0x37+#color>
                          <printf ::sys <concatcode _ (#code)>>                        )
                >
                <print>
        ;


>;

<wtu>
        ::TuringMachine <init>
        <for (#i 100)
                ::TuringMachine <printTuringMachine>
                ::TuringMachine <transition>>
        ;

? <wtu>;

5.1 チューリングマシンの遷移ルールのオブジェクト化

まず、チューリングマシンの遷移ルールを定めるstateオブジェクトを定義します。


::<state
        <Tm 1 2 1 1 -1>;
        <Tm 1 1 1 2 -1>;
        <Tm 1 0 2 1 1 >;
        <Tm 2 2 1 0 1 >;
        <Tm 2 1 2 2 1 >;
        <Tm 2 0 1 2 -1>;
        <Tm #s #c #s #c 0>;
>;

stateオブジェクトには、Tmメソッドが複数定義されます。このTmメソッドがひとつひとつのルールを示します。


       <Tm 元の状態 元の色 次の状態 次の色 次のヘッド位置のオフセット>

Tmメソッドは、状態と色が合致するかどうか上のルールから順番にパターンマッチで調べられていきます。

ヘッドの位置のオフセットは、左に1つ動かすのを-1, 右に1つ動かすのを+1とします。

<Tm 1 2 1 1 -1>は、メモリの状態が1、ヘッドの下の色が2の場合には、 次に、メモリの状態を1、ヘッドの下の色を1に変更した後、ヘッドを-1の方向に移動させます。

<Tm 1 1 1 2 -1>は、メモリの状態が1、ヘッドの下の色が1の場合には、 次に、メモリの状態を1、ヘッドの下の色を2に変更した後、ヘッドを-1の方向に移動させます。

残りも同様です。

このようにチューリングマシンの遷移するルールを記述していきます。

今回は2つの状態と3つの色ですから、2x3で6とおりのルールを記述します。

そのため、最後にある<Tm #s #c #s #c 0>のルールは、本来は不要なのですが、 このルールの意味するところは、これより上にあるルールと合致しないときには 停止させるためのものです。

任意の状態#sと任意の状態#cの場合に、次も同様に#s状態と#c状態のままにし、 なおかつ、ヘッドも動かさないので停止することになるのです。

なお、Tmメソッドへのアクセスは次のように行います。


          ::state <Tm 1 2 #s #c #h>

stateオブジェクトであることを"::state"で示し、それに続けてメソッドであるTmをパラメタ付で記述します。 実際に使用している記述は、次項で示すTyuringMachineオブジェクトの中で見ることができるでしょう。

状態1, 色2であるときの、次の状態と色とヘッドの位置が変数#s, #c, #hに返されます。

5.2 TuringMachineのオブジェクト化

チューリングマシンをTyuringMachineという名前のオブジェクトで作成します。


::<TuringMachine
        <head 0>
        ;
        <state 1>
        ;
        <init>
                ::self <delVar tape>
                <set 0>
        ;
        <set #color>
                <head #head>
                ::self <setArray tape #color #head>
        ;
        <get #color #pos>
                ( <tape #color #pos>
                | <is #color 0>)
        ;
        <get #color>
                <head #head>
                <tape #color #head>
        ;
        <transition>
                <head #head>
                <state #state>
                <get #color #head>
                ::state <Tm #state #color 
                            #state1 #color1 #offset>
                <set #color1>
                <#head1 = #head + #offset>
                ::self <setVar head #head1>
                ::self <setVar state #state1>
        ;
        <printTuringMachine>
                <head #head>
                <state #state>
                <for (#i -19 19)
                        <get #color #i>
                        ( <compare #i == #head>
                          <printf <%_"1d"  #state>>
                        |
                          <printf " ">
                        )
                        (
                          <compare #color == 0>
                          <printf "_">
                        |
                          <compare #color == 1>
                          <printf "%">
                        |
                          <compare #color == 2>
                          <printf "#">
                        |
                          <#code = 0x37+#color>
                          <printf ::sys <concatcode _ (#code)>>                        )
                >
                <print>
        ;


>;

最初のheadは、ヘッド位置を記憶しておくためのインスタンス変数として使います。 次のstateもインスタンス変数であり、状態を記憶させます。 前項で示したstateオブジェクトと同じ名前なのですが、混乱しないでください。 stateオブジェクトは、::stateとして使います。stateインスタンス変数は、TuringMachineオブジェクトの中で <state 状態>の形で使います。

初期値として、headは0, stateは1を設定してあります。


         <head 0>
        ;
        <state 1>
        ;

加えてインスタンス変数の配列として、テープを表すtapeも使うのですが最初は定義しません。プログラムの動作にしたがって、 tapeに値が書き込まれるたびに動的に生成されます。

ところで、";"セミコロンがあるのですが、これは注釈ではなく、定義の区切りを表します。 本来は、<述語定義> <述語> ... <述語>;の最後のセミコロンなのですが、プログラムの最後で独立させることに よって途中でプログラムの追加削除をやりやすくするためのコーディングの形式です。言語の文法的には、 述語の直後に付けてもよいのですが、このほうがプログラムの作成が容易になります。

次はinitメソッド述語です。 これは、テープを初期化するために使います。


        <init>
                ::self <delVar tape>
                <set 0>
        ;

delvarはシステム組み込みの変数や配列変数を削除するためのものです。 ::selfは、メソッドの所属するオブジェクトを指し、ここではTuringMachineオブジェクトを指します。 インスタンス変数であるtapeをすべて削除します。

setメソッド述語は、次に示しますが、tapeのヘッドの位置に、引数に指定された色を設定します。


        <set #color>
                <head #head>
                ::self <setArray tape #color #head>
        ;

まず、headでヘッド位置を#head変数に設定します。

次にシステム組み込み述語であるsetArrayでインスタンスの配列をインデックス#headの位置に #colorの値を設定します。この処理により、<tape 色 ヘッド位置>がTuringMachineオブジェクト内に生成されます。

getメソッド述語は、2引数の定義と1引数の定義をしています。


         <get #color #pos>
                ( <tape #color #pos>
                | <is #color 0>)
        ;
        <get #color>
                <head #head>
                <tape #color #head>
        ;

2引数の定義は、テープの任意の位置の色を取り出します。まだ何も書き込まれていない場所の色は、0を返します。

1引数の定義は、ヘッドの下の色を取り出します。

transitionメソッド述語は、1ステップの状態遷移を行う定義です。


        <transition>
                <head #head>
                <state #state>
                <get #color #head>
                ::state <Tm #state #color 
                            #state1 #color1 #offset>
                <set #color1>
                <#head1 = #head + #offset>
                ::self <setVar head #head1>
                ::self <setVar state #state1>
        ;

まず、ヘッドの位置、状態、ヘッドの下の色を取り出します。

そして、::state <Tm ~ >で次の状態、色、ヘッドの位置のオフセットを取り出し、 それに従って状態を遷移させます。

printTuringMachineメソッド述語は、テープをヘッドの前後19の長さの色と、ヘッド位置には状態を表示します。


        <printTuringMachine>
                <head #head>
                <state #state>
                <for (#i -19 19)
                        <get #color #i>
                        ( <compare #i == #head>
                          <printf <%_"1d"  #state>>
                        |
                          <printf " ">
                        )
                        (
                          <compare #color == 0>
                          <printf "_">
                        |
                          <compare #color == 1>
                          <printf "%">
                        |
                          <compare #color == 2>
                          <printf "#">
                        |
                          <#code = 0x37+#color>
                          <printf ::sys <concatcode _ (#code)>>                        )
                >
                <print>
        ;

5.3 wtu述語

wtu述語は、チューリングマシンを初期化して、100ステップ実行します。 for述語でループさせ、1ステップを実行するごとにテープのプリントとチューリングマシンの状態遷移を行います。


<wtu>
        ::TuringMachine <init>
        <for (#i 100)
                ::TuringMachine <printTuringMachine>
                ::TuringMachine <transition>>
        ;

? <wtu>;

最後の? <wtu>によって、プログラムの実行が開始されます。

6. ウルフラム氏のチューリングマシンの実行

初期状態1でテープがすべて0の場合の100stepの実行結果を以下に示します。


$ descartes wturing
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _1_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ %2_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _1% # _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _1_ # # _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ %2# # _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % _1# _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ %1_ % _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % %2% _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % #2_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % %1# # _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ %1% % # _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _1% # % # _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _1_ # # % # _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ %2# # % # _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % _1# % # _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ %1_ % % # _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % %2% % # _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % #2% # _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # #2# _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # _1_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # _ %2_ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # _1% # _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # #1_ # # _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # %2# # _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # % _1# _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # %1_ % _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # % %2% _ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # % % #2_ _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # % %1# # _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # %1% % # _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # #1% # % # _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % #1# # # % # _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % %1# % # # % # _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ %1% % % # # % # _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _1% # % % # # % # _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _1_ # # % % # # % # _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ %2# # % % # # % # _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % _1# % % # # % # _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ %1_ % % % # # % # _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % %2% % % # # % # _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % #2% % # # % # _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # #2% # # % # _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # #2# # % # _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # _1# % # _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # #1_ % % # _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # %2% % # _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # % #2% # _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # % # #2# _ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # % # # _1_ _ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # % # # _ %2_ _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # % # # _1% # _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # % # #1_ # # _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # % # # %2# # _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # % # # % _1# _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # % # # %1_ % _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # % # # % %2% _ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # % # # % % #2_ _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # % # # % %1# # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # % # # %1% % # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # % # #1% # % # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # % #1# # # % # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # %1# % # # % # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # #1% % % # # % # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # #1# # % % # # % # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % #1# % # % % # # % # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % %1# % % # % % # # % # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ %1% % % % # % % # # % # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ _1% # % % % # % % # # % # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _1_ # # % % % # % % # # % # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ %2# # % % % # % % # # % # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % _1# % % % # % % # # % # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ %1_ % % % % # % % # # % # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % %2% % % % # % % # # % # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % #2% % % # % % # # % # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # #2% % # % % # # % # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # #2% # % % # # % # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # #2# % % # # % # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # # _1% % # # % # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # #1_ # % # # % # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # # %2# % # # % # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # # % _1% # # % # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # # %1_ # # # % # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # # % %2# # # % # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # # % % _1# # % # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # # % %1_ % # % # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # # % % %2% # % # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # # % % % #2# % # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # # % % % # _1% # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # # % % % #1_ # # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # # % % % # %2# # _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # # % % % # % _1# _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # # % % % # %1_ % _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # # % % % # % %2% _ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # # % % % # % % #2_ _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # # % % % # % %1# # _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # # % % % # %1% % # _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # # % % % #1% # % # _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # # % % %1# # # % # _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # # % %1% % # # % # _ _ _ _ _ _ _ _ _ _
 _ _ _ _ _ _ _ _ _ _ _ _ _ _ _ % % # # # # %1% # % # # % # _ _ _ _ _ _ _ _ _ _
result --
        <wtu>
-- true