ブログトップ

電子工作やってみたよ

タグ:HP電卓 ( 34 ) タグの人気記事

数独は奥が深いですねえ。
錆びかけた脳みそに油をさしながら頑張ってみたのですが、やっと ニコリの数独攻略ガイドの中級が解けるプログラムが出来ました。
解析手順は今までの2つの方法に新たに2つ追加して以下の4つの方法をグルグルと繰り返しています。

1、 空きマスを探して 縦、横、3X3ブロックの条件からそこに入力出来る数値を探す。
2、 1~9のなかで注目する数値を決めその数値がない3x3のブロックの中のどこに置くことが出来るか探す。
3、 1~9のなかで注目する数値を決めその数値がない縦の列の中のどこに置くことが出来るか探す。
4、 1~9のなかで注目する数値を決めその数値がない横の行の中のどこに置くことが出来るか探す。

言葉で言えばこれだけの事ですが、これをプログラムで表現しようとするとなかなうまく行きませんでした。
2~4においては、答えの場所を探すというよりは、置けないところを見つけてはじき出すという感じですね。
このなかでは、「先読み」や数値の「仮置き」は使っていません。

この次は「上級」の問題に挑戦してみます。


c0335218_19035428.jpg

ニコリ 数独攻略ガイド (中級) P52,53 No17,18
c0335218_10091709.jpg


ニコリ 数独攻略ガイド (中級)P52 No17
正常な答えがでました。

上半分は問題  下半分は回答です。 演算時間はみな5秒以内でした。
c0335218_10003189.jpg

ニコリ 数独攻略ガイド (中級)P53 No18
正常な答えが出ました。
上半分は問題  下半分は回答です。
c0335218_10003962.jpg


ニコリ 数独攻略ガイド (上級) P73 No26 上級の問題

c0335218_10100381.jpg


ニコリ 数独攻略ガイド (上級)P73 No26   
答えがまったく出ません。

上半分は問題  下半分は回答です。
c0335218_10004645.jpg




F-97 BASICで書いたプログラムリストです。

------------------------------
数独(ナンプレ) Ver SDOK_050N.BAS 2018-08-7
'基本テーブル配列の定義
dim AL(9,9) 
dim CHK(27)
dim INV1(20)
dim M_BUF(9)
'
'問題のテーブルデータの設定
gosub *TBL_ABCD
gosub *DISP3
gosub *ALBKCOPY
'stop
for AL_COUNT = 1 to 20
    ?" AL_COUNT=";AL_COUNT
gosub *MAIN_1
gosub *MAIN_2
gosub *MAIN_3
gosub *MAIN_4
next AL_COUNT
gosub *DISP3
?" ALL END"
stop
'=====================================================================================
'空欄を順に探してそこに入る可能性のある数値を、空欄のたて、横、ブロックのデータから類推する
*MAIN_1
'?" MAIN_1 ============================== "
X=1:Y=1
'空欄のマスをサーチする
for JJJ=1 to 20
for Y=1 to 9
for X=1 to 9
'?" X=";X;:?" Y=";Y;
if AL(X,Y)=0 then gosub *SHORI
next X
next Y
next JJJ

return
'
'=============================================================================
'空欄のたて、横、ブロックのデータを読み込む
*SHORI
'?" SHORI":'stop
for XXA=1 to 27
CHK(XXA)=0
next XXA
for XXB=1 to 9
' ?" XXB=";XXB;" Y=";Y
INV1(XXB)=AL(XXB,Y)
'stop
next XXB
'gosub *disp1:stop

'空欄に入る可能性データに変換する
for XX=1 to 9
INV2(XX)=XX
next XX

for YY=1 to 9
for XX=1 to 9
if INV2(XX)=INV1(YY) then INV2(XX)=0
next XX
next YY
for XX=1 to 9
CHK(XX)=INV2(XX)
next XX
'------------------------------------------------
'問題のテーブルから縦の列データをコピーする
for YY=1 to 9
INV1(YY)=AL(X,YY)
next YY
'gosub *disp1:stop
'空欄に入る可能性データに変換する
for XX=1 to 9
INV2(XX)=XX
next XX
'gosub *DISP2:stop
for YY=1 to 9
for XX=1 to 9
if INV2(XX)=INV1(YY) then INV2(XX)=0
next XX
next YY
'gosub *DISP2:stop
for XX=1 to 9
CHK(XX+9)=INV2(XX)
next XX
'gosub *DISP27:stop
'-------------------------------------------------
'問題のテーブルからブロックデータをINV1へコピーする
if (X<=3)and(Y<=3) then gosub *AAA:goto *BLKMOVEND
if (X>=4)and(X<=6)and(Y<=3) then gosub *BBB:goto *BLKMOVEND
if (X>=7)and(Y<=3) then gosub *CCC:goto *BLKMOVEND
if (X<=3)and(Y>=4)and(Y<=6)then gosub *DDD:goto *BLKMOVEND
if (X>=4)and(X<=6)and(Y>=4)and(Y<=6)then gosub *EEE:goto *BLKMOVEND
if (X>=7)and(Y>=4)and(Y<=6)then gosub *FFF:goto *BLKMOVEND
if (X<=3)and(Y>=7) then gosub *GGG:goto *BLKMOVEND
if (X>=4)and(X<=6)and(Y>=7)then gosub *HHH:goto *BLKMOVEND
if (X>=7)and(Y>=7) then gosub *III:goto *BLKMOVEND
?" ERR_blkend":stop
*BLKMOVEND
'空欄に入る可能性データに変換する
for XX=1 to 9
INV2(XX)=XX
next XX
'gosub *disp2:stop
for YY=1 to 9
for XX=1 to 9
if INV2(XX)=INV1(YY) then INV2(XX)=0
next XX
next YY
'gosub *disp2:stop
for XX=1 to 9
CHK(XX+18)=INV2(XX)
next XX
'gosub *disp27:stop
'-------------------------------------------------
for XX=1 to 9
BF(XX)=0
next XX
'gosub *DISP_BF
for M=1 to 9
KZ=0:GT=0
for T=1 to 27
if CHK(T)=M then KZ=KZ+1
if KZ>=3 then ANS=M:GT=1:BF(M)=1:T=27: '?"KZ";KZ;:?"GT=";GT;
next T
next M
OKCHK=0
for XX=1 to 9
OKCHK=OKCHK + BF(XX)
next XX
'gosub *DISP_BF
'?" OKCHK=";OKCHK,
'?" X="X;:?" Y=";Y
'stop
if OKCHK<>1 then goto *NON
AL(X,Y)=ANS
    '?" ANS=";ANS,
'?" X=";X,
'?" Y=";Y
*NON
return
'------------------------------------------------------------
'注目する数値を決めてからその注目値の無いブロックを探し、注目値がそのブロックのどこに当てはまるかを調べる。
*MAIN_2
'?" ":?" ":
'?" MAIN_2 ====================================================================== "
'stop
X=1:Y=1
'空欄のマスをサーチする
for ALOOP=1 to 20
for CHUMOKU=1 to 9
for BLKNO=1 to 9 ' *AA: 1 *BB: 2 ----
           '?" ":?" CHUMOKU=";CHUMOKU;  :?" BLKNO=";BLKNO;
'stop
gosub *BLOCK
next BLKNO
next CHUMOKU
next ALOOP
'?"  All end"
'gosub *DISP3B
'?" "
'gosub *DISP3
return
'------------------------------------------------------------
*BLOCK
if BLKNO=1 then BLKYUP=1:BLKXLF=1:gosub *AAA:goto *BLKXX
if BLKNO=2 then BLKYUP=1:BLKXLF=4:gosub *BBB:goto *BLKXX
if BLKNO=3 then BLKYUP=1:BLKXLF=7:gosub *CCC:goto *BLKXX
if BLKNO=4 then BLKYUP=4:BLKXLF=1:gosub *DDD:goto *BLKXX
if BLKNO=5 then BLKYUP=4:BLKXLF=4:gosub *EEE:goto *BLKXX
if BLKNO=6 then BLKYUP=4:BLKXLF=7:gosub *FFF:goto *BLKXX
if BLKNO=7 then BLKYUP=7:BLKXLF=1:gosub *GGG:goto *BLKXX
if BLKNO=8 then BLKYUP=7:BLKXLF=4:gosub *HHH:goto *BLKXX
if BLKNO=9 then BLKYUP=7:BLKXLF=7:gosub *III:goto *BLKXX
?" BLK ERR":stop
'------------------
*BLKXX
CNT=0
'このブロック(*AAA *BBB *CCC~) の中に注目している(CHUMOKU)数値があれば何もせずリターン
for XXX=1 to 9
CNT=CNT+1
'if INV1(XXX)=CHUMOKU then ?" ":?"M2 ブロック内に注目値あり":CNT=0:XXX=9:return
if INV1(XXX)=CHUMOKU then :CNT=0:XXX=9:return
next XXX

' ?" ":?"M2 ブロック内に注目値が無いので場所探しをする":stop
gosub *BK_Y_IV
gosub *BK_X_IV
gosub *XY_LNCK
gosub *CHUSET
return
'---------------------------------------------------------------
*AAA
'?"":?" AAA"
INV1(1)=AL(1,1): INV1(2)=AL(2,1): INV1(3)=AL(3,1)
INV1(4)=AL(1,2): INV1(5)=AL(2,2): INV1(6)=AL(3,2)
INV1(7)=AL(1,3): INV1(8)=AL(2,3): INV1(9)=AL(3,3)
gosub *BLKOUTCOPY
return
'----------------------------------------
*BBB
'?"":?" BBB"
INV1(1)=AL(4,1): INV1(2)=AL(5,1): INV1(3)=AL(6,1)
INV1(4)=AL(4,2): INV1(5)=AL(5,2): INV1(6)=AL(6,2)
INV1(7)=AL(4,3): INV1(8)=AL(5,3): INV1(9)=AL(6,3)
gosub *BLKOUTCOPY
return
'----------------------------------------
*CCC
'?"":?" CCC"
INV1(1)=AL(7,1): INV1(2)=AL(8,1): INV1(3)=AL(9,1)
INV1(4)=AL(7,2): INV1(5)=AL(8,2): INV1(6)=AL(9,2)
INV1(7)=AL(7,3): INV1(8)=AL(8,3): INV1(9)=AL(9,3)
gosub *BLKOUTCOPY
return
'----------------------------------------
*DDD
'?"":?" DDD"
INV1(1)=AL(1,4): INV1(2)=AL(2,4): INV1(3)=AL(3,4)
INV1(4)=AL(1,5): INV1(5)=AL(2,5): INV1(6)=AL(3,5)
INV1(7)=AL(1,6): INV1(8)=AL(2,6): INV1(9)=AL(3,6)
gosub *BLKOUTCOPY
return
'----------------------------------------
*EEE
'?"":?" EEE"
INV1(1)=AL(4,4): INV1(2)=AL(5,4): INV1(3)=AL(6,4)
INV1(4)=AL(4,5): INV1(5)=AL(5,5): INV1(6)=AL(6,5)
INV1(7)=AL(4,6): INV1(8)=AL(5,6): INV1(9)=AL(6,6)
gosub *BLKOUTCOPY
return
'----------------------------------------
*FFF
'?"":?" FFF"
INV1(1)=AL(7,4): INV1(2)=AL(8,4): INV1(3)=AL(9,4)
INV1(4)=AL(7,5): INV1(5)=AL(8,5): INV1(6)=AL(9,5)
INV1(7)=AL(7,6): INV1(8)=AL(8,6): INV1(9)=AL(9,6)
gosub *BLKOUTCOPY
return
'----------------------------------------
*GGG
'?"":?" GGG"
INV1(1)=AL(1,7): INV1(2)=AL(2,7): INV1(3)=AL(3,7)
INV1(4)=AL(1,8): INV1(5)=AL(2,8): INV1(6)=AL(3,8)
INV1(7)=AL(1,9): INV1(8)=AL(2,9): INV1(9)=AL(3,9)
gosub *BLKOUTCOPY
return
'----------------------------------------
*HHH
'?"":?" HHH"
INV1(1)=AL(4,7): INV1(2)=AL(5,7): INV1(3)=AL(6,7)
INV1(4)=AL(4,8): INV1(5)=AL(5,8): INV1(6)=AL(6,8)
INV1(7)=AL(4,9): INV1(8)=AL(5,9): INV1(9)=AL(6,9)
gosub *BLKOUTCOPY
return
'----------------------------------------
*III
'?"":?" III"
INV1(1)=AL(7,7): INV1(2)=AL(8,7): INV1(3)=AL(9,7)
INV1(4)=AL(7,8): INV1(5)=AL(8,8): INV1(6)=AL(9,8)
INV1(7)=AL(7,9): INV1(8)=AL(8,9): INV1(9)=AL(9,9)
gosub *BLKOUTCOPY
return
'---------------------------------------------------------
*BK_Y_IV
'?"ブロックを含むヨコ3行(1行9マス)の中に注目値を含む行が有るかチェック"
'?"YCHU(1)は1行目の9マスに注目値があったら1を入れる"
'?"YCHU(1)は2行目の9マスに注目値があったら1を入れる"
'?" "
YCHU(1)=0:YCHU(2)=0:YCHU(3)=0:
for BKJJ=0 to 2
'?"ブロックの上横1行9文字をINV1へコピーして注目値を調べる"
'?"注目値があればYCHU(1-3)に1が設定される"
'stop
for XX=1 to 9: INV1(XX)=AL(XX,BLKYUP+BKJJ): next XX
CNT=0
for XXX=1 to 9
CNT=CNT+1
'if INV1(XXX)=CHUMOKU then CNT=0:XXX=9:YCHU(BKJJ+1)=1:?"よこ3行に注目値が有り" '0, 1, 2 => 1, 2, 3
if INV1(XXX)=CHUMOKU then CNT=0:XXX=9:YCHU(BKJJ+1)=1: '0, 1, 2 => 1, 2, 3
next XXX
'stop
next BKJJ
return
'----------------------------------------------------------
*BK_X_IV
'?"M3 BK_X_IV ブロックを含む縦3列の中に注目値を含む列が有るかチェック"
'?"XCHU(1)は1列目の9マスに注目値があったら1を入れる"
'?"XCHU(2)は2列目の9マスに注目値があったら1を入れる"
'?" "
XCHU(1)=0:XCHU(2)=0:XCHU(3)=0:
for BKJJ=0 to 2
    '?"ブロックの左端縦の1列9文字をINV1へコピーして注目値を調べる"
'?"注目値があればXCHU(1-3)に1が設定される"
'stop
    for YY=1 to 9: INV1(YY)=AL(BLKXLF+BKJJ,YY): next YY
CNT=0
for YYY=1 to 9
CNT=CNT+1
'if INV1(YYY)=CHUMOKU then CNT=0:YYY=9:XCHU(BKJJ+1)=1:?"縦3列に注目値が有り" '0, 1, 2 => 1, 2, 3
if INV1(YYY)=CHUMOKU then CNT=0:YYY=9:XCHU(BKJJ+1)=1: '0, 1, 2 => 1, 2, 3
next YYY
'stop
next BKJJ
return
'------------------------------------------------------------------------------
*XY_LNCK
'?"注目数値のある行(9個)および列(9個)に関わるマスには使用不可の10を入れておく"
'?"INV1 をセーブしたBLKOUTからINV1へ戻す"
'?"BLKOUTとは現在作業中のブロックのデータを1列にしたもの"
'stop
for BLKX=1 to 9 
INV1(BLKX)=BLKOUT(BLKX)
next BLKX
if YCHU(1)=0 then goto *LBL200
INV1(1)=10:INV1(2)=10:INV1(3)=10
'?" YCHU INV(1-3)=10"
*LBL200
if YCHU(2)=0 then goto *LBL210
INV1(4)=10:INV1(5)=10:INV1(6)=10:
'?" YCHU INV(4-6)=10"
*LBL210
if YCHU(3)=0 then goto *LBL220
INV1(7)=10:INV1(8)=10:INV1(9)=10:
'?" YCHU INV(7-9)=10"
*LBL220
'stop
if XCHU(1)=0 then goto *LBL300
INV1(1)=10:INV1(4)=10:INV1(7)=10:
'?" XCHU INV(1,4,7)=10"
*LBL300
if XCHU(2)=0 then goto *LBL310
INV1(2)=10:INV1(5)=10:INV1(8)=10:
'?" XCHU INV(2,5,10)=10"
*LBL310
if XCHU(3)=0 then goto *LBL320
INV1(3)=10:INV1(6)=10:INV1(9)=10:
'?" XCHU INV(3,6,10)=10"
*LBL320
'stop
return
'--------------------------------------------------------------------
*CHUSET
'?"注目数値に対応する空きマスが1つの時そこに注目数値を入れる"
'?" 空きマスの数を数え2個以上あったらリターンする"
'?" 空きマスの場所をPOJに覚えておく"
WCHK=0:POJ=0
for III=1 to 9
if INV1(III)=0 then WCHK=WCHK+1:POJ=III
next III
'if WCHK>=2 then  ?"空マスが2個以上あったのでリターンする":return
if WCHK>=2 then return
'?"空マスが1個でした"
'?" 空きマスの位置の元のXY座標を求める"
if POJ<=3 then YY=1:XX=POJ:goto *MTRX
if (POJ>=4)and(POJ<=6)then YY=2:XX=POJ-3:goto *MTRX
if(POJ<=9) then YY=3: XX=POJ-6: goto *MTRX
?"ERR 5 ":stop
'stop
*MTRX
'?"ブロックNOとの組み合わせで大元のALテーブル上のXY座標を求め注目値を置く"
if BLKNO=1 then X=XX:Y=YY: goto *DTSET
if BLKNO=2 then X=XX+3:Y=YY: goto *DTSET
if BLKNO=3 then X=XX+6:Y=YY: goto *DTSET
if BLKNO=4 then X=XX:Y=YY+3: goto *DTSET
if BLKNO=5 then X=XX+3:Y=YY+3: goto *DTSET
if BLKNO=6 then X=XX+6:Y=YY+3: goto *DTSET
if BLKNO=7 then X=XX:Y=YY+6: goto *DTSET
if BLKNO=8 then X=XX+3:Y=YY+6: goto *DTSET
if BLKNO=9 then X=XX+6:Y=YY+6: goto *DTSET
?" ERROR 10 ": stop
*DTSET
AL(X,Y)=CHUMOKU
'?" ":?" X=";X," Y=";Y," DATA=";CHUMOKU,"WCHK=";WCHK
'stop
'gosub *DISP3
'?" ================ "
'stop
return
'----------------------------------------------------------------------------
----------------------------------------------------------------------------
'注目する数値を決めてからその注目値の無いヨコ行を探し、注目値がその行のどこに当てはまるかを調べる。
*MAIN_3
'?" MAIN_3 ============================== "
'stop
'空欄のマスをサーチする
X=1:Y=1
for ALOOP=1 to 20
'?"ALOOP=";ALOOP
'stop
for CHUMOKU = 1 to 9 '********************************************************************************
'stop
for X = 1 to 9 '********************************************************************************
'?"":?" MAIN3 CHU=";CHUMOKU; " 現在調査中の縦列 左から何列目の位置か X=";X
'stop
gosub *LINE_Y
next X
next CHUMOKU
next ALOOP
'?"  M3 All end"
'gosub *DISP3B
'?" "
'gosub *DISP3
'stop
return
'----------------------------------------------------------------------------
*LINE_Y
'?" ":?" M3 LINE_Y 01 TATE JYOUGE ============================================== "
'?"これから調べるメインの縦1列の中に注目値があったら何もせずリターンする"
'stop
for YY = 1 to 9
'?"注目値チェック 主調査の縦列に注目値があれば何もせずもどる"
'?" CHUMOKU=";CHUMOKU;
'?" X=";X; " YY=";YY; " マス値=";AL( X,YY)
'if AL( X,YY)=CHUMOKU then ?"M3 この縦列内に注目値あり":YY=9: ?"":return
if AL( X,YY)=CHUMOKU then :YY=9:return
next YY
'stop
'?"M3 この縦列内に注目値が無いので何処に入るか調査開始する
'?"ALテーブルから現在の縦列1行をメインバッファ(M_BUF)にコピーして表示"
'stop
'?" X=";X
for YY=1to 9
M_BUF(YY) = AL( X,YY)
next YY
'gosub *DISP_M_BUF
'stop
if (X<=3) then goto *LEF
if (X>=4)and(X<=6)then goto *SNT
if (X>=7) then goto *RGT
?"ERR ":stop
'-------------------------------
*LEF
'?" M3 LEF_1====================================== "
'?" 1列~3列の範囲なので一番上のブロックAAAに注目値があるかチェック"
'gosub *AAA: gosub *BK_CHU_CK: if CHUFLG=0 then ?"M3 CHUFLG=0 AAAに注目値なし ":goto *LEF3
gosub *AAA: gosub *BK_CHU_CK: if CHUFLG=0 then goto *LEF3
'?" AAAに注目値があるので空きマスを10で埋める "
for PT=1 to 3
M_BUF(PT)=10
next PT
'gosub *DISP_INV1:gosub *DISP_M_BUF
*LEF3
'?"":?" M3 LEF_3 "
'stop
'?" M3 1列~3列の範囲なので2段目のブロックDDDに注目値があるかチェック"
'gosub *DDD: gosub *BK_CHU_CK: if CHUFLG=0 then ?"M3 CHUFLG=0 DDDに注目値なし ": goto *LEF4
gosub *DDD: gosub *BK_CHU_CK: if CHUFLG=0 then : goto *LEF4
'?" DDDに注目値があるので空きマスを10で埋める "
for PT=4 to 6
M_BUF(PT)=10
next PT
'gosub *DISP_INV1: gosub *DISP_M_BUF
*LEF4
'?"":?"M3 LEF_4 *************************"
'?" M3 1列~3列の範囲なので上から3段目のブロックGGGに注目値があるかチェック"
'gosub *GGG: gosub *BK_CHU_CK: if CHUFLG=0 then ?"M3 CHUFLG=0 GGGに注目値なし ": goto *LEF5
gosub *GGG: gosub *BK_CHU_CK: if CHUFLG=0 then goto *LEF5
'?" GGGに注目値があるので空きマスを10で埋める "
for PT=7 to 9
M_BUF(PT)=10
next PT
'gosub *DISP_INV1: gosub *DISP_M_BUF
*LEF5
'?"":?"M3 LEF 5 "
'stop
gosub *LINE_Y_YOKO
'stop
return
'----------------------------------------------------------------
*SNT
'?"":?" M3 SNT_1============================== "
'stop
'?" 4列~6列の範囲なので一番上のブロックBBBに注目値があるかチェック"
'gosub *BBB: gosub *BK_CHU_CK: if CHUFLG=0 then ?"M3 CHUFLG=0 BBBに注目値なし ": goto *SNT3
gosub *BBB: gosub *BK_CHU_CK: if CHUFLG=0 then goto *SNT3
'?" BBBに注目値があるので空きマスを10で埋める "
for PT=1 to 3
'if INV1(PT)=0 then M_BUF(PT)=10:?" M_BUF(PT)=10を代入する "
M_BUF(PT)=10
next PT
'gosub *DISP_INV1:gosub *DISP_M_BUF
*SNT3
'?"":?" M3 SNT_3 "
'stop
'?" 4列~6列の範囲なので2段目のブロックEEEに注目値があるかチェック"
'gosub *EEE: gosub *BK_CHU_CK: if CHUFLG=0 then ?"M3 CHUFLG=0 EEEに注目値なし ":goto *SNT4
gosub *EEE: gosub *BK_CHU_CK: if CHUFLG=0 then goto *SNT4

'?" EEEに注目値があるので空きマスを10で埋める "
for PT=4 to 6
'if INV1(PT)=0 then M_BUF(PT)=10:?" M_BUF(PT)=10を代入する "
M_BUF(PT)=10
next PT
'gosub *DISP_INV1: gosub *DISP_M_BUF
*SNT4
'?"":?" M3 SNT_4 "
'stop
'?" 4列~6列の範囲なので3段目のブロックHHHに注目値があるかチェック"
'gosub *HHH: gosub *BK_CHU_CK: if CHUFLG=0 then ?"M3 CHUFLG=0 HHHに注目値なし":goto *SNT5
gosub *HHH: gosub *BK_CHU_CK: if CHUFLG=0 then goto *SNT5

'?" HHHに注目値があるので空きマスを10で埋める "
for PT=7 to 9
M_BUF(PT)=10
next PT
'gosub *DISP_INV1: gosub *DISP_M_BUF
*SNT5
'?"":?" M3 SNT 5 "
'stop
gosub *LINE_Y_YOKO
return
'------------------------------
*RGT
'?"":?" RGT_1============================== "
'stop
'?" 7列~9列の範囲なので一番上のブロックCCCに注目値があるかチェック"
'gosub *CCC: gosub *BK_CHU_CK: if CHUFLG=0 then ?"M3 CHUFLG=0 CCCに注目値なし":goto *RGT3
gosub *CCC: gosub *BK_CHU_CK: if CHUFLG=0 then goto *RGT3
'?" CCCに注目値があるので空きマスを10で埋める "
for PT=1 to 3
M_BUF(PT)=10
next PT
'gosub *DISP_INV1:gosub *DISP_M_BUF
*RGT3
'?"":?" M3 RGT_3 "
'stop
'?" 7列~9列の範囲なので2番目のブロックFFFに注目値があるかチェック"
'gosub *FFF: gosub *BK_CHU_CK: if CHUFLG=0 then ?"M3 CHUFLG=0 FFFに注目値なし":goto *RGT4
gosub *FFF: gosub *BK_CHU_CK: if CHUFLG=0 then goto *RGT4

'?" FFFに注目値があるので空きマスを10で埋める "
for PT=4 to 6
M_BUF(PT)=10
next PT
'gosub *DISP_INV1: gosub *DISP_M_BUF
*RGT4
'?"":?" M3 RGT_4 "
'stop
'?" 7列~9列の範囲なので3番目のブロックIIIに注目値があるかチェック"
'gosub *III: gosub *BK_CHU_CK: if CHUFLG=0 then ?"M3 CHUFLG=0 IIIに注目値なし":goto *RGT5
gosub *III: gosub *BK_CHU_CK: if CHUFLG=0 then goto *RGT5
'?" IIIに注目値があるので空きマスを10で埋める "
for PT=7 to 9
M_BUF(PT)=10
next PT
'gosub *DISP_INV1: gosub *DISP_M_BUF
*RGT5
'?"":?" M3 RGT 5 "
gosub *LINE_Y_YOKO
return
'----------------------------------------------------------------------------
*LINE_Y_YOKO
'?" *M3 LINE_Y_YOKO===================================================="
'?"調査中の縦列に存在する空きマスのヨコ1行をチェックして注目値があるか見る"
'stop
for YYY=1 to 9
'?" YYY=";YYY;:?" CHUMOKU=";CHUMOKU
'if M_BUF(YYY)<>0 then ?"M_BUF(YYY)<>0の時 ":goto *YOKO
    if M_BUF(YYY)<>0 then  goto *YOKO
'?"M_BUF(YYY)=0 空きマスなのでよこ1行に注目値があるかチェックする"
CNT=0
for XXX=1 to 9
'?" XXX=";XXX; " YYY=";YYY; " マス値=";AL(XXX,YYY)
'if AL( XXX,YYY)=CHUMOKU then M_BUF(YYY)=10: ?"M3 このよこ列内に注目値あり":XXX=9:
if AL( XXX,YYY)=CHUMOKU then M_BUF(YYY)=10:XXX=9:
            'gosub *DISP_M_BUF
'stop
next XXX
*YOKO
next YYY
'gosub *DISP_M_BUF
'stop
KARA=0:ZERO_Y=0
for YYY=1 to 9
if M_BUF(YYY)=0 then KARA=KARA+1:ZERO_Y=YYY
next YYY
'if KARA=1 then AL(X,ZERO_Y)=CHUMOKU:M_BUF(ZERO_Y)=CHUMOKU:?" KARA=1 SET OK  X,ZERO_Y=";:?X;ZERO_Y
if KARA=1 then AL(X,ZERO_Y)=CHUMOKU:M_BUF(ZERO_Y)=CHUMOKU
'?" X,ZERO_Y =";X;ZERO_Y
'?" KARA=";KARA;
'?" ZERO_Y=";ZERO_Y;
'?" CHUMOKU=";CHUMOKU
'gosub *DISP_INV1:gosub *DISP_M_BUF:gosub *DISP3
'?"M3 end M3 end M3 end"
'stop
return

'---------------------------------------------------------
*BK_CHU_CK
'?"":?"*BK_CHU_CK 01================================================= "
'?"通過するブロック(3*3)の中に注目値が含まれるかチェック"
'gosub *DISP_INV1
CHUFLG=0
CNT=0:CHUFLG=0
'   ?" CHUMOKU=";CHUMOKU;
for XXX=1 to 9
CNT=CNT+1
'if INV1(XXX)=CHUMOKU then CHUFLG=1:CNT=0:?" BK_CHU_CK 注目値あり ":XXX=9:goto *BK_CHU_CK03
if INV1(XXX)=CHUMOKU then CHUFLG=1:CNT=0:XXX=9:goto *BK_CHU_CK03
next XXX
'?" BK_CHU_CK 注目値無し "
*BK_CHU_CK03
return

'----------------------------------------------------------------------------
'注目する数値を決めてからその注目値の無いヨコ行を探し、注目値がその行のどこに当てはまるかを調べる。
*MAIN_4
'?" MAIN_4 ============================== "
'stop
'空欄のマスをサーチする
X=1:Y=1
for ALOOP = 1 to 20
'?"ALOOP=";ALOOP
'stop
for CHUMOKU = 1 to 9 '***********************************************
'stop
for Y = 1 to 9 ' **********************************************
'?" MAIN4 CHU=";CHUMOKU; " 現在調査中の横列 上から何行目の位置か Y=";Y
'stop
gosub *LINE_X ' Y => X
next Y ' X => Y
next CHUMOKU
next ALOOP
'?" M4 All end"
'gosub *DISP3B
'?" "
'gosub *DISP3
'stop
return
'----------------------------------------------------------------------------
*LINE_X ' Y => X
'?" ":?" M4 LINE_X 01============================================== "
'?" これから調べる横1行の中に注目値があったら何もせずリターンする"
'stop
for XX = 1 to 9                ' YY =>  XX
'?" 注目値チェック 主調査の横行に注目値があれば何もせずもどる"
'?" M4 CHUMOKU=";CHUMOKU;
'?" XX=";XX; " Y=";Y;" マス値=";AL( XX,Y)
'if AL( XX,Y)=CHUMOKU then ?" M4 この横行内に注目値あり ":XX=9:return :'stop
if AL( XX,Y)=CHUMOKU then XX=9:return :'stop
next XX

'?"この横行内に注目値が無いので何処に入るか調査開始する
'?"ALテーブルから現在の横行 1行をメインバッファ(M_BUF)にコピーして表示"
'stop
'?" M4  XX=";XX;" Y=";Y
for XX=1to 9 ' YY => XX
M_BUF(XX) = AL( XX,Y)
next XX ' YY => XX
'gosub *DISP_M_BUF
'stop
if (Y<=3) then goto *UP            ' X => Y           *LEF => *UP
if (Y>=4)and(Y<=6)then goto *MD ' X => Y *SNT => *MD
if (Y>=7) then goto *LO ' X => Y *RGT => *LO
?"ERR ":stop
'-------------------------------
*UP '*LEF => *UP
'?" M4 UP_1====================================================== "
'?" 1行~3行の範囲なので一番上のブロックAAAに注目値があるかチェック"
'gosub *AAA: gosub *BK_CHU_CK: if CHUFLG=0 then ?" M4 CHUFLG=0 ":goto *UP3
gosub *AAA: gosub *BK_CHU_CK: if CHUFLG=0 then goto *UP3
'?" AAAに注目値があるので空きマスを10で埋める "
for PT=1 to 3
M_BUF(PT)=10
next PT
'gosub *DISP_INV1:gosub *DISP_M_BUF
*UP3                                                  'LEF => UP
'?"":?" M4 UP_3 "
'stop
'?" M4 1行~3行の範囲なので2行目のブロックBBBに注目値があるかチェック"
gosub *BBB: gosub *BK_CHU_CK: if CHUFLG=0 then goto *UP4
'?" M4 BBBに注目値があるので空きマスを10で埋める"

for PT=4 to 6
M_BUF(PT)=10
next PT
'gosub *DISP_INV1: gosub *DISP_M_BUF
*UP4
'?"":?" M4 UP_4 ================================================"
'?" M4 1行~3行の範囲なので左から3行目のブロックCCCに注目値があるかチェック"
gosub *CCC: gosub *BK_CHU_CK: if CHUFLG=0 then goto *UP5
'?" CCCに注目値があるので空きマスを10で埋める "
for PT=7 to 9
M_BUF(PT)=10
next PT
'gosub *DISP_INV1: gosub *DISP_M_BUF
*UP5
'?"":?"M4 UP 5 "
'stop
gosub *LINE_X_TATE
'stop
return
'---------------------------------------------------------------
*MD ' SNT => MD
'?"":?" M4 MD_1 =============================== "
'stop
'?" 4行~6行の範囲なので一番左のブロックBBBに注目値があるかチェック"
gosub *DDD: gosub *BK_CHU_CK: if CHUFLG=0 then goto *MD3
'?" DDDに注目値があるので空きマスを10で埋める "
for PT=1 to 3
M_BUF(PT)=10
next PT
'gosub *DISP_INV1:gosub *DISP_M_BUF
*MD3
'?"":?" M4 MD_3 "
'stop
'?" 4行~6行の範囲なので左から2個目のブロックEEEに注目値があるかチェック"
gosub *EEE: gosub *BK_CHU_CK: if CHUFLG=0 then goto *MD4
'?" EEEに注目値があるので空きマスを10で埋める "
for PT=4 to 6
M_BUF(PT)=10
next PT
'gosub *DISP_INV1: gosub *DISP_M_BUF
*MD4
'?"":?" M4 SNT_4 "
'stop
'?" 4行~6行の範囲なので左から3個目のブロックFFFに注目値があるかチェック"
gosub *FFF: gosub *BK_CHU_CK: if CHUFLG=0 then goto *MD5
for PT=7 to 9
M_BUF(PT)=10
next PT
'gosub *DISP_INV1: gosub *DISP_M_BUF
*MD5
'?"":?"M4 MD 5 "
'stop
gosub *LINE_X_TATE               ' *LINE_Y_YOKO  =>  *LINE_X_TATE
'stop
return
'------------------------------
*LO 'RGT => LO
'?"":?" M4 LO_1========================= "
'?" 7行~9行の範囲なので左から2個目のブロックGGGに注目値があるかチェック"
'stop
gosub *GGG: gosub *BK_CHU_CK: if CHUFLG=0 then goto *LO3
'?" GGGに注目値があるので空きマスを10で埋める "
for PT=1 to 3
M_BUF(PT)=10
next PT
'gosub *DISP_INV1:gosub *DISP_M_BUF
*LO3
'?"":?" M4 LO_3 "
'stop
'?" 7行~9行の範囲なので一番左のブロックGGGに注目値があるかチェック"
gosub *HHH: gosub *BK_CHU_CK: if CHUFLG=0 then goto *LO4
'?" HHHに注目値があるので空きマスを10で埋める "
for PT=4 to 6
M_BUF(PT)=10
next PT
'gosub *DISP_INV1: gosub *DISP_M_BUF
*LO4
'?"":?" M4 LO_4 "
'stop
'?" 7行~9行の範囲なので左から2個目のブロックGGGに注目値があるかチェック"
gosub *III: gosub *BK_CHU_CK: if CHUFLG=0 then goto *LO5
'?" GGGに注目値があるので空きマスを10で埋める "
for PT=7 to 9
M_BUF(PT)=10
next PT
'gosub *DISP_INV1: gosub *DISP_M_BUF
*LO5
'?"":?" M4 LO 5 "
'stop
gosub *LINE_X_TATE 
'stop
return
'----------------------------------------------------------------------------
*LINE_X_TATE ' *LINE_Y_YOKO
'?" M4 LINE_X_TATE============================================= "
'?"調査中のMAINの横行に存在する空きマスのSUB縦1列をチェックして注目値があるか見る"
'stop
for XXX=1 to 9                            'YYY => XXX
'?" XXX=";XXX;:?" CHUMOKU=";CHUMOKU
'if M_BUF(XXX)<>0 then ?"M_BUF(XXX)<>0の時 ":goto *TATE
    if M_BUF(XXX)<>0 then goto *TATE 
CNT=0
'?"M_BUF(XXX)=0 空きマスなのでSUB_縦1列に注目値があるかチェックする"
CNT=0
for YYY=1 to 9
'?" XXX=";XXX;:?" YYY=";YYY;:?"値=";AL(XXX,YYY)
if AL( XXX,YYY)=CHUMOKU then M_BUF(XXX)=10:YYY=9:

'gosub *DISP_M_BUF
'stop
next YYY
*TATE
next XXX
'gosub *DISP_M_BUF
'stop
KARA=0:ZERO_X=0
for XXX=1 to 9
if M_BUF(XXX)=0 then KARA=KARA+1:ZERO_X=XXX
next XXX
if KARA=1 then AL(ZERO_X,Y)=CHUMOKU:M_BUF(ZERO_X)=CHUMOKU:?" KARA=1 SET OK  ZERO_X,Y=";:? ZERO_X;Y
'?" ZERO_X,Y =";ZERO_X;Y
'?" KARA=";KARA;
'?" ZERO_X=";ZERO_X;
'?" CHUMOKU=";CHUMOKU
'gosub *DISP_INV1:gosub *DISP_M_BUF:gosub *DISP3
'?"M4 end M4 end M4 end"
'stop
return
'----------------------------------------------------------------------------
 *BLKOUTCOPY
for BLKX=1 to 9
BLKOUT(BLKX)=INV1(BLKX)
next BLKX
return
'---------------------------------------
*ALBKCOPY
?" "
for YYY=1 to 9
for XXX=1 to 9
ALBK(XXX,YYY)=AL(XXX,YYY)
next XXX
next YYY
return

'--------------------------------------------------------------------------
*DISP_M_BUF
'?"":?" M_BUF=";
for YY=1to 9
'?M_BUF(YY);
next YY
'?" "
return
'----------------------------------------------------------------------------
*DISP_INV1
*DISP1
'?" INV1 =";
for KKK=1 to 9
'?INV1(KKK);
next kkk
return
'---------------------------------------
'*DISP2
'?" INV2(1~)=";
for KKK=1 to 9
'?INV2(KKK);
next kkk
return
'---------------------------------------
*DISP3
'?" "
for YYY=1 to 9
for XXX=1 to 9
?AL(XXX,YYY);
if XXX=3 then ?" ";
if XXX=6 then ?" ";
next XXX
if YYY=3 then ?" "
if YYY=6 then ?" "
?" "
next YYY
return
'---------------------------------------
*DISP3B
?" "
for YYY=1 to 9
for XXX=1 to 9
?ALBK(XXX,YYY);
if XXX=3 then ?" ";
if XXX=6 then ?" ";
next XXX
' if YYY=3 then ?" "
' if YYY=6 then ?" "
?" "
next YYY
return
'---------------------------------------
'*DISP27
for X12=1 to 27
? CHK(X12);
if X12=9 then ?" "
if X12=18 then ?" "
next X12
?" "
return
'-----------------------------------------
'*DISP_BF
?" "
?" BF(1~9)=";
for KKK=1 to 9
?BF(KKK);
next kkk
return
'---------------------------------------
'問題のテーブルデータの設定
'ニコリ 数独攻略ガイド P51 No16
'M1,2,3,4 全OK    20180804
*TBL_ABCD

data 2,0,1, 6,0,0, 0,0,9
data 0,0,0, 0,0,8, 2,0,0
data 3,0,0, 0,4,0, 0,5,0
data 9,0,0, 0,0,0, 0,2,0
data 0,0,8, 0,0,0, 3,0,0
data 0,4,0, 0,0,0, 0,0,6
data 0,3,0, 0,5,0, 0,0,8
data 0,0,9, 7,0,0, 0,0,0
data 6,0,0, 0,0,1, 4,0,5

for YY=1 to 9
for XX=1 to 9
read AL(XX,YY)
next XX
next YY
return



これで終わりです。




今年は、猛烈な暑さのため、スイカはみなひび割れてしまいました。
トウモロコシも半分以上のものが乾燥してダメでした。
この花だけは、毎年元気で咲いてくれています。

c0335218_09115141.jpg

朝顔も元気ですね。
c0335218_09112206.jpg

***************

++++++++++++++ 
-------------------------



by telmic-gunma | 2018-08-08 10:21 | HP電卓 | Trackback | Comments(2)

前回の4x4の解き方をそのまま9x9の拡張してやってみました。
しかし4x4ではうまく行っていた方法も9x9では単純な問題しか解くことができなくなりました。
そこで数独の解説書などを参考に新たな方法に挑戦してみました。
ここでも 人力で解くことは可能なのですが、それをプログラム化するところで四苦八苦してしまいました。
何とか出来上がったソフトでいろいろ試したのですが、やはりオールマイティーということはなくて、

限られた問題しか解けません。
やはり いろいろな問題を解くには、いろいろな方式のプログラムを作りそれを組み合わせていかなくてはならないようです。

今回の方式は、3x3の一つのブロックに注目しその中にない数値がどの場所ならば置くことが出来るかをさがしていく方法です。
これは ニコリの「全問解説数独」のP6に載っている方法をプログラム化したものです。

1) 1~9までの注目する数値を決める(実際は「1」から順番にやる)
2) その数値がない3x3のブロックを順に見つける。(今回は上の右端)
3) 横方向の行で注目数値「1」が入らないところを見つける。
   a行 b行には「1」が有るので入らない。
4) 縦方向で「1」が入らないのは I列です。
5) 上記より「1」の入る可能性はGcとHcです。
6) しかしHcはすでに「2」が入っている。
7) ゆえに残るのはGcだけなのでここに「1」が入ります。

表題に出している「HP電卓」はどうしたのと言われそうですが、ベーシックで問題が解けるようになったら、人間コンパイラになってHP電卓に書き直してみようと思います。
c0335218_19035428.jpg



この問題は 最初にやった4x4の延長の方式では解くことが出来ませんでした。
今回の各ブロックに注目してやる方法で解けました。
だけど この方式でも解けない問題がわんさか有ります。

c0335218_19045525.jpg



画面上側が問題です。  問題のブランクの所には、ゼロが入っています。
下側はパソコンが出した回答です。
Fベーシック97で3秒ほどかかりました。
デバッグのための途中経過を表示しているので、その時間がかかっていると思います。


c0335218_19042435.jpg





( Fベーシック97  富士通が作った20年前のBASIC言語をWinXPで動かしてます)


'数独(ナンプレ) SDOK9x9_30D 2018-06-20
'基本テーブル配列の定義
dim AL(9,9)
dim CHK(27)
dim INV1(9)
'
'問題のテーブルデータの設定
gosub *TBL_P6
gosub *DISP3
stop
'空欄のマスをサーチする
for ALOOP=1 to 10
for CHUMOKU=1 to 9
for BLKNO=1 to 9 ' *AA: 1 *BB: 2 ----
'          ?" CHUMOKU=";CHUMOKU;  :?" BLKNO=";BLKNO;
'stop
gosub *BLOCK
next BLKNO
next CHUMOKU
next ALOOP
?"  All end"
gosub *DISP3
stop:stop
'------------------------------------------------------------
*BLOCK
if BLKNO=1 then BLKYUP=1:BLKXLF=1:gosub *AAA:goto *BLKXX
if BLKNO=2 then BLKYUP=1:BLKXLF=4:gosub *BBB:goto *BLKXX
if BLKNO=3 then BLKYUP=1:BLKXLF=7:gosub *CCC:goto *BLKXX
if BLKNO=4 then BLKYUP=4:BLKXLF=1:gosub *DDD:goto *BLKXX
if BLKNO=5 then BLKYUP=4:BLKXLF=4:gosub *EEE:goto *BLKXX
if BLKNO=6 then BLKYUP=4:BLKXLF=7:gosub *FFF:goto *BLKXX
if BLKNO=7 then BLKYUP=7:BLKXLF=1:gosub *GGG:goto *BLKXX
if BLKNO=8 then BLKYUP=7:BLKXLF=4:gosub *HHH:goto *BLKXX
if BLKNO=9 then BLKYUP=7:BLKXLF=7:gosub *III:goto *BLKXX
?" BLK ERR":stop
'---------------------------------------------------------------
*BLKXX
CNT=0
'このブロックの中に注目している(CHUMOKU)数値があれば何もせずリターン
for XXX=1 to 9
CNT=CNT+1
if INV1(XXX)=CHUMOKU then CNT=0:XXX=9:?"同一文字有り":return
next XXX
'----------------------------------------
YCHU(1)=0:YCHU(2)=0:YCHU(3)=0:
for BKJJ=0 to 2
'ブロックの上横1行9文字をINV1へコピー
for XX=1 to 9: INV1(XX)=AL(XX,BLKYUP+BKJJ): next XX
CNT=0
for XXX=1 to 9
CNT=CNT+1
if INV1(XXX)=CHUMOKU then CNT=0:XXX=9:YCHU(BKJJ+1)=1
next XXX
next BKJJ
'-------------------------
XCHU(1)=0:XCHU(2)=0:XCHU(3)=0:
for BKJJ=0 to 2
'ブロックの左縦から1行9文字をINV1へコピー
for YY=1 to 9: INV1(YY)=AL(BLKXLF+BKJJ,YY): next YY
CNT=0
for YYY=1 to 9
CNT=CNT+1
if INV1(YYY)=CHUMOKU then CNT=0:YYY=9:XCHU(BKJJ+1)=1
next YYY
next BKJJ
'-------------------------------------------
for BLKX=1 to 9
INV1(BLKX)=BLKOUT(BLKX)
next BLKX
if YCHU(1)=0 then goto *LBL200
INV1(1)=10:INV1(2)=10:INV1(3)=10:
*LBL200
if YCHU(2)=0 then goto *LBL210
INV1(4)=10:INV1(5)=10:INV1(6)=10:
*LBL210
if YCHU(3)=0 then goto *LBL220
INV1(7)=10:INV1(8)=10:INV1(9)=10:
*LBL220
if XCHU(1)=0 then goto *LBL300
INV1(1)=10:INV1(4)=10:INV1(7)=10:
*LBL300
if XCHU(2)=0 then goto *LBL310
INV1(2)=10:INV1(5)=10:INV1(8)=10:
*LBL310
if XCHU(3)=0 then goto *LBL320
INV1(3)=10:INV1(6)=10:INV1(9)=10:
*LBL320
WCHK=0
for III=1 to 9
if INV1(III)=0 then WCHK=WCHK+1:POJ=III
next III
if WCHK>=2 then ?"空マスが2個以上あった":return
if POJ<=3 then YY=1:XX=POJ:goto *MTRX
if (POJ>=4)and(POJ<=6)then YY=2:XX=POJ-3:goto *MTRX
if(POJ<=9) then YY=3: XX=POJ-6: goto *MTRX
?"ERR 5 ":stop
*MTRX
if BLKNO=1 then X=XX:Y=YY: goto *DTSET
if BLKNO=2 then X=XX+3:Y=YY: goto *DTSET
if BLKNO=3 then X=XX+6:Y=YY: goto *DTSET
if BLKNO=4 then X=XX:Y=YY+3: goto *DTSET
if BLKNO=5 then X=XX+3:Y=YY+3: goto *DTSET
if BLKNO=6 then X=XX+6:Y=YY+3: goto *DTSET
if BLKNO=7 then X=XX:Y=YY+6: goto *DTSET
if BLKNO=8 then X=XX+3:Y=YY+6: goto *DTSET
if BLKNO=9 then X=XX+6:Y=YY+6: goto *DTSET
?" ERROR 10 ": stop
*DTSET
AL(X,Y)=CHUMOKU
ALLCNT=ALLCNT+1
?" ":?" X=";X," Y=";Y," DATA=";CHUMOKU,"ALL CNT=";ALLCNT
'gosub *DISP3
?" ================ "
return
'---------------------------------------------------------------
*AAA
INV1(1)=AL(1,1): INV1(2)=AL(2,1): INV1(3)=AL(3,1)
INV1(4)=AL(1,2): INV1(5)=AL(2,2): INV1(6)=AL(3,2)
INV1(7)=AL(1,3): INV1(8)=AL(2,3): INV1(9)=AL(3,3)
gosub *BLKOUTCOPY
return
*BBB
INV1(1)=AL(4,1): INV1(2)=AL(5,1): INV1(3)=AL(6,1)
INV1(4)=AL(4,2): INV1(5)=AL(5,2): INV1(6)=AL(6,2)
INV1(7)=AL(4,3): INV1(8)=AL(5,3): INV1(9)=AL(6,3)
gosub *BLKOUTCOPY
return
*CCC
INV1(1)=AL(7,1): INV1(2)=AL(8,1): INV1(3)=AL(9,1)
INV1(4)=AL(7,2): INV1(5)=AL(8,2): INV1(6)=AL(9,2)
INV1(7)=AL(7,3): INV1(8)=AL(8,3): INV1(9)=AL(9,3)
gosub *BLKOUTCOPY
return
*DDD
INV1(1)=AL(1,4): INV1(2)=AL(2,4): INV1(3)=AL(3,4)
INV1(4)=AL(1,5): INV1(5)=AL(2,5): INV1(6)=AL(3,5)
INV1(7)=AL(1,6): INV1(8)=AL(2,6): INV1(9)=AL(3,6)
gosub *BLKOUTCOPY
return
*EEE
INV1(1)=AL(4,4): INV1(2)=AL(5,4): INV1(3)=AL(6,4)
INV1(4)=AL(4,5): INV1(5)=AL(5,5): INV1(6)=AL(6,5)
INV1(7)=AL(4,6): INV1(8)=AL(5,6): INV1(9)=AL(6,6)
gosub *BLKOUTCOPY
return
*FFF
INV1(1)=AL(7,4): INV1(2)=AL(8,4): INV1(3)=AL(9,4)
INV1(4)=AL(7,5): INV1(5)=AL(8,5): INV1(6)=AL(9,5)
INV1(7)=AL(7,6): INV1(8)=AL(8,6): INV1(9)=AL(9,6)
gosub *BLKOUTCOPY
return
*GGG
INV1(1)=AL(1,7): INV1(2)=AL(2,7): INV1(3)=AL(3,7)
INV1(4)=AL(1,8): INV1(5)=AL(2,8): INV1(6)=AL(3,8)
INV1(7)=AL(1,9): INV1(8)=AL(2,9): INV1(9)=AL(3,9)
gosub *BLKOUTCOPY
return
*HHH
INV1(1)=AL(4,7): INV1(2)=AL(5,7): INV1(3)=AL(6,7)
INV1(4)=AL(4,8): INV1(5)=AL(5,8): INV1(6)=AL(6,8)
INV1(7)=AL(4,9): INV1(8)=AL(5,9): INV1(9)=AL(6,9)
gosub *BLKOUTCOPY
return
*III
INV1(1)=AL(7,7): INV1(2)=AL(8,7): INV1(3)=AL(9,7)
INV1(4)=AL(7,8): INV1(5)=AL(8,8): INV1(6)=AL(9,8)
INV1(7)=AL(7,9): INV1(8)=AL(8,9): INV1(9)=AL(9,9)
gosub *BLKOUTCOPY
return
'----------------------------------------------------------------------------
*BLKOUTCOPY
for BLKX=1 to 9
BLKOUT(BLKX)=INV1(BLKX)
next BLKX
return
'----------------------------------------------------------------------------
*DISP1
'?" INV1(1~)=";
for KKK=1 to 9
?INV1(KKK);
next kkk
return
'---------------------------------------
*DISP3
?" "
for YYY=1 to 9
for XXX=1 to 9
?AL(XXX,YYY);
if XXX=3 then ?" ";
if XXX=6 then ?" ";
next XXX
if YYY=3 then ?" "
if YYY=6 then ?" "
?" "
next YYY
return
'---------------------------------------
'問題のテーブルデータの設定
'ニコリ全問解説数独P6
*TBL_P6
data 6,0,2,0,0,1,0,0,5
data 0,0,1,0,0,0,6,0,0
data 0,8,0,0,5,0,0,2,3
data 3,0,0,9,0,2,0,0,0
data 0,0,4,0,0,0,8,0,0
data 0,0,0,1,0,3,0,0,7
data 5,1,0,0,6,0,0,8,0
data 0,0,3,0,0,0,2,0,0
data 2,0,0,7,0,0,5,0,1

for YY=1 to 9
for XX=1 to 9
read AL(XX,YY)
next XX
next YY
return





今我が家の庭に大きく咲きだした変わった形のアジサイ
ばあちゃんが大事にしていた形見です。

c0335218_20195548.jpg

とんがり帽子の形をしています。 まだこれから大きくなるところですね。

c0335218_20200528.jpg


何という花?



c0335218_20201743.jpg

葉っぱの中心に紫色のかわいい花が咲いています。
c0335218_20204033.jpg






by telmic-gunma | 2018-06-20 20:41 | HP電卓 | Trackback | Comments(6)

4x4の数独(ナンプレ)をBASIC言語で解けるようになりました。
池田書店の「小学生のナンプレ」に載っている4x4の練習問題20問すべて解けたのでまず間違いないとおもいます。
前回は乱数を使って答えが合うまでやり直すという無茶な方法でしたが、今回は人間が考えるのと同じ手順で理屈に合わせながらすすめる方法でやりました。
解いていく過程で行き詰まって逆戻りしてやり直す機能が必要かなと思っていましたが、そのような機能は必要ありませんでした。
ニコリで出している「数独攻略ガイド」の9ページに


「面倒な先読みは数独では一切不要なのです。
「ここは確実にこれだ」という推理を積み重ねていくことで、
必ずただ1つの正解にたどりつくことができますよ。」
これだと 問題を作るとき、いい加減には出来ないですね。
ちゃんと1つづつ手順を考えて矛盾が起きないようにする必要がありますね。
逆に考えると、先読みが必要だったり逆戻りして数値入れ替えてやり直す必要がある問題なんて言うのも楽しいかもしれません。
すがわらさんが言っていた乱数とのハイブリッドなんていうのもいいですね。


いろいろと悩んだ原因で思いついたことは、「パズルは数式で表せないので、プログラム化し難い」という事でした。
数学や制御の計算ならば必ず「数式」があるのでそれに基づいてプログラム化できますが、「パズルの数式」というのは世の中にあるのでしょうか。

今回やった答えを出す手順を言葉で表すとするならば以下のようになります。
1、左上から右方向に空欄を探していく
2、空欄があれば、その座標の横方向、縦方向、含まれるブロック、の3種の縛りから各々の取りうる可能性のある数値をだす。
3、例えば横方向に1、と3、の数値が置かれていたらその空欄の取りうる可能性のある数値は2、と4、になります。
4、縦の方向に2、と3、の数値が置かれていたらその空欄の取りうる数値は1、と4、になります。
5、そのブロックに1、と2、が置かれていたら取りうる数値は3、と4、になります。
6、この3っつの縛りに共通しているのは4、だけなのでここは4で確定するということになります。
7、もし共通する数値が2個以上あるということならば確定しないのでそこは何もしないでパスします。
8、これをすべての空欄について行うと必ず答えが見つかります。
  (まだ 4x4 でしか動かしていませんが)

わたしにとっては、このような言葉での説明が一番わかりやすいですね。
それは、私の頭の中でこのような言葉で考えているからでしょうか。

つぎは、これがHP電卓で動作できるか、そして 9x9に対応させられるかというところですね。
c0335218_15183401.jpg


c0335218_15190578.jpg


c0335218_15193404.jpg


c0335218_15200548.jpg


F-BASIC97 人間が考えるのと同じ手順でやってます。



'数独 SDOK_61B

'基本テーブル配列の定義
dim AL(4,4) '4行4列の元データ
dim CHK(12) '可能性データの集合 横4個 縦4個 ブロック4個
dim INV1(4) '変換前のテーブルデータ
dim INV2(4) '変換後の可能性数値データ
'
'問題のテーブルデータの設定
gosub *TBL020 '小学生のナンプレ 例題 020
gosub *DISP3 '数値確認のため 画面表示
stop
'空欄のマスをサーチする
for Y=1 to 4
for X=1 to 4
'?" X=";X;:?" Y=";Y;
if AL(X,Y)=0 then gosub *SHORI   'もし空欄ならSHORIルーチンへ行く
next X
next Y
?" All kaitou"
stop:stop 'メインルーチン 終わり
'-------------------------------------------------------------------------
'空欄のたて、横、ブロックのデータを読み込む
*SHORI
for XX=1 to 12
CHK(XX)=0 '変換テーブルをクリアする
next XX


for XX=1 to 4
INV1(XX)=AL(XX,Y) '該当する横軸データ4個を変換テーブルにコピーする
next XX
'空欄に入る可能性データに変換する
for XX=1 to 4
INV2(XX)=XX  ’変換テーブルの種データ1~4を入れておく
next XX
for YY=1 to 4
for XX=1 to 4
if INV2(XX)=INV1(YY) then INV2(XX)=0  ’同一データの時は消す
next XX
next YY
for XX=1 to 4
CHK(XX)=INV2(XX)   ’残った可能性有りデータを移す
next XX
'------------------------------------------------
'問題のテーブルから縦の列データをコピーする
for YY=1 to 4
INV1(YY)=AL(X,YY)
next YY
'空欄に入る可能性データに変換する
for XX=1 to 4
INV2(XX)=XX
next XX
for YY=1 to 4
for XX=1 to 4
if INV2(XX)=INV1(YY) then INV2(XX)=0  ’可能性無いのを消し有りを残す
next XX
next YY
for XX=1 to 4
CHK(XX+4)=INV2(XX)
next XX
'-------------------------------------------------
'問題のテーブルからブロックデータをINV1へコピーする
if (X<=2)and(Y<=2) then gosub *AA:goto *BLKMOVEND
if (X>=3)and(Y<=2) then gosub *BB:goto *BLKMOVEND
if (X<=2)and(Y>=3) then gosub *CC:goto *BLKMOVEND
if (X>=3)and(Y>=3) then gosub *DD:goto *BLKMOVEND
?" ERR_blkend":stop
*BLKMOVEND
'空欄に入る可能性データに変換する
for XX=1 to 4
INV2(XX)=XX
next XX
for YY=1 to 4
for XX=1 to 4
if INV2(XX)=INV1(YY) then INV2(XX)=0
next XX
next YY
for XX=1 to 4
CHK(XX+8)=INV2(XX)
next XX
'-------------------------------------------------
'
BF(1)=0:BF(2)=0:BF(3)=0:BF(4)=0
for M=1 to 4
KZ=0:GT=0
for T=1 to 12
if CHK(T)=M then KZ=KZ+1
if KZ>=3 then ANS=M:GT=1:BF(M)=1:T=12: ’同一数値が3個あれば可能性有りとする
next T
next M
OKCHK=BF(1)+BF(2)+BF(3)+BF(4) ’可能性有りフラグを合計する
if OKCHK<>1 then goto *NON    ’可能性有りが1つ以外ならダメ
AL(X,Y)=ANS          ’可能性OKなので空欄に書き込む
*NON
gosub *disp3
?" LOOP end"
return
'-------------------------------------------------
’該当するブロックデータを変換テーブルに移す
*AA
INV1(1)=AL(1,1): INV1(2)=AL(2,1): INV1(3)=AL(1,2): INV1(4)=AL(2,2): return
*BB
INV1(1)=AL(3,1): INV1(2)=AL(4,1): INV1(3)=AL(3,2): INV1(4)=AL(4,2): return
*CC
INV1(1)=AL(1,3): INV1(2)=AL(2,3): INV1(3)=AL(1,4): INV1(4)=AL(2,4): return
*DD
INV1(1)=AL(3,3): INV1(2)=AL(4,3): INV1(3)=AL(3,4): INV1(4)=AL(4,4): return
'-------------------------------------------------------
*DISP1   ’デバッグ用画面表示
?" INV1(1)=";INV1(1),
?" INV1(2)=";INV1(2),
?" INV1(3)=";INV1(3),
?" INV1(4)=";INV1(4)
return

*DISP2   ’デバッグ用画面表示
?" INV2(1)=";INV2(1),
?" INV2(2)=";INV2(2),
?" INV2(3)=";INV2(3),
?" INV2(4)=";INV2(4)
return

*DISP3   ’デバッグ用画面表示
?AL(1,1);:?AL(2,1);:?AL(3,1);:?AL(4,1)
?AL(1,2);:?AL(2,2);:?AL(3,2);:?AL(4,2)
?AL(1,3);:?AL(2,3);:?AL(3,3);:?AL(4,3)
?AL(1,4);:?AL(2,4);:?AL(3,4);:?AL(4,4)
return

*DISP4   ’デバッグ用画面表示
for X12=1 to 12
? CHK(X12);
next X12
?" "
return

'問題のテーブルデータの設定

*TBL020
AL(1,1)=4:AL(2,1)=0:AL(3,1)=0:AL(4,1)=0:
AL(1,2)=2:AL(2,2)=0:AL(3,2)=3:AL(4,2)=4:
AL(1,3)=3:AL(2,3)=4:AL(3,3)=0:AL(4,3)=1:
AL(1,4)=0:AL(2,4)=0:AL(3,4)=0:AL(4,4)=3:
return




庭の花です。  今年はもう咲きだしました。 アルストロメリアでしたよね。
c0335218_15221863.jpg

これは なでしこ ですね。

c0335218_15204173.jpg



c0335218_15213889.jpg


by telmic-gunma | 2018-06-03 16:08 | HP電卓 | Trackback | Comments(4)

前回 「数独」をBASICと乱数を使って解いてみたものを、同じ方法でHP電卓でやりました。
電卓の機種はメモリー容量の心配があったので容量の大きなHP42Sを使いました。
結果は 226ステップ(380Byte)で済みましたのでHP32SやHP15Cでもそのまま行けると思います。
(HP42Sはメモリーが7kByteあるので 5%しか使わなかったのですね。)

時間は 4x4マス(16マス)のうち空欄が2個の状態で、50秒かかりました。乱数なので運しだいですけれど。
演算時間に関して乱数で総当たりはHP電卓には可哀そうですが、人間が考える手順と同じ方法で答えを確定的に決めていければ早くすむと思います。
メモリ容量に関してはこの「HP42S」で頑張ってみてもし足りなくなるようならば「HP48G」(128kByte)もいいかな。

「こんなのやっても意味ないじゃん」と言われそうですが(すでに言われていたかな)そんなことありません。
「ボケ」の防止には十分役立っています。
ブログを見ていたら、どなたかHP電卓大好きなひとが、定年退職しちゃってHP電卓あっても計算することがない、となげいていましたが、そのお気持ちわかりますね。
 
今回「乱数」で答えを出すなどと超邪道な方法でしたが、次には人間が考える手順と同じ方法をやらせてみようとおもいます。
その次には、9X9マス フルサイズに挑戦、 すがわらさんが教えてくれた合成した方法などまだまだいろいろと楽しめそう。


c0335218_10495804.jpg

01  LBL "SDOK01"
02 LBL 01     ’ローカルフラグ メインループヘッド
03 XEQ 02     ’元になる問題を定数に入力する
04 XEQ 03     ’空いたマスに乱数で数値を埋めていく
05 XEQ 04     ’縦、横、ブロック、の3要素がルールに合うかチェック
06 FS? 01     ’OKでないなら先頭に戻り違う数値でやり直す
07 GTO 01
08 STOP

’4X4の16マスに問題を埋めていく(R1~R16を4X4マスに相当させる)
今回の問題 R1とR2が0が入って空欄です。
'R1=0, R2=0 R3=1, R4=2
’R5=1, R6=2 R7=3, R8=4
’R9=2, R10=3, R11=4, R12=1
'R13=4, R14=1, R15=2, R16=3

09 LBL 02
10 0
11 STO 01
12 STO 02
13 1
14 STO 03
15 2
16 STO 04
17 1
18 STO 05
19 2
20 STO 06
21 3
22 STO 07
23 4
24 STO 08
25 2
26 STO 09
27 3
28 STO 10
29 4
30 STO 11
31 1
32 STO 12
33 4
34 STO 13
35 1
36 STO 14
37 2
38 STO 15
39 2
40 STO 16
41 RTN


’R1~R16で0を探し0の所に1~4の値を乱数で入れる
42 LBL 03
43 RCL 01
44 XEQ 31
45 STO 01
46 RCL 02
47 XEQ 31
48 STO 02
49 RCL 03
50 XEQ 31
51 STO 03
52 RCL 04
53 XEQ 31
54 STO 04
55 RCL 05
56 XEQ 31
57 STO 05
58 RCL 06
59 XEQ 31
60 STO 06
61 RCL 07
62 XEQ 31
63 STO 07
64 RCL 08
65 XEQ 31
66 STO 08
67 RCL 09
68 XEQ 31
69 STO 09
70 RCL 10
71 XEQ 31
72 STO 10
73 RCL 11
74 XEQ 31
75 STO 11
76 RCL 12
77 XEQ 31
78 STO 12
79 RCL 13
80 XEQ 31
81 STO 13
82 RCL 14
83 XEQ 31
84 STO 14
85 RCL 15
86 XEQ 31
87 STO 15
88 RCL 16
89 XEQ 31
90 STO 16
91 RTN
92 LBL 31
93 Xキ0?
94 GTO 32
95 RAN
96 4
97 X
98 1
99 +
100 IP
101 LBL 32
102 RTN

’たて、よこ、ブロック、の4文字単位で数値のダブリがあるかチェックする。
103 LBL 04
104 RCL 01
105 RCL 02
106 RCL 05
107 RCL 06
108 XEQ 41
109 FS? 01
110 RTN

111 RCL 01
112 RCL 02
113 RCL 05
114 RCL 06
115 XEQ 41
116 FS? 01
117 RTN

118 RCL 01
119 RCL 02
120 RCL 05
121 RCL 06
122 XEQ 41
123 FS? 01
124 RTN

125 RCL 01
126 RCL 02
127 RCL 05
128 RCL 06
129 XEQ 41
130 FS? 01
131 RTN

132 RCL 01
133 RCL 02
134 RCL 05
135 RCL 06
136 XEQ 41
137 FS? 01
138 RTN

139 RCL 01
140 RCL 02
141 RCL 05
142 RCL 06
143 XEQ 41
144 FS? 01
145 RTN

146 RCL 01
147 RCL 02
148 RCL 05
149 RCL 06
150 XEQ 41
151 FS? 01
152 RTN

153 RCL 01
154 RCL 02
155 RCL 05
156 RCL 06
157 XEQ 41
158 FS? 01
159 RTN

160 RCL 01
161 RCL 02
162 RCL 05
163 RCL 06
164 XEQ 41
165 FS? 01
166 RTN

167 RCL 01
168 RCL 02
169 RCL 05
170 RCL 06
171 XEQ 41
172 FS? 01
173 RTN

174 RCL 01
175 RCL 02
176 RCL 05
177 RCL 06
178 XEQ 41
179 FS? 01
180 RTN

181 RCL 01
182 RCL 02
183 RCL 05
184 RCL 06
185 XEQ 41
186 FS? 01
187 RTN
188 12345678  ’答えが見つかったので画面に12345678と表示しておわる
189 RTN

 ’4文字単位で同じ数値が無いことを確認する
190 LBL 41   
191 STO 24
192 R↓
193 STO 23
194 R↓
195 STO 22
196 R↓
197 STO 21
198 SF? 01
199 RCL 22
200 X=Y?
201 GTO 42
202 RCL 21
203 RCL 23
204 XキY?
205 GTO 42
206 RCL 21
207 RCL 24
208 XキY?
209 GTO 42
210 RCL 22
211 RCL 23
212 XキY?
213 GTO 42
214 RCL 22
215 RCL 24
216 XキY?
217 GTO 42
218 RCL 23
219 RCL 24
220 XキY?
221 GTO 42
222 CF 01
223 RTN

224 LBL 42
225 RTN
226 END




今年はじめての イチゴの収穫です。
手入れをしていないので、やはりだんだんと小さくなってきたようです。
このイチゴ 今シーズン食べ終わったら植え替えてみます。
真ん中は大きさ比較のための電卓のHP29Cです。
わたしの美的センス なんとかならないか。

c0335218_10492890.jpg
ジャガイモです。 成長がびっくりするぐらい早いですね。

c0335218_10502969.jpg



ジャガイモのはな、  それなりにきれいですね。

c0335218_10510503.jpg


by telmic-gunma | 2018-05-24 11:20 | HP電卓 | Trackback | Comments(4)

ディスコのプログラムコンテストをネットで見たら 問題はチラシ広告だけでなくネット上にも在り合計3問出ていたのですね。
3問目は文字列を扱うので電卓では無理だけど2問目はできそうなので挑戦してみることに。


c0335218_13073923.jpg

2問目
1~1000までの間で3と5の両方で割り切れる数の
20番目と40番目と60番目の合計は?

3問目
次の300 個の名字の文字列の中で、
3 番目に多いアルファベットとその数は?
解答は「アルファベット」「数」を
カンマで区切り、記入ください。
( この後 ダウンロードするクリックがある これは HP電卓ではできません )

2問目の解き方を考えるため電卓いろいろいじっていたらプログラムを組むまでもなく答え 1800が出てきてしまった。
ここで用事頼まれて用足しして戻ってきたらメールが来ており kusakaさんは2問目も3問目もプログラムで解けたということです。
こちら もうやる気無くしていたのですが後から答えの1800が出るプログラム作ることに。
こんなの たしか大昔に読んだ星新一のショートショートにあったですね。
人間がプログラム作らずに神様の御利益を受け取っていたけれど、後になって神様は人間に「プログラムを作らないと滅ぼすよ」と言ってきて
人間は必死にプログラムを作るというような話だったかなー

2問目  kusakaさんのソフト
***********************************************

前回のでなれたから5分で出来ました。

答え1800

3問目はあまり扱わない配列、文字列なので手こずりましたが

30~40分で出来ました。


2問目 全プログラムリスト    kusakaさん作

#include <stdio.h>

void main()

{

    int ans = 0;

    int i;

    int c = 0;

    for(i = 1; i <= 1000; i++){

        if(i % 3 == 0 && i % 5 == 0){

            c++;

            if( c == 20 || c == 40 || c == 60){

                 printf("find\r\n");

                ans = ans + i;

            }

        }

    }

    printf("ans = %d\r\n", ans);

}


***********************************************************
以下はわたしの HP32Sii RPNでのソフトです。

2問目 使用されている変数 A,E,F

A01 LBL A
A02 0
A03 STO A    現在実行中の数 1~1000
A04 STO E 5と3で割れた回数
A05 STO F    20,40,60の時の数を加算したもの

B01 LBL B
B02 1
B03 STO +A   調べる数値を加算する
B04 RCL A
B05 5      調べる数値を5で割る
B06 ÷
B07 FP (FRACのこと)
B08 X キ 0 ?   5で割り切れたかチェック
B09 GTO B    割り切れなければ LBL B へ戻る
B10 RCL A
B11 3      調べる数値を3で割る
B12 ÷
B13 FP
B14 X キ 0 ?   3で割り切れたかチェック
B15 GTO B    割り切れなければ LBL B へ戻る
B16 1      5と3で割り切れたのでカウンターを1上げる
B17 STO +E   Eに1加算する
B18 RCL E    Eを読み込む
B18 20      カウンターが20になったかチェック
B20 X キ Y ?
B21 GTO C    20でないなら LBL C へ行く
B22 RCL A    現在実行中の数を読み込む
B23 STO +F   現在実行中の数をFに加算する
C01 LBL C
C02 RCL E    現在の5と3で割り切れた数を読み込む
C03 40     40か否か
C04 X キ Y ?   比較する
C05 GTO D   40でないなら LBL D へ行く
C06 RCL A
C07 STO +F   現在実行中の数をFに加算する
D01 LBL D
D02 RCL E    現在の5と3で割り切れた数を読み込む   
D03 60
D04 X キ Y ?   60か否かチェック
D05 GTO B    60でないなら LBL B へ行く
D06 RCL A
D07 STO +F   60の時の値を加算する
D08 RCL F    20,40,60の時の値の加算されたものをXレジに読み込む
D09 STOP    答えが表示されておわり

これで終わりです。


使用した電卓は HP32Sii です。 答えの”1800”がでるまでに48秒くらいかかりました。
このソフトでは一つづつすべての数値を調べていますが、kusakaさんに指摘で5の倍数だけ調べればいいわけですから
B02の1を5に変えることにより20秒で済むようになりました。

前回 HP32S を使い今回 HP32Sii を使ったのですが、デバッグ時の使い勝手は HP32S の方が良いですね。
HP32Sの方が多少機能が低いようですが プログラムモードの時ステップ送りをするのに1キーですむのにたいして
HP32Sii ではキーを2回押さなければならずデバッグ中にプログラムを壊してしまうことがありました。



by telmic-gunma | 2017-10-14 13:12 | HP電卓 | Trackback | Comments(2)

今年の目標 考えた


お正月に来ていた子供や孫が帰ったとたんに風邪をひいて寝込みました。
世の中には「孫疲れ」というものが、あるそうですがそれにかかったのかなー。
若いころは風邪をひいてもオートバイを乗り回してくればすぐに治ったのに今ではなかなか治りません。

「今年の目標」なんて小学生の作文じゃないですが 一応考えてみます。

1. 自転車
  長野から埼玉への三国峠、中津川林道へのサイクリングに行く。
  ここは昔からの夢だったのですよ。
  一緒に行く仲間が見つかったので今年こそ実行できるでしょう。
  体を鍛えておかなくては。

2.ダイエット
  いま 私の体重 77.0㎏ これを12月には70㎏を切りたい。
  できれば66.0kg  最終目標は62.0kg
  以前 ダイエットの競争して3か月で5㎏減らすことができました。

3、毎日歩く
  1時間 ダイエットとボケ予防も兼ねる。

4.HP電卓を使って数学の勉強。
  三日坊主を無くせればなー

5.ブログ
  週 2個書きたい  「電子工作やってみたよ」に沿った内容で作る。

6.死ぬまで仕事をする
  先日 親戚の床屋さんにいってきました。
  83歳で現役 頭もしゃべり方もシャープです。
  このあいだニュースで105歳で現役の床屋さんを紹介していました。
  指や手を使うのは頭にいいのですね。
  私の知り合いの人は60歳で定年後は毎日昼間からお酒を飲んでテレビを見ていました。
  70歳になったときはろれつが回らなくなっていました。
  以上少ないサンプルですが、人間は死ぬまで仕事をしていればボケないということですね。
  

とりあえずこんなところですか。
やりたいこと思いついたら追加していこうとおもいます。


by telmic-gunma | 2017-01-09 22:38 | ときどき思うこと | Trackback | Comments(9)

電池CR2032が使用されている最近の2機種について消費電流を計ってみました。
2機種とも電池は並列で使用されパワーコントロールされているようなので同時に各々を計り合計してみました。
hp15C_LEに関しては、電流のバランスが崩れても合計が一定になるように制御されているようです。
やはり電源OFF時の消費電流が昔のものに比べて100倍から1000倍大きくなっていますね。
これだもの机にしまっておくだけで電池が無くなってしまうのですね。
意外にもキー入力待ちの時は、少ないです。
プログラム実行中の消費電流は演算速度がダントツのHP15C-LEがやはり一番食べてます。
これで気になる機種の消費電流はひと通り計りましたが、電池が早くなくなると言われているものは、それなりに消費電流が大きいことが裏付けられました。
電流測定は、三和計測器のデジタルテスター PC5000を使用しました。
この測定では、2個の電池の各々の電流が変な挙動をするので、一週間以上悩みました。
HP15C_LEの電源OFF時の3.65μA以下の”以下”は不要です。

c0335218_17432480.jpg


















c0335218_17433451.jpg
















追記(2016-12-3 )
すがわらさんからコメントで測定データーに検証を加えていただいたのでここに移しました。
********************************************************************
HP35sの大喰らいが実証されましたね。それにしてもこの暗電流の多さは... 完全に設計ミスだと思える量。CPUの設計の古さなんでしょうね。
パナのCR2032の公称容量は220mAhと有りますから、全部使えるとして10476時間なので436日。実際には半分くらいで電圧不足になるのでしょうから、218日なので7カ月程度。まぁ半年くらいでダメになるという感触と有っているように思います。
少し前から0.9V程度あれば起動できるDC-DCコンバーターが実用化されてますので、そういったものを搭載して、最後の一滴まで搾り尽すような設計が欲しいですね。
********************************************************************



by telmic-gunma | 2016-12-02 18:03 | HP電卓 | Trackback | Comments(2)

”すがわら”さんから HP35Sの遅い理由を教えていただいたのでここに載せます。

35sのバッテリーについてはやはり「持たない!」と海外でも騒いでいるようです。それと速度ですけど、35sのCPUは液晶駆動用LSIにCPUが内蔵された形のもので、SPLB31Aという台湾のGeneraplusという会社の物とのこと。
で内蔵されているCPUですが、MOS Technologyの8502です。
ここでヌヌヌと思われたかもしれませんが、8502は「あの」6502のI/O内蔵版である6510の改良品だそうです。
しかしながら8bitであり、低消費電力のためクロックもそれほど高くできないので、それほど早く無いとなります。
オリジナルの8502は2MHzクロック。SPLB31Aはデーターシート上ではVDD 3.6V時にMax 5MHzです。
チップのデーターシートではVDDの最大値が5.5Vとなっていますので、35sについてはバッテリーはパラ接続と思われます。というか、実際に片方外しても動きました... なので、消費電流計測も失敗なさったのだと思います。
hpmuseumというところのフォーラムには10uAだったてな話も出ていますが、もっと暗電流がありそうな気がします。
対して15C-LEにはAtmelのAT91SAM9というCPUが使用されていて、動作クロックも200M~400MHzと桁違い。CPU coreも32bitですし。なのでこれだけの速度差が出るのですね。
英語版のWikipediaにはいろいろと興味深いことがかいてあります。35sのご先祖様であるHP35はMostek製の1bit CPU(シリアル処理CPUですね。MC14500みたいな)で構成されているとか。
それにしてもこんなところで6502にお目にかかるとは思っても見ませんでした。8bitの名CPUって結構しぶとく生き残っているものですね。
知っている範囲では、パチンコ台の出玉制御のZ80(コアのみですけど)、古いタイプになりますがPS/2キーボードの8051、某ICカードの68HC11...

”すがわら”さんからの情報は以上です。 ありがとうございました。
HP35Sの消費電流 ますます計ってみたくなりましたね。 



c0335218_18081020.jpg












by telmic-gunma | 2016-11-25 06:42 | HP電卓 | Trackback | Comments(0)

HP電卓の演算速度 HP35S, HP41CV を計測しました。
HP35SはHP15C_LEよりも十倍以上遅いのは不思議です。
測定プログラムは前回使用し他の機種に使ったものと同じです。
そもそもこういう仕様なのか、私の計測ミスなのか、もし原因判ったら教えてください。

HP41CVのプログラムはカウント終了比較のところが Xキ0 から X=0でやるために
ループのステップ数が6から7に増えています。

HP41CVのテストプログラムです。

LBL ”AA"
200
STO 00
LBL "BB"
1
STO -00
RCL 00
X=0?
R/S
GTO "BB"


HP35Sはしまっておくだけで電池がなくなるので、消費電流計ろうとしたのですが、まだ上手くいってません。
c0335218_19010913.jpg














c0335218_18081020.jpg
































by telmic-gunma | 2016-11-24 19:00 | 基板製作 | Trackback | Comments(0)

畑のあと片付けをしていたら掘り忘れた、さつまいもが土の中から出てきました。
ささやかな事ですが、うれしいですね。
むかし 机の奥から封の切ってない給料袋が出てきたことがありましたが、その時と同じ位うれしいですね。
(もちろん中身の入った自分のですよ。当時は銀行振り込みではなかったですね)

c0335218_20435460.jpg






















畑にまいておいたチンゲン菜(左)とほうれん草(右)はかなり大きくなっていました。
チンゲン菜の炒め物 新鮮なせいかとても美味しかったです。

c0335218_20441138.jpg



























追記  2016-11-24 上記写真の次の日です。11月には珍しい大雪で20cm以上積もりました。
           チンゲン菜とほうれん草も雪の中。
           ビニール潰れないように雪を落としました。

c0335218_20141589.jpg


















c0335218_20143039.jpg








by telmic-gunma | 2016-11-23 20:59 | 農作業 | Trackback | Comments(2)