ブログトップ

電子工作やってみたよ

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

前回の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(5)

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)

HP電卓の機種事の演算速度の比較をしてみました。
方法は下記のごく単純な同一プログラムを入れてプログラムが停止するまでの時間を測定してみました。
機種によってラベル名や変数名がアルファベットや数値なったりします。
また HP32S,HP32Sⅱ,HP4Sでは初期設定の200が1ステップで済みますが、
影響は微小なので無視します。
さすが新しいHP15C_LEは旧HP15Cに比べて150倍はすごいですね。
命令の種類によって1ステップの処理時間は当然変わってくるはずですが、
機種事の比較だけならこれでよいとおもいます。

追記 2016-11-24 HP35S、HP41CVの測定結果を載せたものをこの後のブログで出しています。

テストプログラム

LBL A
2
0
0
STO 0
LBL B
1
STO -0
RCL 0
Xキ0
GTO B
 

c0335218_05582268.jpg
















c0335218_19565409.jpg



by telmic-gunma | 2016-11-17 06:20 | HP電卓 | Trackback | Comments(4)