令和元年秋期午後問8

午前試験免除制度対応!基本情報技術者試験のeラーニング【独習ゼミ】
文系脳さん  
FE ブロンズマイスター
(No.1)
https://www.fe-siken.com/kakomon/01_aki/pm08.html

4文字目らが分かりません
なぜ4文字目で
2021.01.28 20:29
文系脳さん  
FE ブロンズマイスター
(No.2)
すいません
間違ってEnter押してしまったみたいなので改めて

gの問題について
3文字めまでは分かるのですが、何故4文字目がB何でしょう?
その後もどういった感じでやってるのかさっぱり分かりません
2021.01.28 20:32
Pythonistaさん 
(No.3)
こんばんは。
恐らく、主さんは表4の正規表現の説明で混乱されてるかと思われます。まず正規表現とは、文字列の集合を一つの文字列で表現する方法です。
表4の説明によると、”AXB”、”AYB”、”AZB”を”A[XYZ]B”という一つの文字列で表現されています。
この事から、プログラム3の関数GenerateBitMaskRegex
は正規表現を検索文字列に指定できるようにした関数です。

長くなりましたが、gの問題のPat[]の中身は↓
(A, C, [, B, A, ], A, [, A, B, C, ], A)となってますよね。わかりやすくパレンティスの()を用いてます。
3文字目の[でMode変数に1が代入されてます。
Modeが1の時は正規表現の[]の内側が処理されていることを示すフラグです。よって、]の時に0が代入されます。
質問のなぜ4文字目がBなのかということですが、iが1から始まって4の時がPat[4]の要素ってことですよね。
なので、上記のPat[]の4番目の要素が選択されるという事です。表4の説明はあくまで正規表現の説明なので、4番目の要素がCBAという訳ではございません。

ちなみに”C[BA]A”と”A[ABC]A”は一つの文字列と表現されるので問題hの返却値PatLen(Pat[]の文字数)は6となります。
説明が下手ですみません...プログラムは正直者です。上から素直にトレースして行けば大丈夫です!頑張ってください!!

2021.01.28 22:07
文系脳さん  
FE ブロンズマイスター
(No.4)
今気づきましたが解説ではgになってますが、問題はiですね
一応私の認識が間違っているといけないので確認のために一度書いてみます。
OriginalPatLen = 13
Pat[i]→i=1:A、i=2:C、i=3:[、i=4:B、i=5:A、i=6:]、i=7:A、i=8:[、i=9:A、i=10:B、i=11:C、i=12:]、i=13:A(=AC[BA]A[ABC]A)

条件①Pat[i]番目が"["ならModeに1を代入&PatLenに1を加算
条件②Pat[i]番目が"]"ならModeに0を代入
条件③Modeが0ならPatLenに1を加算

Bが4文字目に来るということは、私の頭の中で↑になります。
まぁこれでやると5文字目は当然異なりますよね。
ただ正規表現でまとめたやつ(この問題ならgで解説してある部分)通りなら、OriginalPatLenが6になりますし。しかしこれだとループは6回目でおわってしまいますので違うな、と。
iは1ずつ増えてますから、なぜ急に8文字目まで飛んだのか?だけど解説では5回目に。
では6文字目は?解説ではAに。→4番目がBであったことを踏まえるならこのAは2つ目の[の後ろにあるA?
だがg通りなら末尾のAと一致しますし。そうすると今度は7回目のループでどうして"A[ABC]A"のBが出てきているのか。

考えれば考えるほど泥沼に沈んでいくようです...。
2021.01.28 23:25
Pythonistaさん 
(No.5)
なるほど、iの問題の方でしたか!
解説の方を拝見したところ、少し書き方が分かりにくいですね
...。
iの問題の方では、gで用いたPat[]の中身とは異なります。
iの方では問題文によると、Pat[]の中身が↓
"AC[B[AB]AC]A"こうなると思います。
上記の例だと、解説通りにトレース出来ると思いますが、どうでしょうか??

ちなみにOriginalPatLenの値はプログラムを実行する前のPat[]の文字数で、iの問題の場合は12になるはずです。gの問題では主さんの通り13です。
対して、PatLenの値はプログラムが終了して、戻り値として返される値です。なのでgの問題では正規表現としてまとめられた6となるのです。OriginalPatLenとは別物です。
2021.01.28 23:59
ちょめさん 
(No.6)
cに関する質問です。このMask[Index(Pat[i])]だと例にある"ACABAB"を代入した時、CやBになった時に2や3に対して論理和を1で計算することになるのですがその際は不可能であるために、0になるから0をそれらの場所に格納するという認識であっていますでしょうか。しかしそれで"A"に対応するビットマスクを求められてもどのようにして"B"に対応するビットマスクをこのアルゴリズムで求められるのかがわかりません。
2021.02.09 12:35
ししまるさん 
(No.7)
分かりにくかったらすみません...
Mask[Index(Pat[i])] についてですが,順番にiを0から代入していくと
i=1:  Pat[1] = A
i=2: Pat[2] = C
        .....
i=6: Pat[6] = B

となるのはわかると思います.ここで問題文に以下の記載があると思います. 
「関数 Index は,引数にアルファベット順でn番目の英大文字を設定して呼び出すと,整数n(1≦n≦26)を返す。」

つまり,関数Indexは,Index(A)=1, Index(B)=2, Index(C)=3, 以下略  を指すこととなります.
上記の例ですと
i=1:  Pat[1] = A  なので,Index(Pat[1]) = Index(A) = 1  
    →つまりMask[Index(Pat[1])] =  Mask[1]はAのビットマスクを示すということになります
同様に
i=2: Pat[2] = Cなので,Index(Pat[2]) = Index(C) = 3  
      →つまりMask[Index(Pat[2])] =  Mask[3]はCのビットマスクを示すということになります
i=4: Pat[4] = Bなので,Index(Pat[4]) = Index(B) = 2  
      →つまりMask[Index(Pat[4])] =  Mask[2]はBのビットマスクを示すということになります
ちなみにi=3, 5のときにもAのビットマスクを表します.

ここまでは大丈夫でしょうか?次から本題ですが,Aのビットマスクを例に見てみましょう.
問題文に以下の記載があると思います.
「関数 GenerateBitMask は,Mask[] の全ての要素を"0"Bに初期化した後,1以上で Pat[] の文字数以下の全てのiに対して,Pat[i] の文字に対応する Mask[] の要素である Mask[Index(Pat[i])] に格納されている値の,下位から数えてi番目のビットの値を1にする。」

上記の通りに進めていくとA~Cのビットマスクは以下のようになります.
    ・Aのビットマスク:10101B(Patの1,3,5番目にAが出現)
    ・Bのビットマスク:101000B(Patの4,6番目にBが出現)
    ・Cのビットマスク:000010B(Patの2番目にCが出現)

なので,上記の通りになるように,設問cの選択肢を見ると良いでしょう.
Aのビットマスクを例に見てみると,i=1, 3, 5のときなので

① i = 1のとき,1番目にAが出現するので,下位から1ビット目を1にしたいです.
  初期はMask[Index(Pat[1])]の値は0Bなので,0Bと1Bを左に何ビットシフトしたものの論理和を取ると1Bになるかを考えます.
  選択肢を見ると,(ア)(オ)が当てはまるかと思います.

② 次に  i=3のとき,下位から3番目を1にしたいです.
  現在のAのビットマスクは①の結果から1Bになっています.なので①と②の結果を合わせて101Bになれば良いので1Bを左に何ビットシフトしたものとの論理和を取ると101Bになるかを考えます.
  そうすると,選択肢は(ア)に絞れるかなと思います.


長文失礼しました.
分かりにくかったらすみません.
  
2021.02.13 13:36

返信投稿用フォーム

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

その他のスレッド


Pagetop