〜 解くまでに 23年かかった 思い出の記録 〜







  若い時、初期の 8bit のPCを持ってからは 色々とプログラムを組んで遊んでいた時期があった。

  一番 印象に残っているプログラムが、虫食い算パズルを解くものだった。
  OS-9 /BASIC09 という PASCALライクな 構造化 BASICで、リカーシブ(再帰)プロシジャーで作成した。
  再帰プログラムとは、自らのルーティンの中で、更に自分自身を呼び出す、という、プログラミングの醍醐味を味わえる作り方だ。

  虫食い算とは、数字の部分が虫に食われて判明出来ず、残された文字を手掛かりに 全体を復元する、というパズルで、
  掛け算の数字が虫食いになったものが、解きがいのある難しいパズルだった。

  思い入れが強いのは、「ムズカル」 という難問を、本来なら解けるものが、マシンの能力が足りずに解けなかったこと。
  これを23年ぶりに解いた思い出の記録を ページにした。









23年ぶりに、自宅のパソコンで解を見ることが出来た!     2011年6月1日


昔、科学雑誌 「クォーク」別冊に、芦ヶ原伸之が、7桁 x7桁の、丸尾学 「ムズカル」 という 「虫食い算」 を紹介した。
これは(当時の)中型コンピューターでも解けないだろう!これを解いてみろ!  との挑戦で発表された。


  これが「ムズカル」

        * * * * * * *
      x * * * * * * *
 ------------------------------
       * * * * * * * *
      * * * * * * * *
     * * * * * * * *
    * * * 0 * * * *
   * * * * * * * *
  * * * * * * * *
 * * * * * * * *
-------------------------------
 * 0 0 0 0 0 0 0 0 0 0 0 0 *



で、その挑戦に応じて、リカーシブ・プロシジャーによる解析プログラム ー頁末に収録ー を作った。
無駄な探索を省くアルゴリズムを考案した、自信の高速プログラムだ。



別紙の演習問題 (Read Me) を解かせたが、ムズカル以外は即・解が出たが、ムズカルは当時の8bit PC (富士通FM-11)ではパワー不足で解が出なかった。
その後、16ビットのMS-DOS用に書き換えてみたが、やはり無理だった。


事務所に初期の32bit (50Mz)が導入された際に思い出し、土曜出勤の日に 退社前にRUNし、月曜朝にチェックしたら、やっと見事解けていた。
解析終了までに、33時間01分14秒だった。


その後、すっかり忘れていたが、Twitter の@ksakabe 氏のFree Pascal のツイートで思い出し、
プログラムを探し出して、コンパイルをお願いした。

これで実行して、初めて自宅のミニタワーPC (DELL inspiron 530 : 3GHz) で、解を目にすることができた。
時間は、6分少々だった。

1988年にプロクラムを作ってから 23年目の 2011年のことだった。
乾杯!







     以下が、2011年6月1日にRUNした記念の結果

     (注: 漢字・カナ表示だったが、@ksakabe 氏にFree Pascal用に英文版に直していただいている。)



    +++                        +++
    +++  Solving the puzzle worm budget   +++
    +++      Multiplication          +++
    +++                       +++
    +++     a. udagawa : ver 2.2       +++
    +++  Long Integer (to 9 digit) version  +++

=> Enter string Data(The masked character is *. Type CR to quit.)

> *******
> *******
> ********
> ********
> ********
> ***0****
> ********
> ********
> ********
> *000000000000*
>

          * * * * * * *
          * * * * * * *
--------------------------------------------------------
         * * * * * * * *
         * * * * * * * *
        * * * * * * * *
       * * * 0 * * * *
      * * * * * * * *
     * * * * * * * *
    * * * * * * * *
--------------------------------------------------------
   * 0 0 0 0 0 0 0 0 0 0 0 0 *

Data is OK ? (Y/N/E) >y
If you want to display progress, enter digit(1--) >1

Start analysis10: 5: 8
 position-1=1 10: 5: 8
 position-1=2 10: 5:14
 position-1=3 10: 5:36
 position-1=4 10: 6:10
 position-1=5 10: 6:48
>> Found solution. 10: 6:55

              5 1 2 0 0 0 0
              9 7 6 5 6 2 5
--------------------------------------------------------
             2 5 6 0 0 0 0 0
            1 0 2 4 0 0 0 0
           3 0 7 2 0 0 0 0
          2 5 6 0 0 0 0 0
         3 0 7 2 0 0 0 0
        3 5 8 4 0 0 0 0
       4 6 0 8 0 0 0 0
--------------------------------------------------------
     5 0 0 0 0 0 0 0 0 0 0 0 0 0

 position-1=6 10: 7:43
 position-1=7 10: 8:38
>> Found solution. 10: 8:51

              7 2 3 4 1 9 7
              9 6 7 6 2 6 4
--------------------------------------------------------
             2 8 9 3 6 7 8 8
            4 3 4 0 5 1 8 2
           1 4 4 6 8 3 9 4
          4 3 4 0 5 1 8 2
         5 0 6 3 9 3 7 9
        4 3 4 0 5 1 8 2
       6 5 1 0 7 7 7 3
--------------------------------------------------------
     7 0 0 0 0 0 0 0 0 0 0 0 0 8

 position-1=8 10: 9:33
 position-1=9 10:10:28
End of analysis. 10:11:23

Enter string Data(The masked character is *. Type CR to quit.)
>




虫食い算パズルでは、「解は一つしかない」 のが パズル作品としての原則なのだが、「ムズカル」は残念ながら解が2つあった。
しかし、この難解さゆえに認めてあげることにしている。 しかし、どうやってこの問題を考えたのだろう?




  <参 考>

  このプログラムの使い方 (Read Me) 

 
虫食い算パズルの解法(かけ算)
        by
      A. Udagawa
   OS9/Basic09 ver 2.0 1988.6
   OS9 -> MS.DOS/Quick Basic 1989.12
   Quick Basic -> Turbo Pascal 1990.2 coded H.Takahashi
   ver 2.2 1992.12
------------------------------------------------------------------------

1.このプログラム( mushi.exe ver2.x )は、虫食い算という名称になっていますが、
  かけ算の虫食い算の他に、覆面虫食い算・覆面算にも対応しています。

2.このプログラムで解ける虫食い算等の規模は、9桁のかけ算までで,
  全体の式の形が横18字 X 縦12行以内です。

3.入力要求に対して、問題の文字列だけを左づめで入力します。
                          ~~~~~~~~~~
4.入力は,半角でも全角でも可能です.(ただし両者の混合はだめです.)

5.虫食い文字は、 * です。
  * と 0 - 9 の数字以外の文字は、覆面文字とみなします。

6.乗数に明らかにゼロがある場合は、それを明示して入力します。
  (例)
   ***                            ***
  x ***        この場合は、             x *0*      と、ゼロを
 ---------       中間行が3行で            ----------       入れた形に
   5**        はなく、2行   ------>         5**      直して入力
  **5          しかないので              **5        します。
 ---------                         ----------
 ******                          ******

7.進行状況の表示を指定できます。
  被乗数(第一行目)の先頭文字から末尾文字迄の各桁の変化を表示します。
  先頭ケタがレベル1であり、次がレベル2....となり、そのレベルを
  指定出来ます。指定なしの場合はリターン.
  (ケタ数の多い問題については、この機能を利用したほうがよいでしょう)


8.演習問題

(1) from 雑誌「クオーク」別冊

A. 加藤 徹 作

            A * * *                       Q U A R K
            A * * *                       P U Z Z L E
         ---------------                  -----------------------
            A * * *                       * * * * * *
           * A * *                       * * * * * *
            * * A *                       * * * * * *
         * * * A                       * * * * * *
        -----------------                   * * * * * *
         * * * A * * *                  * * * * * *
                                 ------------------------
                                 * 6 * 4 * 9 * 1 * 3 *




B. 丸尾 学 作

        6 * *                            Q U A R K
        * 6 *                            * * * * *
     --------------                         -------------------
       * * * 6                             * * * * *
      * * * *                             * * * * *
     6 * * *                             * * * * *
    ---------------                         * * * * *
     * 6 * * 6 *                         * * * * *
                                  ----------------------
                                  * E I N S T E I N *



              * * * * * * *
              * * * * * * *         超難問
        ----------------------------       「ム ズ カ ル」
             * * * * * * * *
            * * * * * * * *
           * * * * * * * *
          * * * 0 * * * *
         * * * * * * * *
        * * * * * * * *
       * * * * * * * *
      -----------------------------
      * 0 0 0 0 0 0 0 0 0 0 0 0 *


(2) from NIFTY SERVE

   A. 滝沢 作                        A. TETSU 作

             * N I F T Y *                 * * 酉 年 *
             * S E R V E *                    * * *
            ------------------                ----------------
            * * * * * * * *                 V * * * V
           * N N * * * * *                * * V * V
          * * I I * * * *                 * * * * V
         * * * F F * * *                ------------------------
        * * * * T T * *                  * * 酉 年 年 頭 *
       * * * * * Y Y *
      * * * * * * * *
      ------------------------------
      * * * * * * R R * * * * * *


(3)その他 ( 虫食算パズル700選より)

     が ん          た い い                   す き
     た ん           く の 日                    だ と
  -----------        ---------------               -----------------
    * * *          * * * *                  な い た
    * *          * * * *                  き み と
  -------------      * * *                   -----------------
  1 月 1 日      ------------------                き す し た
             1 0 月 1 0 日










 <資 料>


   虫食い算パズルを解く プログラムの ソース コード


  → 
リカーシブ・プロシジャーで書iいた解析プログラム (覆面算対応の汎用版) 


  このプログラムは、昔、パソコン通信 Nifty Serveの データライブラリ (プログラム・ ソ−ス)に tsukba85 のハンドルで登録した。
  当時私は、 米国のCompu Serve 会員で、それを真似た Nifty Serveが立上げられた時には、自動的に特別会員(SGC会員:Spesial Gest from CompuServe)になった。
 





   


2014年5月8日記

  宇田川 東