2021年1月15日金曜日

excelでmandelbrot (ってjuliaじゃないんかい!)

 とある会社の請求・給与・勤怠管理をプログラミングしてるときに出力がExcelというのがあってExcelのひな型をさわっていてふと思いました。

以前のExcelはカラム数が255までだったけど今はどれくらいなのだろう?

答えはググってすぐに16384列(XFDまで)とわかりました。
で、以前1セル1ドットに見立ててフラクタル書いてみたんだけどやはり粗いしすぐに興味を失ったんだけどいまならもう少し行けるんじゃね。っていうことでやってみました。

26進数でカラムを数えて640=XPってことで見えてるようなセル番号になってます。
マウスで列とか行とかの高さや幅を調整するとピクセル数も出るので楽でした。
いやはや結構良いんじゃないでしょうか?
よく噛ませ犬みたいに古いBASICで比較のために書いたりしてましたけどもういい加減懐古趣味からは卒業しようと思っていたのでこれからはExcelを比較の最初にしようかと思います。画像がちょっと前に宣言してたjulia集合の図と違うのはまだお手本無しに書けないからです。(さすがにmandelは回数書いてますから)

斜めの直線を書いたりするのはちょっとしんどいけどちょっとしたグラフィックの実験なら別に環境を用意するとか無しに使えて面白いです。特に集合系の描画はドット単位の色ずけがほとんどなので・・


2021年1月8日金曜日

今年のフラクタルはジュリア

 ここ数年(昨年末まで)はmandelbrot集合を描くプログラムをしばしば条件をなるべく揃えてベンチマーク的に書いてきた。

これはmacbookでpygameとnumbaを併用して0.5秒ほどで得られたもの。
計算対象区間を変えるといろいろと楽しい画像が得られるのはフラクタルならではなのだがいつもいつも8色のmandelbrotでもあるまいということで今年からは計算対象を変えたいと思う。
同じくフラクタルのjulia集合の画像です。
まだ経験値が低くて他の方のプログラムをネットから探してくて少しアレンジを加えた程度です。
julia集合の何が面白いかというと計算の元になる複素数を少し変えるだけで得られる結果の画像がかなり大きく変化することと描画のための色を決定する方法が色々あって楽しめるようです。c.f. https://codezine.jp/article/detail/310 
上の2つは同じパラメータで得た画像だけど各点における色の計算を変えるだけでこんなにも違う画像になるみたいです。

いろいろと少しずつでも広げていかないと・・・





2021年1月6日水曜日

Viva!エミュレータ

 エミュレータが好きである。
コンピュータで別のコンピュータやゲーム機を模するソフトが面白くて仕方ない。
当然、昔からの専用のエミュレータソフトも楽しい。
しかし最近はPCの性能が上がって効率的なエミュレーションができるようになってきた。

その最たるものがVirtualBoxだ。(異論もお有りでしょうけど・・)
そのmac上で動くターゲットOSが[PC-DOS2000J,Windows 98SE,Windows2000pro,WindowsXP,Windows7(Home 64bit)]とあるのだがせっかくmacで動いても残念なのがPC-DOSなのである。

現状autoexecでfilmtnが起動するようにしてあって下記のような画面になる

で、カーソルで移動しつつEnterでフォルダを掘ったりしながら作業を自在にすすめることができる。で、テキストファイルでEnterを押すとまずはテキストビュアーで見える。
これはDos/V用のスペードテストの結果の冒頭でこのエミュレータが5.3GHzクロックのPentiumとして認識されているのがわかる。大昔のPC-XTの8435倍だと・・
それは大変うれしいのだがここで更にEnterを押すと指定のエディタで編集に入ることができるのだが入力が思うままにならない。まず漢字変換のモードに出来ない。
なぜってmacに全角/半角キーがないから、その他PC-DOSの結構複雑な漢字変換周りのキーがほとんどうまく操作できない。日本語が入れられないのは寂しいので一応緊急用及び他のPCで実験用にコンパイルしたオブジェクトの実行用に保存はしておくがmacでソースをいじる事は無いであろうことは確実。ああ、残念。

2021年1月5日火曜日

macbookのmacosを更新した

 昨夜から今日にかけてmacbook pro(2013 late)のOSをsierraからmojaveに更新した。
買ったときはmavericks(10.9)だったのを昨年、結構考えてsierra(10.12)にしたのだが今回さらなる更新に及んだのである。

ハード(2013 late)とmacosの乖離が大きくなるほど導入後にいろいろな傷が出てくると思うのでいよいよこのmacbookでのOS更新も最後であろうかと思う。
そもそもsierraからhigh sierraにするのをためらっていたのもSSDのフォーマットが大きく変わることへの不安が大きかった。で、1世代見送って様子をみて今回のmojaveである。

変えてみて思うのは、本当にmacはよく出来ていてOSを上げても体感上の重さはほとんど感じない。また僕が入れている程度のmacのソフトはそのまま動いている。最終的にどのように感じるかは現時点ではわからないけどtime machineでバックアップも取ってあるので不安は少ない。いざとなればもとに戻すだけのことだ。

parallelsで入れているwindows10は先回のOSアップでboot campとの併用はできなくなってしまったのであくまでもmacos使用時にどうしてもwin10を使いたくなったときの逃げ場として動くかどうか見ておく。最初メモリーを2GBふってあったのだがやっぱり重くなりやすいので3.5GBに変更した。あとは以前のままだが結構サクサク動くので驚き。(ただしmacbookの左の下は結構熱くなる。)

まあ仕事でどうしてもmacじゃなきゃだめってものは現状無いので気楽に楽しく付き合っていこうと思う。

2021年1月3日日曜日

すっかりアルゴリズムなし脳になっているので数字パズルを解く

 超ひさしぶりに頭を使うことにしよう。

結構ポピュラーな数字パズルを解く。
 SEND
+MORE
-------------
MONEY

を考える。言語はなんでも解けると思うけど今はpythonで

最初は総当たりのもっとも原始的なループでの方法を考える。
変数 S,E,N,D,M,O,R,E,Yをすべて0−9のループで回す。

できたのがこれ

#SEND+MORE=MONEYを総当たりで解く

for s in range(10):
for e in range(10):
for n in range(10):
for d in range(10):
for m in range(10):
for o in range(10):
for r in range(10):
for e in range(10):
for m in range(10):
for y in range(10):
if (s*1000+e*100*n*10+d)+(m*1000+o*100+r*10+e)==m*10000+o*1000+n*100+e*10+y:
if s>0 and m > 0:
print(s*1000+e*100*n*10+d,m*1000+o*100+r*10+e,m*10000+o*1000+n*100+e*10+y)


なんだかすごいことになっている。ちょっとこれはないわ。プロンプト帰ってこないし・・

あ、eとmがダブってループしてました、酷い。

そもそもいくら総当たりとはいえrangeですべて回すのは頭悪すぎ
14行めのif s>0 and m>0: はこれが無いと平気で 3009,301,3310とか出力してきちゃうので各変数文字の重複を禁止するのと4桁なり5桁の数値の頭が0じゃない判断くらいはしろよと・・

で、ほんのちょっとだけ数学的に考えると同桁の数値を足して繰り上がるのは1しかないのでm=1は確定だし下からの繰り上がりを考慮してもm(=1)と足して繰り上がることができるsは8か9になる。この辺りの縛りと重複を避けるようにして先程のプログラムに手を入れると

#SEND+MORE=MONEYを総当たりで解く
#各変数は重複せずm=1,sは8 or 9で考えると

m=1
for s in [8,9]:
kouho = list(range(10))
kouho.remove(m)
kouho.remove(s)
for e in kouho:
kouho.remove(e)
for n in kouho:
kouho.remove(n)
for d in kouho:
kouho.remove(d)
for o in kouho:
kouho.remove(o)
for r in kouho:
kouho.remove(r)
for e in kouho:
kouho.remove(e)
for y in kouho:
if (s*1000+e*100*n*10+d)+(m*1000+o*100+r*10+e)==m*10000+o*1000+n*100+e*10+y:
print(s*1000+e*100*n*10+d,m*1000+o*100+r*10+e,m*10000+o*1000+n*100+e*10+y)

となる。だけど上の方法ではうまくループが回らない。
(ああ、ここでもeを重ねてループしてるわ、リハビリ必要)
e以下のremoveを止めると・・・・あー分からない もう少し頭を冷やして考えよう

そもそもいろいろ忘れていてコードの効率が悪い。
重複のチェックにsetを使うことまでは頭が回るけどkosuu= set()
kosuu.add(m)みたいに8個の変数でやる。これは素人以下。頭を冷やそう。

#SEND+MORE=MONEYを総当たりで解く
#各変数は重複せずm=1,sは8 or 9で考えると

m=1
for s in range(8,10):
for e in range(10):
for n in range(10):
for d in range(10):
for o in range(10):
for r in range(10):
for y in range(10):
if len(set([m,s,e,n,d,o,r,y]))==8:
send=s*1000+e*100+n*10+d
more=m*1000+o*100+r*10+e
money=m*10000+o*1000+n*100+e*10+y
if send+more==money:
print(send,more,money)

結局上のリストのようになりました。なんだかシンプル。まだまだpythonの基本がわかってない。

単に途中までパズルをときかかったのでもう少し進めると

m=1、s=8 or 9より判った分の文字と数値を入れ替えて s=8と仮にすると
 8END
+1ORE
-------------
1ONEY となる。桁上りするのでE+0>10なのだが千の桁が桁上りすると0がゼロになるがそれだとE+O>10が満たせないのでS=9が確定、同時に0はゼロ これをはめ込むと
 9END
+10RE
-------------
10NEY     である。さらにこれでN=E+1なのでE+1+R(+1)=10+Eでカッコのの桁からの繰り上がりの有無を考えると、必要となるので(9が使われているので)R=8となる。見難いけど
 9E(E+1)D
+108E
10(E+1)EY 2・3桁目は桁上りだけなのでD+E=10+YでDとEは(7,6)(7,5)のいずれかの組合せとなる(6,5)では和の1桁目が1となり既に使用済み。E=7とするとN=8となり不可
E=6なら
 967D
+1086
1076Y となり繰り上がれるDは5のみだがY=1になるので不可 よってE=5

 956D
+1085
1065Y で繰り上がれるDは7でYは2となる。

ちなみにパズルの答えは正しく 

Send = 9567
More = 1085
Money = 10652

一応記述したプログラムも同じ解を表示しているので今日は良しとする。

2021年1月2日土曜日

年間1万行計画

 この1年を通していろんなソフトウェアに関する見識を広めたい。

で、年間1万行のコードを書くことを決めた。まあ週に200行ってことだ。
毎日コードを書くことを生業にしている人から見たら笑っちゃうぐらい小さな目標だけど有意なコードをこのペースで書くって意外としんどいと思うので自分には分相応なかんじ。
三賀日は3日で評価して以後は毎週末に200行で何を書いたか見せられたらいいね。

で、早くも自分への甘々な性格が鎌首をもたげてきて勉強になるちゃんと1つの動く形のソースなら写経でも可能とするとした。(特に習慣化してエンジンがかかるまでは広い目で・・)

まだ少し早いけど現時点で見せられるのはこれ

C#だとmacで動かなかったり(本当は動くらしいけどWindowsとGUI共通でない)するので標準的な試行言語(なんとなく手を動かして試行錯誤するうちに目的のものが書ける感じ)としてpythonを使いたい。で、そのGUI開発のライブラリとしてPySimpleGUIを評価し始めたのだけどなんとmacbook(のmacos)だとテキストボックスが編集できない。対策としてwxPythonベースのPySimpleGUIWxを使うことにした。ソースのimportのターゲットだけwx付きに書き換えたら動くことを確認したのが上の画面。wxの方がちょっとウィジットのバランスが悪い気もするけどちゃんと編集できたので嬉しいからよしとする。

これでGUI系の写経で100行くらいゲットしたわ。(新年早々からずっこいこと)

上記の必要でwxPythonを入れたのでついでにBASICを弄りたい。なんて邪心を抱いてwxBASICをmacbookで入れようとしたらうまく入らなかった。きっとこれはBASICなどというもの貴重な時間を用いずにpythonに励めという天啓だと思い肝に銘ずる事にした。
ついでにLazurusもクロスプラットフォームだと頭をよぎったけど・・


2020年12月29日火曜日

とにかく挙げる

 ああ、なんて末期症状

今年の最終2ヶ月は忙しすぎて興味ある分野に時間を割けなかった
結果としてこのブログの更新が少ない

来年こそはpythonを全方位的に活用するぞ!!

こんな尻窄みの結論をもって今年最後のブログアップとするのは実に残念

dosvaxj3が更新されていた。

 最近、エミュレータ系をあまり触っていなかったのだけど久しぶりに見てみたらタイトルのようにdosvaxj3が更新されていた。 on emulatorでセルフにcなどのソースを書いて実行するのに母艦側の特定のフォルダをドライブとしてマウント出来たり普通に母艦のimeで漢字が入力でき...