月別アーカイブ: 2022年1月

console.logの使い方

時々刻々の表示

JavaScriptでプログラミング開発するとき、console.logを使って途上のデータを表示すると効率的に完成させることができます。今回、console.logの使用中、腑に落ちない現象に突き当りました。のちのち、悩まないように記録に留めます。

まず、具体的なconsole.logの使い方を以下に挙げます。等差数列の総和を求めるには左のような式に着目すると容易に求めることができますが、今回は愚直にひとつひとつ加える方法を採用します。

一般的なconsole.logの使い方

<div id="result" style="width:350px; height:70px; font-size:48px; border:1px solid blue;"></div>
<script type="text/javascript" charset="utf-8">
let total=0;
  for(let i=0; i<=10; ++i){
    total = i;				//console.log(i, total);
  }
  document.getElementById("result").innerHTML = "Result="+total;
</script>

上記のコードを実行すると右のような結果が得られます。0から10までの総和にはなっていません。そこで5行の後にconsole.log文を入れて途中の状況を調べることにします。すると変数totalには総和というより制御変数iの値がセットされていることが判ります。

<div id="result" style="width:350px; height:70px; font-size:48px; border:1px solid blue;"></div>
<script type="text/javascript" charset="utf-8">
let total=0;
  for(let i=0; i<=10; ++i){
    total = i;
    console.log(i, total);
  }
  document.getElementById("result").innerHTML = "Result="+total;
</script>
5行目:  total += i;

赤字で示したように5行目に’+’が入力されていないことに気づきます。変数totalは合算された値しか必要ありませんが計算途中の値を表示させることによって誤りを見つけやすくしています。

単純なconsole.logの使い方では問題ありませんが、以下のように配列内容を表示させるとオブジェクト内容が表示され、デバッグ操作で配列の内容を表示させると最後に保持している値が表示されます。

JSON.parseとJSON.stringifyを使うと参照時そのときの値を表示させることができました。以下に使用例を掲げます。

即効的なconsole.logの使い方

<script type="text/javascript" charset="utf-8">
var array = [100, 90, 80, 70, 60, 50, 40, 30, 20, 10];
  console.log("即効的なconsole.logの使い方");
  help(array);
  console.log(array.length, array);
  for(let i=0; i<10; ++i){
    array[i] = i;
  }
  console.log("初歩的なconsole.logの使い方");
  console.log(array.length, array);
function help(par){
	console.log("Help par.length="+par.length+"  "+JSON.parse(JSON.stringify(par)));
}
</script>

JSON.parseとJSON.stringifyを使うと右図ように参照時点の即時データを表示させることができます。

JSON.parseとJSON.stringifyの文字列はかなり長いです。ソースコードを作る時の労力を緩和するためにhelp関数を作ってみました。

ご利用ください。

ぼやきと感謝

途中結果を知りたいのにいつも最終結果が表示され大いに悩みました。ネット上には同じ悩みを抱える同輩がたくさんいます。

適切な情報に出会えてありがたいです。感謝申し上げます。

ナンプレ(数独)研究


ナンバープレイス
ナンプレ(数独)研究©2022 TacM, Ver0.02

記述内容

ナンプレの入り口
解法のあらまし
❸単一候補検出(single candidate)
④二国同盟(Naked Pairs)

❸単一候補検出(single candidate)

前回は解法のあらましと81マスの呼び方についてまとめました。

今回は解法のなかで基本中の基本と言われる『単一候補検出(Single Candidate)』を前回に述べたアルゴリズムを具現化し、実際にプログラミングして易しい課題を解いてみることにします。

また、マス目の呼び方を変更したので行・列・ブロック説明図を右に再掲します。

解法のおさらい

single candidateは行・列・ブロックを包括的に眺めて、1~9の数字で使われていない最後の数字を引き当てて空マスを埋める方法です。

人間の目で行・列・ブロックを観察すれば必ず引き当てることができますが、確定数字が簡単に8になる課題は少なく7個以内の時に、調査した状況を候補として管理します。

81個のマスを目で追い、状況を頭に記憶することは至難の技です。このような場面において論理的思考を働かせてプログラミングを完成させましょう。

上の課題において、single candidate解法を用いてピンク色RC26の空マスに適切な数字を埋め込むに当たり、関係する領域は2行、6列、2ブロックです。

2行では2, 6, 7, 8, 9が、6列では1, 3, 5, 7, 8が、2ブロックでは1, 2, 7, 8, 9が既に使われているので最後の候補として4が確定します。

確定したマスは次に解析が進んだときは既知情報として利用します。

候補数が2以上ならばこれらの情報を管理下に置いて次に進みます。この処理をすべてのマスに適用します。

81マスまで解析が進んだとき、新規に埋め込んだマスが0ならばSingle Candidateではもはや解けない状況になっており、別の解法に進まなければなりません。



上記動作結果は81個のうち、39マスに数字が埋まっている状態(残42)でスタートし、1回目の挑戦で21マスが埋まり2回目の挑戦で13マスが解決、3回目で2マス解決し残7になったところで限界を迎えた例を示しています。

動作例と操作方法

以下にはHTMLプログラムコードが埋め込まれており、question-reidai2が課題として与えられていて初期画面が表示されています。

開始ボタンをクリックすれば、Single Candidate解法により正解が得られ、赤色縁取り文字で空マスが選ばれた数字で埋め込まれます。

右上のスピード調整ボタンにマウスをかざすと実行速度を変更することができます。

選択ボタンをクリックし、ファイル選択ボタンを押してCSVファイルから81個のナンプレ数字を読み込むことができます。

選択ファイルは何度でも読み直すことが可能で送信ボタンを押して開始に進むことができます。ファイル選択ダイアログを使えばローカルファイルを指定することも可能です。

開始ボタン直下のスピーカ―ボタンをクリックするとピッという進行音をミュートにできます。

動作例

課題ファイルの書式

課題はCSV形式で作成し指定したファイルを読み込みます。

課題例

 0, 0, 3, 0, 0, 0, 9, 0, 0
 4, 0, 0, 9, 5, 6, 0, 0, 3
 0, 0, 5, 1, 0, 8, 2, 0, 0
 9, 7, 4, 5, 6, 0, 3, 0, 0
 2, 3, 8, 7, 4, 9, 0, 1, 6
 1, 0, 0, 0, 8, 2, 0, 9, 4
 0, 6, 0, 8, 2, 0, 0, 5, 0
 7, 0, 2, 4, 9, 5, 0, 3, 1
 5, 4, 9, 0, 1, 3, 0, 7, 2
チェック用課題-01

プログラミングについて

プログラミングはHTML(css, JavaScript)により記述され、コードファイルは6つに分割され、全体サイズは思いのほか大きく、まだ初期バージョンながら大作と言えましょう。

解法のアルゴリズムは前回に取り上げた『ナンプレさくさく』を参照しましたがプログラムコードはオリジナルです。言語処理系のJavaScriptには文字列操作など多彩な関数を所有しており、使い方を工夫すれば短いコードで目的を達することができます。

あとがき

single candidateは対象マスを取り巻く行・列・ブロック内だけの情報を制御する単純な方式です。難解な課題を解くことはできません。次回は9個からなる集団情報を眺めて、その特性を把握して適切な候補に絞る解法を追加する予定です。

二国同盟(Naked Pairs)

次回

ナンプレとプログラミング


ナンバープレイス
ナンプレ(数独)研究©2022 TacM, Ver0.01

記述内容

ナンプレの入り口
➋解法のあらまし
③単一候補検出(single candidate)
④二国同盟(Naked Pairs)

➋解法のあらまし

今回はナンバープレイスの解法について、わかったことを整理してみます。ナンプレは81個のマスをルールに基づいて1~9の数字で埋めることです。

マスは空白なものとあらかじめ、数字が埋め込まれたものがあり、空白が多いものほど難解な課題です。

ナンプレの解法を解説している『ナンプレさくさく』を参照すると24個ほどの解法を挙げています。それによると、単一候補検出(single candidate)が基本中の基本であることが分かりました。

単純な言い方では、行、列、ブロックのどれかで9マスのうち、8個のマスが確定すれば残りの数に決まります。例えば行領域で8個確定ならば列やブロックは調査に及びませんが、そうでない場合は他の領域を調査領域に加えてナンプレルールを完遂させます。

上図により、single candidateの具体例を示します。ピンクのマス(RC45)が今、空白で適切な数字を選ぶとき、4行の青マス8個を調べます。4行をサーチして使用数字が7個以内であれば次に5列(茶色)、4ブロック(黄色)と順に調査することになります。

4ブロックのRC44, RC46, RC55, RC65は行と列における調査を利用して省略します。よって、1セット当たり20(8+8+4)個の関連マスをサーチ対象にし、RC99のマスに達するまで繰り返し調査します。

以上が基本解法です。RC99まで進み1セット中で選択したマスが1個もなければsingle candidateの役割は終了し次の解法に委ねられます。

上記したsingle candidateで初級編の大多数はクリアできることでしょう。

あとがき

行、列、ブロック番号をプログラミングとの親和性を考え、0~8に割り振ると前回、述べましたが撤回し1~9にすることにしました。

当サイトはナンプレについてまだまだ未熟であり知識不足、情報不足です。

番号割り振り方法は多くの解説記事で1~9に定着しており、力不足の点は有用な記事を参照して取り入れて行かなければならないからです。

JavaScriptプログラミングにおいて要素名はcol0, col1, col2のようにゼロを初期値にして親和性を保っています。

単一候補検出(single candidate)

次回

パソコン版LINEを使う

パソコン版LINEは有能

何事も急激な変化には戸惑うことがあります。良いと判っていても急いだ改革には抵抗がつきものです。そこに守旧派と改革派のバトルが始まります。このあたりを巧妙に織り交ぜたドラマはヒットします。

スマホによるLINEの利用はとても便利ですが長文のメッセージ作成やコピー&ペーストを使う過去の文面の再利用には不向きです。パソコンにてメールを使える環境を持っている時にはパソコンからLINEに投稿することができます。

パソコン版LINEを構築すればパソコン上に蓄積された情報を集めたり、休み休み送信文面を作って送ることができます。

また、LINEの受信はパソコンで受けることができ、パソコンの全画面表示を利用することが可能になり、細かな字を読むことに難儀している御仁にはパソコン版LINEを推奨します。

パソコンにLINEを構築する方法はネットにたくさん載っています。『パソコンでLINEを利用する』を参考にしました。

クリップボードからコピーできない

下書きをテキストファイルに用意し、校正を重ねていざ送信という段階で冷や汗をかきました。何度も編集を加えた文章をクリップボードから右クリックメニューでLINEのメッセージ入力欄にコピーしようとしてもうまくいきません。そんな時、CTRL/Vを使うとコピーできます。

メールアドレスを解約したけれどメール送受信環境がそのままならば、無料でGメールを新設してパソコン版LINEを使ってみてはいかがでしょう。パソコン版LINEを構築するにはパソコンメールアドレスが必要です。芸は身を助けますよ!

LINEによるやり取りがまだの人には、同じ方式でパソコンからSNSを送りましょう。それは当サイトで取り上げました。PCからスマホにSMS送信法をご参照ください。

下書きはファイルに残す

上の図は最後の最後でLINEメッセージ欄に文面をコピーする手順です。クリップボードの情報は一過性のモノです。下書きはファイルに残し再利用できる方法が賢明です。

ナンプレへの入り口

ナンプレのルール

ナンプレのルールは以下の通りです。

➊タテ一列、9マスに1~9の数字が1個ずつ入る
➋ヨコ一列、9マスに1~9の数字が1個ずつ入る
➌区切られた3×3のすべての正方形ブロックにも1~9の数字が1個ずつ入る

数独(ナンバープレース・Number Place,ナンプレ)の研究開始

ナンプレが注目されて久しいですが、最近になって興味が強まりました。集中的に研究を開始してまだ3週間でありわからないことだらけです。超初心者向け問題を解いていたら複数の正解に出会いました。早めの体験は珍しいと言われておりラッキーでした。

次の図、黒字で示した以下のような問題です。1つの解答は緑字で示されます。6つのマスを一気に赤字の数字に交換しても正解に繋がりました。

研究の方向性と目指す先

新聞や雑誌で定期的にナンプレを取り上げ読者へ濃厚な情報を提供しています。そのほか、ネット上には基本的な解法などを先駆者が解説しています。当サイトでは紙媒体では表現しにくい時間差、色彩、音声などを加えて新機軸を開拓したいと考えています。

解法については書籍やネット上の既存の解法を最大限に応用しながらも後追いに終始することはやりません。ナンプレを研究し、アルゴリズムを確立しプログラミングに反映させてプログラミング学習に役立たせることが研究の目指す終局目標です。

プログラミングとの親和性

記事を書くに当たり、3×3、9×9のマスに注目してマスの位置を確定します。表現方法を上図に示しました。横方向の並びを行、縦方向の並びを列、3×3のボックスをブロックと呼ぶことにします。行、列、ブロックは0~8に割り振り、ブロックは丸囲み数字を使いました。プログラミング言語は開発に便利なHTMLを採用しています。


参照サイト:”https://fastcoding.jp/blog/all/jquery/html-css-javascript/”

HTMLでもCやphpに劣らぬ実行速度を実現できます。要素番号は0を初期値にし8まで値が存在します。9×9(81)個のマスは0~80で表現されることがあります。初期値が1から始まるexcelやWordと少し異なりますがHTMLプログラミングとの親和性を大切にしています。余談ですが81マスでは関連性の深い将棋の棋譜表現方法とも異なります。

次回の予定

文章にしたことで頭の中がスッキリしました。次回からは解法のあらましなどを含めてこれまでに分かったこと、多くの解析記事の傾向などをまとめ、地道に挑戦した結果を挙げていきます。

解法のあらまし

次回

2022初日の出に祈る

世界の平安をお祈り申し上げます。

BGMの再生ボタンをクリックすると『山家集』から西行の和歌がうやうやしく登場します。その後、BGM再生終了にて初日の出画像が出現します。
年暮としくれぬ
春来はるくべしとは
  おも
まさしくえて
 かなふ初夢はつゆめ


【現代語訳】
年が暮れ
春が来るだろうと思って寝ると
まさしく思いの叶う夢を見た
これこそ初夢である
 I wait for a button to be pushed.