新着記事

− 野ざらし言 −

新規投稿は記事一覧のフォームからお願いします

[5867] Re^18: N88-BASICのRENUMのようなマクロ

としき 2025/05/19(Mon) 01:47
[関連記事] [5866]へのコメント
http://toshiki.la.coocan.jp/
例えば、過去ログについては現行ログからプッシュアウトされる追記しか存在しないわけですよね。なので、こちらのほう、正規化というか不要なヌルを削除して再アップするという対応はしてもいいかも。そして、もしそれだけのことでログ崩壊が発生するなら、それはもう、回線被疑確定。
そして、もしスクリプトとかではなく回線が悪いのなら、私が#5823で書いたのと似たような対応がベターかな。すなわち、正当な内容の同一のログを、ファイル名を変えて5つとかアップロード。そして、それらをサーバ上の名前のままでダウンロード。ローカルで原本と比較し、差異がないファイルを新ログとして現行ログのファイル名にリネーム。
サーバ上でdiffとかできるスクリプトが書ければもっと楽できそうな気もするけど、そんなスクリプトを書くよりはアップダウンを繰り返してローカルで比較、というほうがおそらく簡単。

それはさておき。

> これは,例えば 1020 とか 1040 とかのときは遅くならないのですか?

のちほど試して見ましょう。
ん〜、会社からスマホを借り出してくるか。
いや、元々持ち出しようということになっていて、次の木曜日にも諸般の都合で自宅に持ち帰る予定があったりするのですよ。ただ、他の皆さんと違って私は個人携帯がガラケーなんで、家に持ってきても充電に問題が発生するので、特段の用がなければなるべく持って帰らないようにしている。

とりあえず、ver.0.21として、ストップウォッチ計測が少しは楽にできるように、終了時のメッセージを出すことと、

> #55 " " &?("%d",o) #m
> ……これを少しだけまとめて……
> #55 &?(" %d",o) #m

この変更を加えてみました。

で、例によって絨毯爆撃。

開始         としき としき  としき  としき
番号 増分 めざら版 旧版  0.20&s有 0.20&s無 0.21版
1 1
1 10
990 10 15s 2m58s 25s 11s
1010 10
1020 10
1030 10 15s 3m30s 38s 17s
10000 10 17s 3m12s 25s 10s

とりあえず、上記は暫定結果ということで。
あと、時間がかかりすぎるので、たぶん、としき旧版はもうやらない。

[5866] Re^17: N88-BASICのRENUMのようなマクロ

めざら 2025/05/18(Sun) 09:40
[関連記事] [5865]へのコメント
http://mezala.la.coocan.jp/
ご心配くださり,ありがとうございます。
つい一週間ほど前に過去ログに移ったスレッドがありますが,すでにヌルの混入が見られました。混入部分は本文のため,致命的なものではないようなのですが,なにしろ原因不明かつパターン不明なので手が付けられない。

さて,高速化のこと祝着至極に存じます。そこで確認したいことがあり。

> なぜか1030から始まる変換だけ遅い。

これは,例えば 1020 とか 1040 とかのときは遅くならないのですか?

> 重複した番号が発生したときに著しく遅くなる、とかありそう。

重複というのは,同じ飛び先の指定が複数箇所にあるということでしょうか?
(まぁ,そういうのはよくありますよね)


あと,試してみていただきたいことがあり。
単にステップ数の問題なので,大して変わらないかもしれませんが,例えば……
#55 " " &?("%d",o) #m
……これを少しだけまとめて……
#55 &?(" %d",o) #m
……のようにすると,速度はどうなるか。

ローカル10番の置換の方が数が多い分だけ変化があるかもしれませんけど。

#56 &?("\([ \t]+\)THEN\([ \t]+\)%d$$",o) #m &?("\1FTHEN\2%d",n) #m "ay"
#56 &?("\([ \t]+\)THEN\([ \t]+\)%d\([^0-9]\)",o) #m &?("\1FTHEN\2%d\3",n) #m "ay"

……みたいな。
まぁ,文字列は1文字1ステップみたいだから,さほど変わらないかな……

[5865] Re^16: N88-BASICのRENUMのようなマクロ

としき 2025/05/17(Sat) 20:55
[関連記事] [5842]へのコメント
http://toshiki.la.coocan.jp/
> 相変わらずツリーが乱れているようですが、大丈夫でしょうか。

ツリーが乱れたまま過去ログにプッシュアウトされたりすると、ひどいことに
なりそうな気もします。回線に不具合がありそうなら、携帯電話経由なり、
何らかの方法で解決されたほうがよろしいかと。

さて、要素技術のツリーが深くなってしまったので、浅めのところにつけます。
とりあえず、当社比でかなりの高速化が達成できたのでアップします。
とはいえ、いろいろと聞き倒した要素技術のうち、実際に使ったのは検索の
戻り値だけ、というような感じです。


= renum.def(ver. 0.20)
i:初期値       initial num
a:増分         addition
n:新行番号     new num
o:旧行番号     old num
c:旧番検索結果 check count
h:処理中の行   handling line ※論理行番号 ln


N88-BASICのコードは半角大文字が前提(半角小文字はあえて未対応)


*m
1 ^^ "renum.def"
;初期設定                                       ;vwxの常駐確認とか?
    a=10,
    n=o=0,
    mp[=2, ps[=pa, RX[+, Dn[-,
    &s
    &01
    
    #^ #<                                       ;カーソルを先頭行の行頭にして
    &n i=r,                                     ;初期値取得
    (r+1)??{ &m(41) >e }                        ;準備ができていないなら終了
    
    
    ;メインループ
                                                ;先頭行は行番号の変更なし
    :w                                          ;while(次の行に動ければ)
        #> #d                                   ;次の行にカーソルを移動し
        #d (r==-1)?>u                           ;その結果が最終行ならループ脱出
        #<
        h=ln,
        c=0,                                    ;検索結果初期化
        &n o=r,                                 ;旧行番号取得
        n=i+(h-1)*a,                            ;新行番号算出
        
        #55 " " &?("%d",o) #m #r c+=r, #c c+=r, ;旧番存在確認
        &#J(h) #< #t &?("%d",n)                 ;処理している行に戻って新番化
        (c==-2)??{&10}                          ;旧番号存在時のみ置換実施
    
    >w
    :u
    
    ;後処理
    #56 "\([ \t]+\)FTHEN" #m "\1THEN" #m "ay"
    #56 "\([ \t]+\)FELSE" #m "\1ELSE" #m "ay"
    #56 "\([: \t]+\)FGOTO" #m "\1GOTO" #m "ay"
    #56 "\([: \t]+\)FGOSUB" #m "\1GOSUB" #m "ay"
    #56 "\([: \t]+\)FRESTORE" #m "\1RESTORE" #m "ay"
    #56 "\([: \t]+\)FRESUME" #m "\1RESUME" #m "ay"
    
    
    Dn], RX], ps], mp],
    :e ;end
    &d
    .

01:
;最初のチェック
;例えば、全ての論理行が行番号+半角空白で始まっていることの確認、とか。

.


10:
#56 "\([ \t]+\)THEN\([ \t]+\)" &?("%d",o) "$$" #m
    "\1FTHEN\2" &?("%d",n) #m "ay"
#56 "\([ \t]+\)THEN\([ \t]+\)" &?("%d",o) "\([^0-9]\)" #m
    "\1FTHEN\2" &?("%d",n) "\3" #m "ay"

#56 "\([ \t]+\)ELSE\([ \t]+\)" &?("%d",o) "$$" #m
    "\1FELSE\2" &?("%d",n) #m "ay"
#56 "\([ \t]+\)ELSE\([ \t]+\)" &?("%d",o) "\([^0-9]\)" #m
    "\1FELSE\2" &?("%d",n) "\3" #m "ay"

#56 "\([: \t]+\)GOTO\([ \t]+\)" &?("%d",o) "$$" #m
    "\1FGOTO\2" &?("%d",n) #m "ay"
#56 "\([: \t]+\)GOTO\([ \t]+\)" &?("%d",o) "\([^0-9]\)" #m
    "\1FGOTO\2" &?("%d",n) "\3" #m "ay"

#56 "\([: \t]+\)GOSUB\([ \t]+\)" &?("%d",o) "$$" #m
    "\1FGOSUB\2" &?("%d",n) #m "ay"
#56 "\([: \t]+\)GOSUB\([ \t]+\)" &?("%d",o) "\([^0-9]\)" #m
    "\1FGOSUB\2" &?("%d",n) "\3" #m "ay"

#56 "\([: \t]+\)RESTORE\([ \t]+\)" &?("%d",o) "$$" #m
    "\1FRESTORE\2" &?("%d",n) #m "ay"
#56 "\([: \t]+\)RESTORE\([ \t]+\)" &?("%d",o) "\([^0-9]\)" #m
    "\1FRESTORE\2" &?("%d",n) "\3" #m "ay"

#56 "\([: \t]+\)RESUME\([ \t]+\)" &?("%d",o) "$$" #m
    "\1FRESUME\2" &?("%d",n) #m "ay"
#56 "\([ \t]+\)RESUME\([ \t]+\)" &?("%d",o) "\([^0-9]\)" #m
    "\1FRESUME\2" &?("%d",n) "\3" #m "ay"
    
*

旧バージョンは、とにかく全ての行を変換する、というものでした。
ある意味、わかりやすいロジック。だけど、それが遅くなる根本原因。
なので、必要なところだけ変換するようにしました。
そして、必要なところはどこか、というのを確認するのに検索を使いました。
また、今回は論理行番号を使うコードということもあって、検索後の戻りに
ついても論理行番号を使ってみました。



さて、実際にどのくらい高速化したか測定してみました。
測定に使った行番号変換に使ったBASICプログラムは、自作のオセロのコード。
論理行数約220行。
あいにく、ストップウォッチは手元にありません。会社で使っているスマホなら
ストップウォッチがついているのですが、手元のガラケーにはストップウォッチ
の機能がないので、デジタルの時計表示を目で追いかける形。なので、精度に
ついては気にしてはいけない。

まず、めざらさんのマクロ。15秒から16秒で完了です。
次、私の旧バージョン。&sを使わないと、概ね3分くらいかかります。
&sを使ったときの速度は測っていませんが、半分にはならない。
そして、私の今回のバージョン。
&sを使わないと30秒前後。
そして、&sを使うと、やった、10秒強。

ただ、測定して不思議に思ったこと。
元のBASICは、行番号1000から始まるコードです。
これを、10000から始まるコードに変換することをクリアするのが最初。
これができなければロジックにバグがある。
つぎに、変なバグが紛れ込んでいたらわかるように、990から始まる変換と、
1030から始まる変換を行ってみました。
変換結果はいずれも、めざらさんのマクロと一致したので、あまりにも致命的な
バグはないと思うというか、全く異なるロジックであるにもかかわらず同じ誤り
を犯すというのは考えにくいので、この辺は大丈夫でしょう。
ただ、所要時間の面では面白い結果となりました。
私の作ったマクロでは、なぜか1030から始まる変換だけ遅い。
旧バージョンは、他の変換が3分前後なのに対して20秒くらい遅いだけなので、
比率ではたいした事はない。
ところが新バージョン。
画面表示を止めないものは、他が25秒くらいに対して38秒。
画面表示を止めたものは、他が10秒くらいに対して17秒。
ん〜、変換前後の桁数の問題ではないな。
なんか、重複した番号が発生したときに著しく遅くなる、とかありそう。
この辺を解決できて常に一定の速度が出せるアルゴリズムを思いつければ面白い
のだけど、なかなか難しそう。
また、想定外の何か特殊な場合に変換を誤ることもありそう。
これはそういうものにお目にかからないと実際に解決するのは無理そうだけど。
 

[5864] Re^31: N88-BASICのRENUMのようなマクロ

としき 2025/05/10(Sat) 19:41
[関連記事] [5863]へのコメント
http://toshiki.la.coocan.jp/
なるほど、ダブルワードで4バイトなんですね。
無理やるやる方法もわかったので、どうしても避けられない場合はこちらを採用させていただくということで、やっぱり違った方向を模索していくことになりそうです。というか、模索しています。

実はここ2〜3日、ちょっと風邪気味。
発熱は全くないというか、何回はかっても平熱なんですが、軽い咳と鼻水がちょっとと倦怠感。そんな状況にもかかわらず昨夜は酒を飲んだので、今日の起床は11時半過ぎ。
仕方ない、今夜も酒を飲んで寝るか。

[5863] Re^30: N88-BASICのRENUMのようなマクロ

めざら 2025/05/10(Sat) 16:36
[関連記事] [5862]へのコメント
http://mezala.la.coocan.jp/
> すり替えしか方法がないのでしょうか。

いや,考えようで色々あると思いますけど……
例えば,ダブルワードなので2個の変数を用意して,a=wa..63, b=wa..64, なんて保存した値を,後でそれぞれの場所に戻せばいいわけなので。

……と言うか,そもそも「すり替え」でなく「保存/復帰」でしたね。すまない。
#M で値を保存させる場所を直接変更することはできませんものね。


> 簡単に、プッシュポップで退避させて、ということができるとうれしい

上と同様に,#M ((wa..63)[, ((wa..64)[, みたいに簡単にプッシュしておいて,後でそれぞれの値を wa..63=0], wa..64=0], みたいに簡単にポップして #U。

それよりは,&#M(1) と &#U(1) を使ったほうが楽じゃないですか?


なお,ダブルワードの値を保存・復帰するには,ロング演算関数を利用できます。

#M &Le(pu,wa+126) ;マークして値を保存
;; あれこれあって
&Le(wa+126,pu) #U ;値を戻してジャンプ

[5862] Re^29: N88-BASICのRENUMのようなマクロ

としき 2025/05/10(Sat) 13:02
[関連記事] [5859]へのコメント
http://toshiki.la.coocan.jp/
> 簡単に書き換わってしまうので,注意が必要

そうでした、昔、わりと泣きを見たものです。

> 4バイトのバッファを用意してすり替えるのが吉かと。

すり替えしか方法がないのでしょうか。
簡単に、プッシュポップで退避させて、ということができるとうれしいのですが、無理なんですかね。

[5861] Re^5: 果樹・果実 2025 (桃)

めざら 2025/05/10(Sat) 08:04
[関連記事] [5739]へのコメント
http://mezala.la.coocan.jp/
なんと! 結実しつつあるので,欲が出てしまって少し摘果しました。

苗がまだ貧弱なので,負担をかけないように経過観察しようかと思います。

[5860] Re: 種蒔・栽培 2025 (モロッコ隠元)

めざら 2025/05/10(Sat) 07:55
[関連記事] [5725]へのコメント
http://mezala.la.coocan.jp/
モロッコ隠元を蒔きました。

幅広で短めの畝を作り,端に沿って二列蒔きするかたちです。

発芽したら,二本の支柱を斜めに立てて頂部で交差させ,ネットを張って両側から誘引することを考えています。

ひと袋すべて蒔ききり,うまくやれば採種できるかも。
以前はよくこぼれ種が発芽してくれたのですが,ここ数年はいい種ができてくれません。たぶん莢で収穫しきってしまうから。(笑)

[5859] Re^28: N88-BASICのRENUMのようなマクロ

めざら 2025/05/09(Fri) 08:12
[関連記事] [5858]へのコメント
http://mezala.la.coocan.jp/
#U で参照される位置情報(マーク0)は,#^(先頭行へのジャンプ) や #F(検索文字列の設定) といったコマンド等で簡単に書き換わってしまうので,注意が必要です。

状況にもよりますが,できれば,マーク1~4 を使うか,4バイトのバッファを用意してすり替えるのが吉かと。

[5858] Re^27: N88-BASICのRENUMのようなマクロ

としき 2025/05/09(Fri) 00:12
[関連記事] [5857]へのコメント
http://toshiki.la.coocan.jp/
> > #rとか#cの場合、検索して発見できた、または発見できなかったという結果は
> r に返ってきます。

あぁ、そう、r に返ってくるのね。

> ■内部レジスタ
> (式)で評価した値が内部レジスタに格納される。

ここらあたりがねぇ、なかなかピンと来ないというか府に落ちないというか。

とりあえず、今やろうとしている改良版の作成では、#U を使うか使わないか、みたいな感じで動いています。が、全く関係ないロジックに化けそうな気配も、そこはかとなく漂っていたりして。

[5857] Re^26: N88-BASICのRENUMのようなマクロ

めざら 2025/05/08(Thu) 08:06
[関連記事] [5856]へのコメント
http://mezala.la.coocan.jp/
■内部レジスタ
(式)で評価した値が内部レジスタに格納される。
特殊な例としては,グローバルマクロの実行開始時に,システムモード(s)の値が内部レジスタに格納される。
(編集モード専用マクロの冒頭に ?. と記載するお約束に関係する)

■戻り値(r)
コマンドを実行した結果の戻り値が r 格納される。
ローカルマクロから呼出し元に戻るときに,内部レジスタの値が r に格納される。
メニューで選択されたアイテムの番号(先頭が0)が r に格納される。

なお,関数やコマンド関数にも,戻り値があるものがある。破壊(不定)するものもある。

ざっくりまとめると,こんな感じでしょうか。(細かいツッコミどころあり)


> #rとか#cの場合、検索して発見できた、または発見できなかったという結果は

r に返ってきます。
内部レジスタに値が格納されるのは (式) の評価だけ。
内部レジスタを参照するのは ? だけ。
(グローバルマクロ実行時に (s) を実行している,?で論理NOTされる……と覚える。)

[5856] Re^25: N88-BASICのRENUMのようなマクロ

としき 2025/05/07(Wed) 23:59
[関連記事] [5855]へのコメント
http://toshiki.la.coocan.jp/
> 戻り値(r)と内部レジスタを混同しないようにしましょう。

これこれ。これが私のわかっていないところ。現在絶賛混同中。
さてそこで。

> あくまでも全置換の直後の r に置換した数が格納されるということしか分かりません。

話を次に進めて、全置換ではなく単純な検索の場合。
#rとか#cの場合、検索して発見できた、または発見できなかったという結果はrに返ってくる、ということでよろしいでしょうか。それとも内部レジスタに返ってくるのでしょうか。なんとなく、内部での動作の結果なので、イメージ的には内部レジスタに返ってくるような気がします。もしこれが違うとなると、私の思うところの「内部」と実際が異なっているということで、やっぱり足元がおぼつかないというかめまいを感じてしまいそう。

[5855] Re^24: N88-BASICのRENUMのようなマクロ

めざら 2025/05/06(Tue) 22:36
[関連記事] [5854]へのコメント
http://mezala.la.coocan.jp/
あくまでも全置換の直後の r に置換した数が格納されるということしか分かりません。途中の戻り値については,ちょっと保証できないです。実験上は一定の値が示されているようにも思いますが,どこにも記述は見つからないので,断言はできません。

なお,戻り値(r)と内部レジスタは混同されやすいのですが,条件分岐で参照されるのは内部レジスタであって r ではありません。

また,「?」は内部レジスタを反転(論理NOT)しつつ,内部レジスタが偽(0)だった場合は次の1命令または1ブロックをスキップするという働きをするキーワードです。

内部レジスタに値が格納されるのは(式)で評価した場合であり,rは直接関係ありません。
例えば,(r==0) ? { A } ? { B } という構文であれば,rが0のときに条件式は真なのでブロックAが実行され,ブロックBはスキップされます。

大事なことなので二度言います。
戻り値(r)と内部レジスタを混同しないようにしましょう。

ちなみに,コールしたマクロから戻る時に,終了時の内部レジスタをrに格納して呼出し元に戻るという機能があるので,そのへんがさらに混乱を誘うのかもしれません。逆に言うと,サブルーチンの戻り値に規則性を持たせる記述ができるわけです。このこともセットで覚えておくとよいと思います。

[5854] Re^23: N88-BASICのRENUMのようなマクロ

としき 2025/05/06(Tue) 18:50
[関連記事] [5849]へのコメント
http://toshiki.la.coocan.jp/
> 置換数は実行後の戻り値(r)で確認できます。#56 #57 同じ。

えと、何か精神的に不安定になっているので確認させてください。
全置換ではない置換の場合、あるいは検索の場合、対象が発見できたとき、すなわち成功の場合にはr==0ということでいいのですよね。って、instant.defで見た限りではそうなっているようですが。
そして、Vzマクロの条件判定に使う「?」では、r==0の場合に、次のコマンドなりジャンプなりブロックをスキップ、ということですよね。

なんか、めまいするような感覚にとらわれている。
どこか私が間違っているに違いない。

[5853] Re^26: N88-BASICのRENUMのようなマクロ

めざら 2025/05/04(Sun) 07:54
[関連記事] [5852]へのコメント
http://mezala.la.coocan.jp/
> 知りたかったのは、8000h 以上の値を返してくることはあるのか、ということ

お察しのとおり,単純に返してきますね。
ログファイルみたいな大きなファイルを対象にして……
RX[+, #56 "\(.\)" #m "\1" #m "ay" RX],
……なんかを実行してみると,83,886バイトの日本語まじりの文書で「61013 個の文字列を置換しました」というメッセージが表示されました。
ものは試し,ということで,116,661バイトの文書で実行したら「18048」。
要するに,ワードのサイズに収まらなければ,丸められるって感じ。

そこを心配しても,そういうことだから意味はないかと。
キャリーフラグでも立てば,何らかの手はあるのでしょうが,ないな,きっと。

[5852] Re^25: N88-BASICのRENUMのようなマクロ

としき 2025/05/03(Sat) 23:02
[関連記事] [5851]へのコメント
http://toshiki.la.coocan.jp/
> 知ってて敢えて質問していません? いけずやなぁ……

いや、そうではなくて、質問の仕方を間違えたというか。
知りたかったのは、8000h 以上の値を返してくることはあるのか、ということだったのです。ただ、FFFFH以上の置換というのもありうるわけですから、当然、単純に返してきそうな気がする。むしろ、2バイトに収まらない回数の場合を心配するべきだったか。

[5851] Re^24: N88-BASICのRENUMのようなマクロ

めざら 2025/05/03(Sat) 20:21
[関連記事] [5850]へのコメント
http://mezala.la.coocan.jp/
> 置換数の最大値って、符号付きで返ってくるのですか?

変数 r に収まる値ということになると思いますが,符号付きかどうかは取出し方に依存するのではないでしょうか?

16ビットなので,7FFFh(32767) 以下なら符号なしでもありでも同じですが,8000h 以上になると,符号ありなら -32768 〜 -1,符号なしなら 32768 〜 65535 かと。

まぁ,符号云々にかかわらず,置換数が負になることはありえませんから,符号を気にすること自体が意味を持たないでしょうね。

知ってて敢えて質問していません? いけずやなぁ……

[5850] Re^23: N88-BASICのRENUMのようなマクロ

としき 2025/05/03(Sat) 16:58
[関連記事] [5849]へのコメント
http://toshiki.la.coocan.jp/
> v1.6 のマニュアル類には記載が見つからないようですね。

なんだ、見つけられないのが正解だったのか。ちょっとほっとしました。

ということで、これから高速化を試してみましょう。
いろいろやっているうちに、置換数を使わないロジックを思いつくかも。

そうだ、高速化の反対の遅速化というか。
試してみればわかる話ではありますが、試すのが怖いのできいてしまいます。
とんでもない量の置換が行われるときって、当然、とっても遅くなるわけですが、置換数の最大値って、符号付きで返ってくるのですか?
それとも符号なし?

[5849] Re^22: N88-BASICのRENUMのようなマクロ

めざら 2025/05/03(Sat) 13:06
[関連記事] [5848]へのコメント
http://mezala.la.coocan.jp/
> 全置換の場合、置換回数が取得できると思いましたが、

v1.6 のマニュアル類には記載が見つからないようですね。

v1.5 時代に刊行された解説書には記載があるので,v1.5 のマニュアルには記載があるのかもしれません。

置換数は実行後の戻り値(r)で確認できます。#56 #57 同じ。

例えば,すべての空行を削除する場合は,これを利用して,次のように戻り値が 0 になるまで繰り返すという手順をとることができます。

#56 "\n\n" #m "\n" #m "ay"
(-1){ #57 (r)??{} } ;置換数が0になるまで繰り返し

[5848] Re^21: N88-BASICのRENUMのようなマクロ

としき 2025/05/03(Sat) 11:35
[関連記事] [5847]へのコメント
http://toshiki.la.coocan.jp/
> > プッシュの行がコメントになっていると、異常動作の確率が圧倒的に高い。
> プッシュをせずにポップだけ行っていたら,動作が異常になるのは必然です。

なるほど。
スタックポインタがどんどんずれていってしまうわけですね。
で、ずれた結果、たまたまうまく動かない値が継続している部分なのか、うまく動く値が散在している部分かで不調になる確率が異なっていた、と。よくわかりました。逆にこれ、たまたまうまく動く値の部分にずれているようなら、当分の間は気づけなかった可能性もあるわけで、それも怖い。

謎が解けたところで、いよいよ高速化かな。
そこで一つ教えてください。
全置換の場合、置換回数が取得できると思いましたが、これってどうやるんでしたっけ?
また、この回数の取得って黒本のどこに載っています?
索引を見ても探せないのですが、黒本には載っていないのかな。
.docのほう?
あれ、3つの.docを見ても見つからない。
うぁ、私の検索能力が落ちているっぽい。

↑ このページの先頭