2012年8月26日日曜日

Variant 変数

数独解析にVBA言語を使う利点はいろいろあるが、プログラムする上で、Variant 型のデータ変数の便利さは、よくぞやってくれるという感謝に堪えない。この活用こそ、効率のよい数独の計算や表現を可能にするものであろう。


朝日新聞8月25日掲載 Be 数独夏休み特集の第1問の「次の一手」を掲載します。
といっても、ウオーミング・アップ★★と書いてあるように、大変やさしい問題です。

難易度は最低ですが、「見た目」は6問中最高点の41点でした。こんなに表出数が多いのに、なぜ?と不思議に思われる初心者の方もおられるかも知れませんが、麻雀をされる方ならもうお気付きのように、リャン・ウー・パー(2,5,8)の筋を配したチートイ(7対子)もどきの数字配列は滅多にお眼にかかれるものではありません。 


 次に全手筋51手を示します。表の見方は前回述べた通りです。



1   (3,5)= 1     B1   Block 2
2   (5,3)= 1     B1   Block 4
3   (2,1)= 2     B1   Block 1
4   (6,4)= 2     B1   Block 5
5   (8,9)= 2     B1   Block 9
6   (6,1)= 5     B1   Block 4
7   (8,6)= 5     B1   Block 8
8   (3,8)= 6     B1   Block 3
9   (9,4)= 6     B1   Block 8
10   (4,9)= 7     B1   Block 6
11   (8,2)= 7     B1   Block 7
12   (6,8)= 8     B1   Block 6
13   (7,3)= 2     B2   Block 7
14   (4,2)= 3     B2   Block 4
15   (9,3)= 3     B2   Block 7
16   (1,3)= 5     B2   Block 1
17   (6,9)= 6     B2   Block 6
18   (7,2)= 6     B2   Block 7
19   (9,6)= 9     B2   Block 8
20   (4,8)= 1     B3   Block 6
21   (8,4)= 1     B3   Block 8
22   (5,5)= 3     B3   Block 5
23   (8,8)= 3     B3   Block 9
24   (2,8)= 5     B3   Block 3
25   (4,1)= 6     B3   Block 4
26   (3,3)= 7     B3   Block 1
27   (4,4)= 9     B3   Block 5
28   (6,6)= 1     B4   Block 5
29   (9,9)= 1     B4   Block 9
30   (4,6)= 4     B4   Block 5
31   (5,7)= 4     B4   Block 6
32   (7,7)= 5     B4   Block 9
33   (1,7)= 7     B4   Block 3
34   (2,5)= 9     B4   Block 2
35   (6,2)= 9     B4   Block 4
36   (7,8)= 4     B5   Block 9
37   (2,4)= 7     B5   Block 2
38   (9,7)= 8     B5   Block 9
39   (1,1)= 9     B5   Block 1
40   (3,7)= 9     B5   Block 3
41   (1,4)= 4     B6   Block 2
42   (8,5)= 4     B6   Block 8
43   (2,2)= 8     B6   Block 1
44   (8,1)= 8     B6   Block 7
45   (3,2)= 4     B7   Block 1
46   (2,9)= 4     B7   Block 3
47   (9,1)= 4     B7   Block 7
48   (1,6)= 8     B7   Block 2
49   (7,5)= 8     B7   Block 8
50   (2,6)= 3     B8   Block 2
51   (1,9)= 3     B8   Block 3









2012年8月18日土曜日

「次の一手」のアルゴリズム

龍涎ソフトの「次の一手」には、プレイ機能があります。画面の盤面に答えを直接入力できます。「確認」ボタンは、正解と照合して誤りがあれば指摘します。また「次の一手」ボタンでは、どうしてそうなるかを盤面で説明してくれます。これらの操作はすべて前回の「フォント制御」によって、首尾よくプログラムされます。

では、どうして「次の一手」が、個々人によって、どこから埋めて行くのかわからないのに、指定できるのでしょうか?

朝日新聞8月18日 Be on Saturday の数独問題を例に取り説明しましょう。この問題は、表出数24個、したがって空白セル数 57個なので、全57手でFinal Answerに到達します。


1   (1,2)= 1     B1   Block 1
2   (9,5)= 1     B1   Block 8
3   (3,5)= 3     B1   Block 2
4   (5,6)= 1     B2   Block 5
5   (8,6)= 3     B2   Block 8
6   (2,3)= 5     B2   Block 1
7   (7,5)= 6     B2   Block 8
8   (6,9)= 1     B3   Block 6
9   (1,5)= 5     B3   Block 2
10   (9,2)= 5     B3   Block 7
11   (8,5)= 8     B3   Block 8
12   (2,7)= 1     B4   Block 3
13   (1,6)= 4     B4   Block 2
14   (5,4)= 5     B4   Block 5
15   (8,7)= 5     B4   Block 9
16   (9,8)= 2     B5   Block 9
17   (3,8)= 4     B5   Block 3
18   (5,5)= 4     B5   Block 5
19   (4,8)= 5     B5   Block 6
20   (2,6)= 6     B5   Block 2
21   (1,7)= 2     B6   Block 3
22   (6,5)= 2     B6   Block 5
23   (9,9)= 6     B6   Block 9
24   (2,9)= 8     B6   Block 3
25   (2,1)= 2     B7   Block 1
26   (4,5)= 7     B7   Block 5
27   (5,8)= 8     B7   Block 6
28   (8,3)= 2     B8   Block 7
29   (5,7)= 6     B8   Block 6
30   (2,4)= 7     B8   Block 2
31   (5,2)= 2     B9   Block 4
32   (5,9)= 3     B9   Block 6
33   (1,8)= 6     B9   Block 3
34   (4,1)= 6     B9   Block 4
35   (2,5)= 9     B9   Block 2   二重枠の解
36   (6,2)= 3     B10   Block 4
37   (7,7)= 3     B10   Block 9
38   (3,3)= 6     B10   Block 1
39   (6,8)= 7     B10   Block 6
40   (4,2)= 8     B10   Block 4
41   (1,9)= 9     B10   Block 3
42   (9,1)= 3     B11   Block 7
43   (3,7)= 7     B11   Block 3
44   (3,1)= 8     B11   Block 1
45   (7,3)= 8     B11   Block 7
46   (7,8)= 9     B11   Block 9
47   (8,1)= 4     B12   Block 7
48   (1,1)= 7     B12   Block 1
49   (3,2)= 9     B12   Block 1
50   (9,4)= 4     B13   Block 8
51   (7,9)= 4     B13   Block 9
52   (5,3)= 7     B13   Block 4
53   (7,2)= 7     B13   Block 7   二重枠の解
54   (9,3)= 9     B13   Block 7
55   (8,9)= 7     B14   Block 9
56   (5,1)= 9     B14   Block 4
57   (8,4)= 9     B14   Block 8

まず、最初の3手目までは、4列目が B1 と表記されています。これは、基本技 B 「ブロッケン」で最初から埋めることができる場所の数(No of Entrance B)が3か所あることを示しています。つまりこの3手はどれが第一手になってもよいわけで、三手目までは、3!=6 通りの取り方があります。  
 
 次に B2 は7手目まで4か所あります。これは、三手目までの結果を「反映」させると新たに、4か所取れるところができたということです。

 人間が鉛筆で書き入れて解く場合には、その都度結果を「反映」させます。また、1から順番に埋めていく人や表出数の多い順に埋める人もいます。つまり、手順の数は、
  3×4×4×4×5・・・・・・5×3=  3888万通りもあります。
どの道を選ぶかは、解き手の癖によって違います。

次の一手のアルゴリズムは、その一つの手順にそって正解がすでに盤面にあるかどうかを調べていきます。そして最初に出会った空白セルが次の一手です。もし、それが、次の一手のヒントで値を知りたいセルでなければ、そのセルより前に確定しなければならないセルが残されているということです。たとえそのセルの正しい答えを入れてやっても、必ずその空白セルに到達する筈です。これは、ある数字だけを追っかけるようなときしばしばおこります。

また、知らず知らずのうちに上位の技(V:いづれにしても理論など)を使った場合も同じです。もっと簡単に取れるのに見落としてしまったような場合です。その結果、うまくいけば、後はすいすいと決まるということもあります。

2012年8月15日水曜日

VBAで作る数独プログラム(Font制御)

「次の一手」の数独プログラムをExcel 2010を使って作成する方法について取り上げます。問題をインプットしておけば、iPhon アプリと同様に使うことができます。

 プログラム言語に VBA ( Visual Basic for Application ) を使うのは、どのパソコンにも付属ソフトとして、Excel が手軽につかえることや数独の盤面が容易に表計算画面に表現できることなどいろいろあります。   http://numberplace.blogspot.jp/2009/05/vba.html

便利は機能の一つは、Font でオブジェクト指向プログラムを制御できることです。前回の問題を再掲載します。

 
この盤面では、問題として最初から与えられている数字、表出数(ヒント、Givens)は、赤色(ColorIndex=3)、Font.size=18 で表されています。その後、わかったAnswer は、青色(Colorindex=5), Fontsize=14 で示されています。(実際に解く時に、同じ大きさの同じ色になるように、問題を入力した段階で、空白セルのFontを素のように設定しておきます)

ここで、行き詰まり「次の一手」を見る前に、(あるいは後に)候補の一覧表(candidate matrix を略して、candy matrix )を見たい時には、present_candy のマクロを使い表示したのが上の盤面です。
空白セルに入る候補の数字は、ピンク(ColorIndex=7)、Font.size=12で示されています。

候補を盤面から消したいときには、Clear_candy  をクリック、最初に戻りたければ、Back_to_original
をクリックします。

 この字体は Time New Roman ですが、字体によっても、Font 制御が可能ですし、さらには、セルの色 (Interior.ColorIndex)によっても多彩な識別色の表示が可能になります。

これからも、ときどき数独プログラムを書く時参考になる豆知識を掲載しますので、PC好きの高校生や情報処理の単位を取得した大学生の方は演習のつもりでチャレンジしてみてください。まずは、Sheet 1に盤面を作ってみてください。

2012年8月10日金曜日

朝日新聞 8月4日 Be ★4

ナンプレ・メモランダム(次の一手)では、実際の問題を例に取り、小学低学年の児童にもわかるようなナンプレ・ルールの分かりやすい説明図を考案することを目的にしている。そのため、ナンプレ本の見開きについている(文章の多い)ルール解説のどれよりも親切で納得する説明をナンプレ盤面図を多用していきたい。

まずは、例題として8月4日朝日新聞Be on Satuday からその雰囲気を味わってもらおう。以後、おいおい詳しい説明をすることにしよう。

パズル 1 
 
まず、基本技 B できまる数字が2か所あります。(詳しい説明は ナンプレメモランダム(格付け)などを参照下さい)
       第一手  (3,5)=1
       第ニ手  (9,4)=9
 この技は、ニコリ社発行の「数独通信」などでは、「ブロッケン」と呼ばれ、その探し方には、次の解説があります。


 この方法による第一手の表現を次のようにしました。



 上から2番目の黄色のブロック(これをBlock 2 と呼ぶことにします)の白いセル(マスとも言います)に注目します。このブロックの他の空白セルには、1 の数字が入らないことは、三個の 1 の表出数(赤い色のフォント18で表しています)を、矢印こそありませんが眼で追っていくだけでお分かりいただけるでしょう。

 同様に、第二手 ( 9,4)= 9 も、表出数 9に注目するだけですぐわかりますね。

 さて、第三手の次の一手は、次のように表示されます。

 
青色のフォント14で示された二つの数字は、第一手、第二手で決まった答えです。

第三手は、黄色で示した第八行(これを Row 8 と呼びます)の空白セルに注目します。Block 8には、すでに 6があるため、八行目の3つのセルにはいりません。同様に 6の数字を目で追うと結局、白色のセル
       第三手  ( 8, 7) = 6   ときまります。 
この技を Rで表します。ニコリ社では、「レッツミー」と呼んでいます。

このやり方で、進めていくと第13手の次の一手は次の盤面です。


 今度は、第三列( Column 3 )に注目します。これまでですでに、
            第四手 ( 5,8)=6
                                 第五手 ( 4,6)=6
                                 第十手 ( 9,3)=1
 が、きまっているので、これを考慮すると、
            第十三手  ( 7,3)= 6  となります。
 この技を C で表します。(ニコリ社では前と同様に「レッツミー」)

 これらの技を駆使して、第34手は次の一手になります。


        

  初心者の皆さんはここまでたどり着いたでしょうか?

 この段階で、すでに第一列、第三列、第七列で数字が埋まるのがわかる筈です。これは、使う技の順番をB,R,Cと決めているからです。実際、第三手のRも第一手であってもいいのです。ただ技を Bに固定すると、第三手で行き詰まり新しい技Rが次の一手として必要になるのです。

因みにこの段階での、候補の一覧( candy matrix) を示すと次のようになります。




  この他にも、小さなフォント12の 一つだけの候補 (2,6)=8 とか (6,8)=7 があるのを見つけられますか?

 この技は M (マスミー) と呼ばれる基本技の一つなのです。とかく終盤になると、技が重なり、数字はどんどん埋まっていきます。



































2012年8月8日水曜日

モーガン・ブーム

このブログは、ナンプレの指南書でもないし、解説書でもない。私には、おそらくわたしだけしか知らないと思っている知識を、それ見よがしにひけらかそうと思う気持ちは全くない。私が、図らずも経験してきた拙い人生のなかで、そういったことは、意図してきたことと正反対の効果しか及ぼさないことを学んで知っている。だから、これは単なる備忘録にすぎなく、タイトルにもはっきりとそれを謳っている。

サマセット・モームならきっとこんな切り口で書きだすに違いない。日本において、モームが一時期ブームとなったのは、その内容の面白さもさることながら、中野好夫さんの75調の名訳によるところが大きい。「モームとは俺のことかとモーガンいい」大学生の教読本、受験生の必読書、予備校のテクストなど、モームは好んで読まれていた。もう半世紀も前のことである。

2012年8月1日水曜日

The Summing Up

サマセット・モーム全集 第二十五巻 「要約すると」 中村能三訳 新潮社 昭和三十年五月三十日発行 定価250円 1955年11月30日京都・四条、駿々堂にて購入。掃部正。

 これは自叙伝でもなければ、回顧録でもない。わたしは生まれてきた間に、自分の身に起こったことを、何らかの形で、作品の中に書いてきた。自分の体験を主題に用い、その主題を描きだすために、一連の挿話を創作したこともあるし、もっとしばしば、軽い知り合い、あるいは親しくつき合った人物を拉し来って、創作中の人物の原型に用いたこともある。わたしの作品の中では、事実と虚構とが相混淆しているので、かえりみると、今では、その二つが自分でも区別できないほどである。・・・

この本では、わたしは今までの生涯で、自分が主として関心を持ってきた問題についての考えを、整理してみたいと思う。しかし、私がたまたま得た結論は、荒海に浮かぶ難破船の漂流物のように、わたしの心に漂っていたものだ。そういうものをある体系に整理するには、それらの真の姿を、もっと明確に自分の眼でみて、なにか統一したものを通さなければいけないように思えた。・・・

わたしは、長い間、心の中にわだかまってしこりのようになっていた考えを取り除きたいためにこのブログを書くのである。わたしは人を説得しようと思わないし、自分の知識を自慢するつもりは毛頭ない。わたしは教育家的本能は持っていないし、何か知っていることがあるにしても、それを他の人と共有しようという欲望は感じない。人が私の意見に賛成するかどうかなど気にしない。勿論、内容に関して正しいと思っている。また、自分の主張が一般の人の主張と違っているとわかっても、そう苦にはならない。わたしは、自分の考えが独創的でかつ重要なようなものであるかのように書くに違いない。そして、事実わたしにとっては、そうなのである。