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

同期的な表現

ゆったりした動作

プログラミングにおいてゆったりした動作を表現するにはそれなりの工夫が必要です。高速な動作を目視で確認することは難しいです。状態が遷移するたびに音を鳴らすには認識できる時間が必要です。

JavaScriptではこのような処理を制御する関数として、setTimeout, setIntervalが用意されておりゆったりした動作を実現することができます。

動作例

棒グラフの描画をゆったりした動作で表示しました。終わりがありませんのでブラウザを終わらせるなどして強制終了させます。

冬季オリンピックのスピード競技のテレビ放映において、周回コースの進捗度を実態に合わせて表示していました。時間要素をプログラミングに反映させるのは高度な分野に属すると言えましょう。





プログラムサンプルコード

<html>
<head>
<meta charset="utf-8">
</head>
<body onload="barGraph0();">
<Div style="width:600px; margin:0 auto;">
<div id="k0" style="width:600px; height:40px; font-size:30px;"></div>
<div id="k1" style="width:600px; height:40px; font-size:30px;"></div>
<div id="k2" style="width:600px; height:40px; font-size:30px;"></div>
<div id="k3" style="width:600px; height:40px; font-size:30px;"></div>
<div id="k4" style="width:600px; height:40px; font-size:30px;"></div>
</Div>
<script type="text/javascript" charset="utf-8">
const number = [9, 7, 11, 10, 12, 8, 6];			//表示個数
const kajitu = ["&#x1f347;", "&#x1f348;", "&#x1f34c;", "&#x1f34d;", "&#x1f352;"];			//果実
let count0=count1=count2=count3=count4=ct=0;			//グローバル変数
function barGraph0(){				//棒グラフ0
  document.getElementById("k0").innerHTML += kajitu[ct % kajitu.length];
  if(++count0 < number[ct % number.length])	setTimeout('barGraph0()', 60);
  else	{++ct;count1=0;document.getElementById("k1").innerHTML="";setTimeout('barGraph1()', 300);}
}
function barGraph1(){				//棒グラフ1
  document.getElementById("k1").innerHTML += kajitu[ct % kajitu.length];
  if(++count1 < number[ct % number.length])	setTimeout('barGraph1()', 60);
  else	{++ct;count2=0;document.getElementById("k2").innerHTML="";setTimeout('barGraph2()', 300);}
}
function barGraph2(){				//棒グラフ2
  document.getElementById("k2").innerHTML += kajitu[ct % kajitu.length];
  if(++count2 < number[ct % number.length])	setTimeout('barGraph2()', 60);
  else	{++ct;count3=0;document.getElementById("k3").innerHTML="";setTimeout('barGraph3()', 300);}
}
function barGraph3(){				//棒グラフ3
  document.getElementById("k3").innerHTML += kajitu[ct % kajitu.length];
  if(++count3 < number[ct % number.length])	setTimeout('barGraph3()', 60);
  else	{++ct;count4=0;document.getElementById("k4").innerHTML="";setTimeout('barGraph4()', 300);}
}
function barGraph4(){				//棒グラフ4
  document.getElementById("k4").innerHTML += kajitu[ct % kajitu.length];
  if(++count4 < number[ct % number.length])	setTimeout('barGraph4()', 60);
  else	{++ct;count0=0;document.getElementById("k0").innerHTML="";setTimeout('barGraph0()', 300);}
}
</script>
</body>
</html>

 

どこへ行く日本

列強からの圧力

「イラストAC」より

外国の蒸気船がたびたび日本近海に現れて久しいころ、列強の圧力をはねのけ国内の混乱を何とかまとめて、アジアで逸早く(いちはやく)近代化に成功させた日本はその後150年間、アジアのリーダーとして君臨してきました。

その間、様々なできごとがありました。15世紀の大航海時代から始まった西欧列強のアジアへの植民地進出や近代に至っての米国のアジアへの圧力が国の危機感を募らせて近代化に踏み切らせたのでしょうか。

それらの意義等については近代史の専門家にお譲りすることにして、当サイトでは世俗的、井戸端会議的な話へ進んでいきます。

老舗意識はまだ早い

明治維新以来、富国強兵策はある程度、功を奏したようです。手本となるべき欧米の良いところをひたすら取り入れて国力を上げてきましたが、長年にわたって鎖国を敷いてきたにわか国際国家は外交的に行き詰りました。

大国との国力差は歴然としているのに身の丈以上の戦争に突入し敵失(ロシア革命等)で日露戦争に勝ってしまいます。津々浦々まで提灯行列でお祭り騒ぎの報が残っています。

その後、敵国となった言葉や文化なども使ってはならないというお触れが出ました。まだまだ参考とすべき教えが山ほどあったでしょうにその道は閉ざされました。

そして、太平洋戦争の終結を迎え今日に至っています。

ひところ、日本在住のノーベル賞受賞者が数多く出現し名誉なことと国中が湧きましたが、最近では日本出身でアメリカ国籍取得の元日本人が多くなっています。これもめでたいことではありますが、少し残念な思いがします。過去の遺産で生き延びている気がしてなりません。

現実に正視して向き合う

日本は江戸時代の寛永年間から約200年にわたる鎖国を経て開国に舵を切って以来、第二次世界大戦期を除いてひたすら欧米を手本として発展してきました。

40年数年前、高度成長期を迎え、我が世の春を謳歌しました。それが飽和状態になり安定成長となり、多くの大衆には小さな安堵感を抱かせ、未来永劫に世界No.2の経済大国を続くような気にさせられました。

揺るぎない成長は今でも継続中と思っている人々が多いように感じられます。一介の市井人が先進的なことを語ると『身内を貶めて何とする』と言われます。

だから『主要先進国の平均年収ランキングについて』については触れないできました。このことは『選良(最近は使われない言葉で今はエリート)と呼ばれる人々が適切に庶民を導いてくれるので心配に及ばず』とたしなめられるのがオチでした。

 

上の図は先日、NHKのテレビでも紹介されました。遅ればせながら、もう公知の情報です。

サッカーやバレーボールの国際試合があると応援合戦に燃えに燃える隣国に比べても、我が国の平均給与は低いということが明らかになりました。

韓国、台湾よりも低く、これからはシンガポールや中国など経済成長著しい国への出稼ぎなどが一般化してくるのでしょうか。

資源に恵まれない国の宿命

太平洋戦争の敗戦を乗り越えて戦後復興を成し遂げました。復興には国民の勤勉・努力もさることながら植民地独立や冷戦終結に向かう動きによる経済活性化というラッキーな面がありました。鉱物資源や人類屈指の観光資源が少ない国柄としてはゆめゆめ、老舗などと勘違いされることなく斬新な知恵を出して技術立国、新しい観光立国として世界をリードしていってほしいと思っています。

我が国の立ち位置を示す存在感失う「残念な20年」などの記事も目にします。これからまた、原点に立ち返りチャレンジ精神を取り戻して地道に突き進んでいきたく存じます。

ナンプレ(隠れシングル)


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

通算記述内容

ナンプレの入り口
解法のあらまし
単一候補検出(single candidate)
隠れシングル(Hidden Singles)
⑤二国同盟(Naked Pairs)

❹隠れシングル(Hidden Singles)

前回は「1~9の数字で8種の数字が既に使われ最後の数字が見つかったときは、それに確定する」という単一候補検出解法を織り込みました。

具体例を左図に示しますが、2行6列2ブロックに関わるRC26の空きマスに適切な数字を埋め込むとき、最後の候補として4が確定します。このような動作について説明しました。

前回、予告として、二国同盟(Naked Pairs)についてまとめるとしましたが、9コマからなる縦・横・ブロックのグループ内だけで解決できる「隠れシングル」が順番として適切であることが判り変更しました。

隠れシングル解法

このサイトのナンプレを語るページにおいて、マスの上部に小さな数字が表示されますが、それは候補数です。最終的にはここに挙げた候補数のどれかに確定します。ナンプレを論理的に扱うには候補数を的確に管理することに他なりません。

隠れシングルとは「特定の行、列、Boxで候補が1つしかない数字は、その数字を確定する」という解法です。隠れシングルが起きるケースは単一候補検出に次いで多く、初級課題はこの2解法で解けるものが多いです。隠れシングルの2例を以下に示します。

上図において、1行目の3, 5, 7, 8, 9マスが空白でそれぞれの候補数が13, 356, 135, 16, 23であるとき、9マスだけ2が候補として挙がっています。この場合、9マスは2が確定します。行・列・ブロックのグループ内で唯一の候補数は隠れシングルとして確定します。行・列・ブロックで重なる場合は、どれか一つを扱って十分です。

空マスが埋まったらすぐに該当する候補数を削除し、次の検索で齟齬が起きないようにします。

上の図は隠れシングルブロックの例であり4ブロックに注目します。空白マスの候補数47, 149, 1489, 149, 278を眺めるとRC61に唯一、2が含まれていることが判り、RC61には2が確定します。

ナンプレ画面の説明

右の出来事欄にはイベントを表示しています。制御プログラムの節目に表示されます。ナンプレの進行速度を極端に落として可視化を図っているので、画面の変化に対応して表示されるイベントメッセージはシステム構築の向上に役立ちます。

絵文字において、✂は削除、💮は確定・よくできました、👌はいいねの意味です。

上の画像をクリックすると画面が大きくなります。

動作例と操作方法

以下に隠れシングル解法を織り込んだHTMLプログラムコードが埋め込まれており、question-NOTHINGが課題として与えられて初期画面が表示されています。

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

残念ながらすべてのマスを埋め込むことができず「解法が組み込まれていません」とされることがあり、正解を得るには新たな挑戦に委ねられます。

あらかじめ用意された課題はjsファイルで組み込まれますが選択ボタンをクリックして動的に読み込まれるファイルはCSV形式ファイルです。

以下に動作例を示します。さまざまなCSVファイルを準備し選択ボタンをクリックして初級編の課題の回答を表示させましょう。

動作例


できごと欄について

プログラミング中、プログラムコードの動作を監視するとき、console.logにて多くの情報を吐き出し(debug out)ます。そして動作中の情報をログとして記録し動作完了後に確認します。

この方法は手堅いですが動きと並行して見ることができません。これらを改良して動作を見ながら中間情報を確認する方法ができごと欄です。右に用意されたできごと欄の表示容量は小さいですがスクロールされても、はみ出した情報は残るので後で確認することができます。

あとがき

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

二国同盟(Naked Pairs)

次回、今度こそ!