johmonjin のすべての投稿

ナンプレ実装化1

実装化に当たっての方針

これまでプログラミングを考えるという観点から、AIを用いてナンバープレイスを解くというミッションに挑戦してきました。

ここに至るまで、ナンプレ解法を2桁サポートすることを目指してHTMLを使って実装化に励んできましたが先日、10個目の『XY-WING』の動作確認を終えたところです。

さて、モノを作るには製造技術を持っていなければなりませんが、品質の高い商品を作るには最終的な製造技術があれば事足りるというわけではありません。ナンプレは1~9の数字を扱い、3つに限定する処理が極めて多いです。縦、横、ブロックと常に3に関わっています。

ナンプレ解法の三国同盟、隠れ三国同盟、BoxLine、XY-WINGなどにおいて、『3マスに限定された3つの候補』という条件がしばしば出現します。

実装化に当たり3にまつわる事柄について整理しておきます。

3つに限定された3つの候補

9個のなかから3個を選ぶ組み合わせは84通りあります。123から789まであり、求め方を含めて下記に示されます。

9C3=84
9個の中から3個を選び3限定を成立させる組み合わせは次の84通り
 

普遍化とは

以前、当サイトのナンプレ三国同盟実装するにおいて、普遍化の部分で123以外の数字を出現回数を調べて123に引き当て普遍化テーブルと突き合わせると述べましたが、この方法は適切でありませんでした。

普遍化とは多くの例証があるとき、すべてのケースに合致する法則を見出して一つの例題で説明するときに適用するものです。

あらゆる事象に応用できない場合は誤りです。今回の記事により訂正いたします。

9C3=84はそれほど大きな情報量ではないので、起こりうるすべてを定数として用意する方式に変更しました。定数は1, 2, 3と3個1組で使われることもありますが、12, 13, 23と2桁で利用される場合が多くこの他にも三国同盟においては12, 13, 123や23, 123, 123など8種類のバリエーションが存在します。これらのテーブルを追加するとさらに情報量が膨らむので必要になったときに生成して利用しています。

基本形の123から2桁の組合せ(12, 13, 23)や三国同盟を成立する候補の組合せは平易な方法で生成することができます。

まとめ

数多くのバリエーションがあるとき、代表的な値で全体を説明可能な場合、普遍化して少ない情報で代替できますが、そうでない場合はすべてを例証として挙げることが手堅い手法と言えます。

おまけ

9個のなかから3個を選ぶ組み合わせを表示するHTML関数コードをおまけとして以下に掲載して終わりにします。

SyntaxHighlighter Evolvedプラグインを有効化するのを忘れていました。あぁ反省!

<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
</head>
<Div style="margin:0 auto; width:600px; height:280px; font-size:18px; background:ivory; border:1px solid green;">
<div style="text-align:center;">9個の中から<b>3個を選び3限定</b>を成立させる組み合わせは次の<b>84</b>通り</div>
<div id="item" style="text-align:left; margin:20px; width100%; height:auto; font-size:16px;"></div>
</Div>
<script type="text/javascript">
var vMax=ary=0;
const combination = (nums, k) => {				//numsで指定された文字からk文字を選ぶ組み合わせ配列を求める
    let ans = [];								//1,2,3,4 ===> 1,2 1,3 1,4 2,3 2,4 3,4
    if(nums.length > vMax)	vMax=nums.length;
    console.log("nums.length="+nums.length, k, vMax);
    if (nums.length < k) {
        return []
    }
    if (k === 1) {
        for (let i = 0; i < nums.length; i++) {
            ans[i] = [nums[i]];
        }
    } else {
        for (let i = 0; i < nums.length - k + 1; i++) {
            let row = combination(nums.slice(i + 1), k - 1);
            for (let j = 0; j < row.length; j++) {		//ここで指定された文字からk文字を選んでいく
                ans.push([nums[i]].concat(row[j]));
            }
        }
    }
    return ans;
}
for(var i=3; i<=9; ++i){
	var number=new Array(i);
	for(var j=0; j<i; ++j)	number[j]=j+1;				//1, 2, 3, 4, 5, 6
	ary = combination(number, 3);
	console.log(i+" "+letter2(ary.length)+" "+vMax+"C3="+JSON.stringify(ary));//'a', 'b', 'c' ===> ["a","b"],["a","c"],["b","c"]]
}
	//document.getElementById("item").innerHTML = JSON.stringify(ary);
	console.log(ary.length, ary[0], ary[83]);
	for(var i=0; i<ary.length; ++i){
	  document.getElementById("item").innerHTML += ary[i] + " "
	}
function letter2(n) {return (" "+n).slice(-2);}	<!-- send ' 1' -->
</script>
</html>

 

2023のこどもの日を祝う

再生ボタンをクリックしてバックグラウンドミュージックでお楽しみください
BGM:鯉のぼり ©2023 TacM, Ver1.00

鮮度を保つ

久々の明るいニュース

モノが小さくなったり集配回数や公的サービスの質が落ちてきた中、WBC優勝という明るいニュースが飛び込んできて心の底から喜びました。

コロナ禍以前からデパートや公的施設で照明が暗くなりました。照明を落とすにもかなりの経費が掛かります。

そこで電球5個使っていたところを4個、3個と減らして利用しているのを見かけました。

困るほどに照明が落ちたわけでなく、こんなことなら開始当時から実行すればよかったのにと思わずにはおれません。テレビ画面やスーパーでは「明るさを適度に落としています」とのことわりが表示されますが、この表示もやめてほしいです。

先進国から落ちる一歩手前

あるテレビのコメンテーターが我が国は今や『先進国から落ちる一歩手前』にあると警告していました。

日本のGDPも第3位から4位、5位と下がりつつあります。

ここらで踏ん張って元気な日本を取り戻したいものです。

得意分野を活かす

様々なスポーツがあります。人それぞれに得意不得意があります。

体重100㎏ではマラソン競技には向いてなく、体重50㎏の人が砲丸投げで記録を作るのは困難です。得意とする分野で活躍することが大切です。

日本は組織力を活かすことに長じています。これらは他国にまねられ追従されてすぐ追い越されるのが常です。「記録は破られるために作られる」を心に刻んで新鮮さを保ち続けて欲しいものです。

西欧化を顧みる

選択的とは何ぞや

5月に先進国首脳会議が広島で開催されます。それを踏まえて様々な議論が展開されています。今さらながらですが「選択的」という言葉が踊っています。選択的とは「金科玉条となる指針ではなくそのような考え方も許容されますよ」といった意味合いと考えられます。

そこには様々な含みを許容しますという寛大さもあると思われます。がしかし、巷の動きは一方方向に振れています。

「選択的夫婦別姓制度」は夫や妻の姓を名乗らずに、結婚後も従来の姓を名乗るというものです。そしてそれは従来の夫婦同姓制度と並列に進むというものです。従来方式、新しい方式の好きな制度を取り入れてくださいというのだから何ら問題はないように思われますが狭いコミュニティにおいては簡単にはいきません。

PR TIMESより

私が育った所において、同姓は先祖をたどればすべて同族であり遠い親戚になります。

その状況で夫以外の姓を名乗ると一族の地盤沈下になりかねず、長老たちから嫌われます。

地方では趣味、学閥、考え方、識見などよりも地縁・血縁が優先される傾向にあります。

「長いものには巻かれる」の風潮を考慮すると「選択的夫婦別姓制度」といえども好ましくないとの考え方が成り立ちます。

閉塞感からの脱却

ここ30年、経済成長が低迷し閉塞感が漂っています。明治になってから156年、振り返る時期です。幕末時期、長い間手本にしてきた唐天竺(中国・インド)は西欧列国の激しい攻勢にさらされ、日本は危うさを感じていました。国力の充実を図り、国威発揚を目指しました。憂国の士による西欧化の国策は成功裏に推移したと言えるでしょう。

産経ニュース引用

このとき、長く我が国に培われてきた古来からの精神をもっと残しておけば良かったのではないかと残念に思われます。先進国首脳会議出席国で取り入れてない国は日本だけで恥ずかしいという面も少しはあるようです。やみくもに踏襲することなくここらあたりで西欧化を顧みてはいかがでしょう。

新しいものへの愛着

球数制限と飛び級

最近、囲碁の仲邑菫(なかむら・すみれ)三段が13歳11カ月でタイトルを獲得しました。驚きで拍手喝采しました。囲碁などの知的競技ではスポーツ競技ほど大人と若年者との体力差は大きくないようです。

昔から天下を取るには目いっぱいの努力で最低10年はかかると言われてきました。競技は白熱した戦いでなければ盛り上がりません。それ故、体格差がものをいう競技では年齢別制度が採用されます。

その点、芸術や知的ゲームの世界では年齢を問いません。ピアノ・囲碁・将棋は2~3歳でも稽古を始められます。すると12~13歳で天下人になることが可能です。

日本は平準化社会が定着してその考え方が文化面の精神的支柱になりましたが、経済面では貧富の差が拡大しています。若手が活躍し競技を盛り立ててくれることはありがたいです。反面、若手がこじんまりと老成の域に達しないかと危惧されます。

体が伸び盛りの野球界では投手に球数制限を設けています。サッカーでもヘディングについて同じような制限があるようです。義務教育を終えた学業で中途で止めて自分の道を極めるのは個人の権利ですが、年若く天下人になっても晩年はどんな生活が待っているのでしょう。

OGスマイルから引用

高校野球で優勝や傑出した成績を残すとアメリカの大会に招待されます。その間、学業はできません。進級・卒業への単位取得は通常と異なる特典があるのでしょう。知的競技にもこれらを応用しスムースな学業を継続できる社会仕組みを作ってあげる必要が迫られています。

スポーツで飛び切りの活躍をした学生を飛び級で進級させようとした動きをマスコミこぞって反対したことがありました。世界をまたにかけて活動している傑物には凡人には体験できない学びに触れています。

ドイツニュースダイジェストのサイトより

英語力などは海外で多くの要人に会って生きた勉強に役立ち居眠り学生よりは身に付いていると思われます。それでも飛び級を許さないのは理不尽というものです。

努力不足の大人を救済するためにも、中高校生の大会への出場制限をして学業しやすい環境を整えてあげるべきではないだろうか。人生100年時代、ゆったりした流れを作ってあげましょう。

直江兼続愛用の兜から

動くメッセージの新機軸

ブラウザのリロードボタンのクリックで再起動します。

image/svg+xml 直江兼続 愛用の兜からデザインを引用 ©2023 TacM, Ver0.02
 

 

ラジオ文化

ラジオと共に

お気に入りのラジオが壊れてしまいました。S社製のラジオは教科書にも載った優れものでした。トランジスタラジオという言葉の響きに郷愁を感じる人は私だけではないでしょう。

壊れたといっても致命的ではなくボリュームボタンが効かなくなっただけです。

音量が小さくならず夜には厚手の布を被せています。今では一般化したリモートでの仕事を長年しておりました。

以前は社会性が保てないのではなどとお節介を焼かれましたが、江戸時代ならば出職(でしょく)に対して居職(いじょく)と呼ばれた職業もコロナの影響で日の目を浴びるようになってきました。

テレビは核心に触れる部分をぼかしがちになりますがラジオは踏み込んだところまで報道してくれます。

情報を得る手段はインターネットが多くなっていますが、かつては井戸端会議、電車内、会社、居酒屋、新聞、テレビ、諸団体活動など様々でした。

最近はプロパガンダと称して一方的な主張も見られますので一ヶ所からだけの情報入手には気を付けなければなりません。

ラジオは小型で消費電力が微弱ながら長時間電池稼働が可能で災害対策には有利で、娯楽・情報源として欠かせない必需品です。

ラジオパーソナリティの代替わり

多くのラジオ局において、ラジオパーソナリティは高齢になって名物パーソナリティの退場が目立ちます。名声を馳せた司会者は一時代を築きラジオ局の隆盛に貢献して静かに去ったと言えるでしょう。マッカーサーの引退の弁を思い起こします。

 マッカーサー退任の弁
老兵は死なず、消え去るのみ
Old soldiers never die, they just fade away.


上の図で右下のボタンをクリックするとマッカーサー元帥が5秒後に退任します。

市民ラジオ局はAMからFMへ、ラジコ利用など多様化が進みましたが専門局の誕生などまだまだ進化できるのではないでしょうか。

ナンプレ三国同盟実装する

三国同盟を実装する

今回はナンプレ解法の続きです。前回まで6つの解法を実装し新聞や週刊誌に掲載されたナンプレ課題を解くことに成功しました。それでは三国同盟解法を実際に実装する例をまとめます。

下、左の課題は前回のAI自動解法システムでは正答に至りませんでした。その右図には初回の候補数を表しています。3X3の4ブロック目で178による三国同盟が起きています。

ナンプレを解くには多くの解法を織り込んで総合力で候補数を1つに絞り確定していきます。AI自動解法で解けない課題が見つかったとき、課題に誤りがなければ自動解法が不十分だからです。どの部分が不足しているかを見極め対策を講じなければなりません。

 

実装のあらまし

『三国同盟』という解法は、「3つのマスに限定された3つの候補がある時、同一行の他の6マスにあるその候補は削除できる」という決まりです。 下図では行でなくブロックですが具体例で説明します。

178が①⑤⑥の3マスに限定され三国同盟が成立しているので他の6マスに混在している178を削除できます。削除により⑦マスは候補が1つになり4が確定し、⑧マスから4を削除できます。よってこのグループ単独で右図のように暫定決定します。

 

これからグループ(9マス)の三国同盟成立を判別する具体的な方法を箇条書きに列記します。

  1. グループの中で確定マスは除外する
  2. 内包数2~3のマスを選ぶ
  3. 選択されたマス数>=3が条件
  4. 上条件成立も未確定マスが3ならば対象外
  5. 最後に選択マス数が3以上でも参照回数が2未満の数が含まれていれば除外
  6. 選択されたマスの数字を123…に変換し普遍化する※変換方法は下記
  7. 普遍化された比較テーブルを検索して三国同盟成立を判別する
  8. ※マスの数字を123…に変換する方法
    三国同盟は3つの数字を扱います。数字は1~9あってもすべて1,2,3に置き換えて動静を把握します。ここではこのことを普遍化と呼びます。三国同盟を成立させるためには最低でも二国からスタートすることに着目し数字の出現回数を調べ123…に変換して普遍化された比較テーブルを参照します

三国同盟成立条件を判別する普遍化された比較テーブル
(基本は左側の4パターン、処理を簡略化するため増加)
123, 123, 123
123, 123, 12 123, 123, 13 123, 123, 232セル追加
123, 12, 13 123, 12, 23 123, 13, 232セル追加
12, 13, 23

上図の三国同盟の例では背景色が黄色のセルにより同盟成立が確認されました

 

改訂されたAI自動解法による実行例

以下、準備中

 

順序リストの一例

白抜き数字で番号付け

順序付けリストで1番から順に番号を振ってもらえるのはありがたいです。数字のみならずイロハなども指定できます。丸囲み数字や絵文字も可能ですが今回、様々な色に彩られた白抜き数字を実現しました。

❶❷❸❹❺❻❼❽❾❿

番号は content-counter を利用し丸で囲み背景色を指定するには background-color に加えて width, height, border-radius で指定します。数字の色は color にて設定します。

このように手を加えた指定はとりわけ引き立ちます。番号が2桁になっても縦横の両方向に中央寄りを設定しているので丸円の中央部に表示されます。

Result

  目    次
  1. 勃勃たる威風へ
  2. 活気ある日本へ
  3. AIでナンプレ難問を解く
  4. 本記事の目的
  5. 操作方法
  6. ナンバープレース解法アルゴリズム
  7. プログラミング言語について
  8. 新しい解法の実装法
  9. 解法の大きな流れ
  10. プログラミングの基礎となる関連図


サンプルコード

<head>							<!-- 2023-01-16, upload -->
<style>
.ol1 {
  line-height: 18px;			/* 20 22 */
  counter-reset: my-counter;
  list-style: none;
  padding: 0;
}
.li1 {
  margin-bottom: 5px;			/* 行の高さに反映(5pxは手頃感あり) */
  padding-left: 28px;			/* 項目の横表示位置 */
}
.li1:before {
  content: counter(my-counter);	/* カウンター */
  counter-increment: my-counter;/* カウンター */
  background-color: aquamarine;	/* #bada55 */
  color: crimson;				/* #222 navy black mediumvioletred */
  font-size:14px;				/* 項目番号数字の大きさ */
  display: block;
  float: left;
  line-height: 18px;			/* 22 */
  margin-left: -22px;			/* 項目番号数字の横表示位置 */
  text-align: center;			/* 横 */
  align-items: center;			/* 縦 */
  height: 18px;
  width: 18px;
  border-radius: 50%;			/* 円 */
}
</style>
</head>
<Div id="ms" style="width:360px; height:auto; margin:0 auto; background:beige; BORDER:1px solid blue;">
     <span style="font-size:22px; font-family:MS Pゴシック">  目    次</span>
	 
<ol class="ol1" style="font-size:16px; color:black;">  
	<li class="li1">勃勃たる威風へ</li>     
	<li class="li1">活気ある日本へ</li>     
	<li class="li1">AIでナンプレ難問を解く</li>     
	<li class="li1">本記事の目的</li>     
	<li class="li1">操作方法</li>     
	<li class="li1">ナンバープレース解法アルゴリズム</li>     
	<li class="li1">プログラミング言語について</li>     
	<li class="li1">新しい解法の実装法</li>     
	<li class="li1">解法の大きな流れ</li>     
	<li class="li1">プログラミングの基礎となる関連図</li>
</ol>
</Div>

おまけに

白抜き数字を表示するとき、多くは絵文字を利用しますが番号が20を超えたりすると使いにくくなります。今回の方法は1桁と2桁の数字をサポートするので99まで使うことができます。