[HOME]  [現在掲示板へもどる]  [ツリー表示]   

過去ログ  番号順 全部表示   FGALVZ  


11098/11098 BQO00549  konno            ハノイの塔マクロ HANOI.DEF の改造
( 1) 24/02/22 01:27 コメント数:3
ハノイの塔マクロ HANOI.DEF を改造しました。
オリジナルは、T.Tanomura さんの名作です。作者様に感謝です。


===== hanoi_k.def ハノイの塔 =====

; ハノイの塔マクロ HANOI.DEF
; (VZ Editor version 1.5/1.6 共通)
; (C) T.Tanomura, 1992/7/5, 1994/7/31
;   h.konno 2024-02-22  円盤の枚数 1〜15 に改造、速度アップ


【機能】
 ハノイの塔の問題を解きます。

【用法】
 編集モードで起動し、円盤の枚数として 1〜15 の数を入力してください。
ハノイの塔の問題を知らない方は、最初は 3 にするといいでしょう。

【補足】
 'Q' を押すと、中止になります。★##k
 'G'(=go)を押すと、残りの移動を一気に行います。
 マクロの連続実行を中止するには [ESC] を押せば止まります。★##k
 マクロを中断したり実行後おかしくなったらオプション初期化してください。
 改造して速度が倍近く上がっています。(当社比)★

下のリンクをクリックすると hanoi_k.def のソースが表示されます。
当社の新リンク機能です。(^_^)

#txt:hanoi_k.def 



11099/11099 BQO00549  konno            オートリンクで新機能 ファイルへのリンク
( 1) 24/02/22 17:37
BBSのオートリンク機能を応用して新リンク機能が出来ました。(^_^)
#11098 で使っています。

ソースは、wforum.cgi の最後の方

#--------------#
#  自動リンク  #
#--------------#
sub auto_link {

#	#txt:FILE  text macro doc etc
	$_[0] =~ s/(^|[\x81-\x9F\xE0-\xFC][\x40-\x7E\x80-\xFC]|[^0-9a-zA-Z\/\#\"]+)#txt:([A-Za-z0-9_-]+\.[A-Za-z0-9]+)/$1<a href='http:\/\/tamaneko.world.coocan.jp\/bbs\/count\/count.cgi?mode=download;target=http:\/\/tamaneko.world.coocan.jp\/vz\/$2' title='Text'>#txt:$2<\/a>/g;

このように、サーバーのフォルダに置いたファイル名を指定すれば $2 の変数に置き換えて表示出来ます。
書式は

#txt:ファイル名

この機能を実現することでいくつかのメリットがあります。

・長いソースファイルも5文字のコマンド+ファイル名の直リンクで手軽に見ることができる。
・長いソースを張り付けて掲示板の閲覧性を損ねることを防げる。
・長いソースを張り付けてコピペするよりこのリンクを右クリックで即ファイル保存のほうが楽かも。
・長いソースやドキュメント類を見たくない人にも優しい。
・リンク済みのファイルは誰でも記事中に直リンクして手軽に参照できるので便利。
・手持ちのソースやドキュメント類を記事中で参照希望のメール送付等は前向きに検討します。
・オートリンクにカウンタを仕込んであるので閲覧数を確認できる。

この機能を思いついた動機は、上に書いていますが、本当は個人的趣味で不純なので内緒。(^^;

この機能が便利だと思ったらぜひとも他の掲示板でも採用願いたいです。(^^;


11100/11098 CXB00940  としき           Re: ハノイの塔マクロ HANOI.DEF の改造
( 1) 24/02/23 00:33 11098へのコメント(konnoさん) コメント数:2
参照先:http://toshiki.la.coocan.jp/
> ハノイの塔マクロ HANOI.DEF を改造しました。
> オリジナルは、T.Tanomura さんの名作です。作者様に感謝です。

実行してみました。gコマンドの速度は速いですね。
ただ、画面の表示が正しくないです。何が悪いのかな。
konnoさんのところではきちんと表示されているのでしょうから、私の環境かな。
Tanomuraさんのマクロは、正しく表示されています。

で、まぁ、マクロコードを読もうとしたのですが。
あきらめました。
なぜって、コードとコメントの混在で。
一応、読もうと努力はしたんですよ。
だけど、例えばコードの最初のほう、属性などのいくつかの変数をプッシュする
コードがコメントアウトされていて、でもその理由が明記されているわけでもなし、
明記せずとも暗黙で理解できるようなコードでもなし。
まぁ、コード本体というか内部ではこれらの属性が変更されていないからプッシュ
されていないのだろうな、とは想像できますが、ならばなぜ、わざわざ記載した
上でコメントアウトされているのか、全くの謎。
おそらく、konnoさん的にはこういうコードが理解しやすいのでしょう。
でも、申し訳ない、私は脱落しました。
もっとも、世の中には、いわゆる「汚いコード」というのがいくらでもあって、
そういうのに比べればkonnoさんのコードは、まだまし、といったところでしょう。


11101/11098 DGF01024  めざら           Re: ハノイの塔マクロ HANOI.DEF の改造
( 1) 24/02/23 08:45 11098へのコメント(konnoさん) コメント数:1
参照先:http://mezala.la.coocan.jp/
実行してみたところ,数回の移動でコマンドラインに降り,最終的に VZ が落ちました。
(「落ちた」は正確ではなく,VZの子プロセスから離脱……かな。戻れず強制終了。)

まず,最初にきれいに積み上がっていないです。

次のコードがあります……
#E #m #[ &k
……が,実行中にコマンドラインに降りるのは何故なのですか?
ここの意図についてコメントがないので,想像もつきませんが……

11102/11098 DGF01024  めざら           Re^2: ハノイの塔マクロ HANOI.DEF の改造
( 1) 24/02/23 11:29 11100へのコメント(としきさん) コメント数:2
参照先:http://mezala.la.coocan.jp/
> なぜって、コードとコメントの混在で。

(外野の言い訳になってしまうけれど)他の方のプログラムを改造する場合,
わたしも元の行をコメントアウトした上で,改造コードを記載してしまいます。
「ここをこうしたよ」ということを明示しているつもりなんですよね。
そういうのは,プログラミングに慣れた人には嫌われるのでしょうか。

田野村さんはタブを使わず4字下げだったので,それをそのまま行にコメントすると,
字下げが4の倍数にならずにグチャグチャした印象を与えてしまいますね。

> 属性などのいくつかの変数をプッシュするコードがコメントアウトされていて、
> でもその理由が明記されているわけでもなし、

グローバル変数のプッシュ/ポップの辻褄を合わせる努力をするよりも,
ローカル変数にしてしまえば他に影響はないという考え方なのでしょう。

ただ,はっきり言ってしまうと,典型的な「スパゲティ」になっているコードを
改善する気がない表明とも受け取られかねないわけで,見た目の印象以上に
コードを追う気力を失わせることはままあることかもしれないと思います。(自省)

上記は,自分への反省とか注意喚起という意味あいの方が強いかもしれません。

それより,わたしがちょっと引いたのは,
「マクロを中断したり実行後おかしくなったらオプション初期化してください。」
かな。

中断が予想される場合は,その処理を入れておくのがふつうかなと思います。
(まぁ,&k で拾う場合は終了処理が無理なことも多いんですけどね。)

11103/11098 BQO00549  konno            Re^2: ハノイの塔マクロ HANOI.DEF の改造
( 1) 24/02/23 13:21 11100へのコメント(としきさん) コメント数:1
> 実行してみました。gコマンドの速度は速いですね。
> ただ、画面の表示が正しくないです。何が悪いのかな。
> konnoさんのところではきちんと表示されているのでしょうから、私の環境かな。

試していただきありがとうございます。
画面表示は具体的にはどんな感じになるのでしょうか。

> Tanomuraさんのマクロは、正しく表示されています。

Tanomuraさんのマクロの回数の数字だけ増やしても80*25画面で平気で動作しますね。
環境に左右されないようしっかり作られているのは流石です。

> で、まぁ、マクロコードを読もうとしたのですが。
> あきらめました。
> なぜって、コードとコメントの混在で。

す、すみません、公開するなら修正前の不要なコメントは消すべきでしたね。
修正して差し替えます。m(__)m


11104/11098 BQO00549  konno            Re^2: ハノイの塔マクロ HANOI.DEF の改造
( 1) 24/02/23 13:41 11101へのコメント(めざらさん)
> 実行してみたところ,数回の移動でコマンドラインに降り,最終的に VZ が落ちました。
> (「落ちた」は正確ではなく,VZの子プロセスから離脱……かな。戻れず強制終了。)

げげ、これはヤバいですね、オプション絡みでしょうか。
スタートして直ぐと終了時に時間計測のためにコマンドラインに降りていますが
移動中は関係ないし、もしかして EP かなぁ。
時間計測部分はコメントにします。

> まず,最初にきれいに積み上がっていないです。
オリジナルで問題無いなら何かのオプションの影響ではないかと思いますが・・・

> #E #m #[ &k
> ……が,実行中にコマンドラインに降りるのは何故なのですか?
> ここの意図についてコメントがないので,想像もつきませんが……

上に書いたように時間計測のために追加したのをそのままにしていました。
プロンプトを $t$p$g にして時間表示させ、マクロの実行時間を測定しています。
これが悪さをしている可能性があるのでこの部分はコメントにします。
不完全なままアップしてすみませんでした。m(__)m


11105/11098 CXB00940  としき           Re^3: ハノイの塔マクロ HANOI.DEF の改造
( 1) 24/02/23 13:42 11102へのコメント(めざらさん)
参照先:http://toshiki.la.coocan.jp/
めざらさんのところでも同じようですが、うちも最初が正しく積みあがっていません。

> わたしも元の行をコメントアウトした上で,改造コードを記載してしまいます。
> 「ここをこうしたよ」ということを明示しているつもりなんですよね。
> そういうのは,プログラミングに慣れた人には嫌われるのでしょうか。

コメントアウトされているのが全て改造前、ということがわかれば私はOKです。
それでも見づらいことは見づらいので、プログラミングに慣れた多くの人は嫌う
かもしれない。
概ね、プログラミングの世界では、例えばバグの混入を避けるなどの目的で、可読性
というものが重視されます。これもある種の理想論なんで、現実にはメモリ量とか
速度とかを目的として最適化というものも行われますが、でも最適化は最後の段階。
実際、遅いのはアルゴリズムが悪いことが多いので、アルゴリズムの見直しを行い、
それでも所要の性能が出ない場合に最適化する、というのが通常の段取り。

そういう潮流なので、コードが読みやすいことが尊ばれるのですよ。
ある種、読みやすさは正義、みたいな。
そして、読みやすくするためにはどうするか、という様々な研究もあって。
その中に、余分な情報は少なければ少ないほうが良い、というのもあります。
余分な情報は正しい認識を阻害する、ということから、私は迷彩という表現を使って
います。そして、このコードは何をする、というコメントなら多くの場合問題はない
のですが、旧のコードと新のコードが並列されていて、単にコメントアウトされて
いるだけ、という場合、混乱を招きやすいのではないかなぁ。
だって、行の途中を読んでいて、その行がコメントであるか確認するために行の先頭
に視線を戻して、という手間が発生するので、少なくとも私には心理的負担。

あるいは、例えばウィルスなんかだと「コードの難読化」なんていう技術が使われて
いたりします。つまり、わざと読みづらくすることにより、どういう挙動を示すか
わからないようにしているのですが、だから一部の口の悪いプロのプログラマーは
「そんなウィルスのようなコードを書くな」
などと後輩に指導して、もはやこの表現はパワハラ案件だという冗談もあるくらい。

> > 属性などのいくつかの変数をプッシュするコードがコメントアウトされていて、
> > でもその理由が明記されているわけでもなし、
> グローバル変数のプッシュ/ポップの辻褄を合わせる努力をするよりも,
> ローカル変数にしてしまえば他に影響はないという考え方なのでしょう。

すごい、きちんと読まれたのですね。
もう私、プッシュポップをしていないということは、これらは内部では使われて
いないんだ、というところでそれ以上読むことをあきらめていました。

> それより,わたしがちょっと引いたのは,
> 「マクロを中断したり実行後おかしくなったらオプション初期化してください。」
> かな。

私は逆というか、この表現を見た瞬間、画期的だと思いました。
積極的にオプションを初期化するって発想がなかったもので。
でも、過去の多くのコードを見てきためざらさんがそういう反応をするということ
は、これはいわゆるマクロ師的には邪道なのかもしれませんね。


11106/11098 CXB00940  としき           Re^3: ハノイの塔マクロ HANOI.DEF の改造
( 1) 24/02/23 13:50 11103へのコメント(konnoさん) コメント数:1
参照先:http://toshiki.la.coocan.jp/
まず、うちの環境では、めざらさんのところと違い、落ちたことは一度もありません。

> 画面表示は具体的にはどんな感じになるのでしょうか。

円盤が3枚のときの初期画面。(右側省略)

■
             ■■
■■■
 ~~~~~~~~~~~~~~~~~~~

円盤が3枚のときのgコマンドでの終了画面。(右端まで)

■  ■
                                                             ■■
■■■■■■      ■■■
 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

円盤の表示位置が正しくないようですが、空白での上書き消去は正しく行えているので
ゴミが残っている、というようにも見えます。


11107/11098 BQO00549  konno            Re^3: ハノイの塔マクロ HANOI.DEF の改造
( 1) 24/02/23 14:03 11102へのコメント(めざらさん)
> (外野の言い訳になってしまうけれど)他の方のプログラムを改造する場合,
> わたしも元の行をコメントアウトした上で,改造コードを記載してしまいます。
> 「ここをこうしたよ」ということを明示しているつもりなんですよね。

そのとおりなんですが、私の場合統一性が無く文字通りぐちゃぐちゃになってました。
流石にこのままアップしたのは不味かったですね。m(__)m

> 田野村さんはタブを使わず4字下げだったので,それをそのまま行にコメントすると,
> 字下げが4の倍数にならずにグチャグチャした印象を与えてしまいますね。

これは公開を考えたら統一するべきでしたね、修正します。m(__)m

> > 属性などのいくつかの変数をプッシュするコードがコメントアウトされていて、
> > でもその理由が明記されているわけでもなし、

修正前のコードをコメントして残すなら理由を明記するべきでしたね。

> グローバル変数のプッシュ/ポップの辻褄を合わせる努力をするよりも,
> ローカル変数にしてしまえば他に影響はないという考え方なのでしょう。

そのとおりですが、実際には不具合が出たようで、難しいですね。

> ただ,はっきり言ってしまうと,典型的な「スパゲティ」になっているコードを
> 改善する気がない表明とも受け取られかねないわけで,見た目の印象以上に
> コードを追う気力を失わせることはままあることかもしれないと思います。(自省)

m(__)m m(__)m m(__)m

> それより,わたしがちょっと引いたのは,
> 「マクロを中断したり実行後おかしくなったらオプション初期化してください。」
> かな。
> 中断が予想される場合は,その処理を入れておくのがふつうかなと思います。

中断とは、マクロを Ctrl Break などで強制的に止めるという意味だったのですが
このマクロは止まらないみたいですね。
なので、中止のコードを追加したのですが、そうするとプッシュポップの辻褄が合わなくなります。
変なところにポップしてメモリを壊すよりは変数保存のプッシュポップをやめるのがいいかと。
プッシュポップの辻褄が合わなくてもマクロを終了したら SP は初期化するかな。
と思ったのです。

不要なコメントを整理してコードも見直しますのでしばしお待ちください。m(__)m


11108/11098 BQO00549  konno            Re^4: ハノイの塔マクロ HANOI.DEF の改造
( 1) 24/02/23 14:52 11106へのコメント(としきさん)
> > 画面表示は具体的にはどんな感じになるのでしょうか。
>
> 円盤の表示位置が正しくないようですが、空白での上書き消去は正しく行えているので
> ゴミが残っている、というようにも見えます。

げげ、これはひどいバグですね。すみませんでした。m(__)m
80*25の画面でスペースがはみ出てしまってますね。
途中で数値変更して確認していませんでした。お恥ずかしい。m(__)m

諸々修正して再アップします。しばしお待ちください。m(__)m


11109/11098 BQO00549  konno            ハノイの塔マクロ 改造差替え版
( 1) 24/02/23 18:09 11098へのコメント(konnoさん) コメント数:2
ハノイの塔マクロ HANOI.DEF 改造の差し替え版です。
オリジナルは、T.Tanomura さんの名作です。作者様に感謝です。

バグバグの物を上げてしまいすみませんでした。m(__)m
コメントも整理しました。
これでめざらさんのところで問題なく動きますように。(-人-)


下のリンクをクリックすると hanoi_k.def 差替え版のソースが表示されます。

#txt:hanoi_k.def



11110/11098 DGF01024  めざら           Re: ハノイの塔マクロ 改造差替え版
( 1) 24/02/23 21:03 11109へのコメント(konnoさん) コメント数:1
参照先:http://mezala.la.coocan.jp/
ふつうに実行できました。

結局,何が問題だったのか分からないままでしたが……

11111/11098 BQO00549  konno            Re^2: ハノイの塔マクロ 改造差替え版
( 1) 24/02/23 23:27 11110へのコメント(めざらさん) コメント数:1
> ふつうに実行できました。
> 結局,何が問題だったのか分からないままでしたが……

問題なさそうで、ホッとしました。(^^;
コマンドラインに降りたのがまずかったと思い、EP0 にしたくらいですが
多分違いますよね。(^^;
ともあれ良かったです。(^_^)


11112/11098 CXB00940  としき           ゾロ目を踏んだのはやっぱり管理人
( 1) 24/02/23 23:48 11111へのコメント(konnoさん) コメント数:1
参照先:http://toshiki.la.coocan.jp/
いや、ほとんどT/Oで申し訳ない。
酔ってるもんで。

11113/11098 BQO00549  konno            Re: ゾロ目を踏んだのはやっぱり管理人
( 1) 24/02/24 00:08 11112へのコメント(としきさん)
> いや、ほとんどT/Oで申し訳ない。
> 酔ってるもんで。

あ、全然気が付きませんでした。(^^;

おめでとうございます。(って、自分に言うか)


11114/11098 CXB00940  としき           Re: ハノイの塔マクロ 改造差替え版
( 1) 24/02/26 01:37 11109へのコメント(konnoさん) コメント数:1
参照先:http://toshiki.la.coocan.jp/
> ハノイの塔マクロ HANOI.DEF 改造の差し替え版です。

やっと試すことができました。
きれいに動いています。
ただ、うちでは、マシンのせいなのか、konnoさんのところほどTanomura版との差は
大きくなっていません。12枚で、Tanomura版だと45秒強、konno版だと35秒弱、
といったところです。
なお、実行したのはVTDOS、画面サイズは横80桁、縦50行です。
でも、konnoさんのところでは、画面サイズで実行速度が変わる、というのは面白い
ですね。速度が画面サイズに依存しないようにする、という改造もいいかも。

11116/11098 BQO00549  konno            Re^2: ハノイの塔マクロ 改造差替え版
( 1) 24/02/26 21:58 11114へのコメント(としきさん)
> やっと試すことができました。
> きれいに動いています。

無事に動いたようでなによりです。(^_^)

> ただ、うちでは、マシンのせいなのか、konnoさんのところほどTanomura版との差は
> 大きくなっていません。12枚で、Tanomura版だと45秒強、konno版だと35秒弱、
> といったところです。
> なお、実行したのはVTDOS、画面サイズは横80桁、縦50行です。

うーむ、差が少ないのは気になるところですね。私の各種環境で比較してみました。

VTDOS       org  69秒
VTDOS       kon  33秒
CKWV+VTDOS     org  63秒  80*25
CKWV+VTDOS     org  69秒  136*34
CKWV+VTDOS     kon  33秒  80*25
CKWV+VTDOS     kon  36秒  136*34
DOSVAXJ3 64    org  70秒
DOSVAXJ3 64    kon  34秒
M Player pen4_x64 org 171秒
M Player pen4_x64 kon  71秒

ckwv のが時間が掛かると思いましたがそうでもないですね。

> でも、konnoさんのところでは、画面サイズで実行速度が変わる、というのは面白い
> ですね。速度が画面サイズに依存しないようにする、という改造もいいかも。

移動のたびに &d で全画面表示しているので大画面の方が不利かと思いましたが
オリジナルでも大画面の方が遅いですね。
MS-DOS Player は画面表示が遅いのかな、また検証してみます。