平成25年秋期 午後問8 設問1 e

kaoruさん  
(No.1)
エが正解であることは理解できるのですが、なぜイのCompresseddata[Pindex - Start + Fitcnt]ではいけないのか理解しきれていないです。自分でトレースしてみた限り、CompresseddataでもPlaindataの時と同様に復元ができるような気がしているのですが、認識誤っていますでしょうか・・。
2022.10.25 23:59
jjon-comさん 
FE シルバーマイスター
(No.2)
圧縮前の文字列 Plaindata を指すから Pindex
圧縮後の文字列 Compresseddata を指すから Cindex です。

〔プログラム2〕には次のコードも登場し、
> ・Pindex←Pindex+Num
> ・Cindex←Cindex+3
両者の動きは異なるので

> イのCompresseddata[Pindex - Start + Fitcnt]
はそもそも理屈に合いません。

--------
図1を例に説明するならば。

〔プログラム2〕のDecompress は
ABCDEF$FD$JF          から
ABCDEFABCDABCDEF  を復元する副プログラムです。

最初の制御文字$に出会うまでは

            ↓Cindex
ABCDEF$FD$JF

            ↓Pindex
ABCDEF

のように、CindexとPindexは同じ値なので、
質問者のおっしゃるとおり【イ】でも成り立ちます。

しかしそれを過ぎて、2番めの制御文字$を処理する時点では

                  ↓Cindex
ABCDEF$FD$JF

                    ↓Pindex
ABCDEFABCD

のように Cindex≠Pindex であり、
Cindexから「Jすなわち9文字前」にさかのぼった文字位置と
Pindexから「Jすなわち9文字前」にさかのぼった文字位置は異なります。
よって【イ】は不正解です。
2022.10.26 01:18
jjon-comさん 
FE シルバーマイスター
(No.3)
上記の回答文字列をコピーして、
等幅フォントのテキストエディタに貼り付ければ、

↓Cindex  ↓Pindex

の指す位置がズレることなく表示されるでしょう。
2022.10.26 01:21
kaoruさん  
(No.4)
ご丁寧な回答ありがとうございます!
>Cindexから「Jすなわち9文字前」にさかのぼった文字位置と
>Pindexから「Jすなわち9文字前」にさかのぼった文字位置は異なります。
は理解できました。

図1の例で2番めの制御文字$を処理する時点を考えると、
Compresseddata[Pindex - Start + Fitcnt] 
=Compresseddata[10 - 10 + 0]
=Compresseddata[0]
=A

です。で、このループがFitcnt < num(=6)となるまで続くので、結果、Compresseddata[Pindex - Start + Fitcnt] でもABCDEFを復元できるように思うのですが、どの部分の理解が誤っているのでしょうか・・?
2022.10.27 12:21
kaoruさん  
(No.5)
五月雨にすみません。要は、1番めの制御文字$が出てくるまではCompresseddataとPlaindataには同じ値が入るので、どちらを基に復元しても結果は変わらないのではというのが疑問点です。。
2022.10.27 12:29
jjon-comさん 
FE シルバーマイスター
(No.6)
> 「Jすなわち9文字前」にさかのぼった文字位置
ですから,

> 図1の例で2番めの制御文字$を処理する時点を考えると、
> Compresseddata[Pindex - Start + Fitcnt] 
> =Compresseddata[10 - 10 + 0]
> =Compresseddata[0]
> =A
ではなく,

=Compresseddata[10 - 9 + 0]
=Compresseddata[1]
=B
です。
2022.10.27 13:20
kaoruさん  
(No.7)
ありがとうございます!そして度々申し訳ございません。

1番めの制御文字$の処理が終わった時点で、
Pindex = 10
Cindex = 9


Start ← AlphabetToInt(Compresseddata[Cindex + 1])
=Start ← AlphabetToInt(Compresseddata[9 + 1])
=Start ← AlphabetToInt(J)
=Start ← 10

と考えたのですが、なぜ10ではなく9が入るのでしょうか。
2022.10.27 14:04
jjon-comさん 
FE シルバーマイスター
(No.8)
> 「Jすなわち9文字前」にさかのぼった文字位置

という私の発言がそもそも間違っていました,ごめんなさい。
Jは10文字前が正しいです。

回答No.7で補足していただいた具体例も確認しました。
文字Jを変換して Start←10 です。

ですから,私の回答No.6は間違っています。無視してください。

--------
kaoruさんの指摘が,今になってようやく理解できたように思います。
図1の例であれば,おっしゃるとおり【イ】でも復元されますね。
別の文字列でないと反例にならないです。

こんな例はどうでしょう?

圧縮前  ABCDEABCDEABCDE
を〔プログラム1〕で圧縮した結果は
圧縮後  ABCDE$EE$EE
になる。

この  圧縮後  ABCDE$EE$EE  を
〔プログラム2〕で復元しようとすると
イ  Compresseddata[Pindex - Start + Fitcnt] 
ではダメで
エ  Plaindata[Pindex - Start + Fitcnt]
でないと正しく復号されないのではないですか。
2022.10.27 19:23
kaoruさん  
(No.9)
度々本当にありがとうございます!
いただいた反例であれば、「エ  Plaindata[Pindex - Start + Fitcnt]」でないと正しく復号できないことが確認できました。
理解しきれずもやっとしていた部分が解消でき、大変助かりました(>_<)

以下、蛇足です。
圧縮後の文字列は、ABCDE$EE$EE  ではなく、ABCDE$EE$JE では?と一瞬思ったのですが、Copmressのプログラム内にMafitnum < Fitnum の条件があることから、ご説明の通り、ABCDE$EE$EEが正であると理解できました。
2022.10.28 19:34

返信投稿用フォーム

スパム防止のためにスレッド作成日から30日経過したスレッドへの書込みはできません。

その他のスレッド


Pagetop