1. paizaラーニングトップ
  2. レベルアップ問題集
  3. 第2回P共通テスト過去問題セット(言語選択)
  4. 問題一覧 C#編
  5. パリティチェック C#編

第2回P共通テスト過去問題セットのサムネイル
パリティチェック C#編(paizaランク B 相当)

問題にチャレンジして、ユーザー同士で解答を教え合ったり、コードを公開してみよう!

問題

下記の問題をプログラミングしてみよう!

データ通信をおこなう際にデータの誤りを検出する方法の一つにパリティチェックがあります。
パリティチェックではデータのブロックごとにパリティビットと呼ばれるビットを 1 つ用意します。
そして、その値をブロックの各ビットとパリティビットの値の和の偶奇が全てのブロックについて同じになるように設定します。
ブロックの各ビットとパリティビットの値の和が偶数になるように設定するパリティビットを偶数パリティ、奇数になるように設定するものを奇数パリティといいます。
パリティチェックにはいくつか種類がありますが今回は垂直水平パリティを扱います。
送信データは w ビットのデータのブロックが h 個であるとします。それぞれのデータのブロックごとに計算する垂直パリティと h 個のデータのブロックにまたがって同じ位置にあるビットから計算する水平パリティを設定します。
垂直水平パリティでは、パリティが正しいかを判定することで 1 ビットの誤りの位置を特定することができます。
垂直パリティが誤っているデータのブロックと水平パリティが誤っているデータのブロックの位置により誤っているビットがどこか特定することが出来ます。

送信途中に 1 ビットの誤りが生じてしまったの 送信データと、垂直パリティ(h ビット)と水平パリティ(w ビット)が与えられます。
1 ビットの誤りを検出して、送信前の誤りが生じる前の送信データを復元してください。
なお、この問題ではパリティビットの付け方として偶数パリティを採用するものとします。

例として、入力例 1 の入力を考えてみましょう。
入力例 1 に対する正しい出力である

1 0 1
0 1 0
1 0 1


に適切な水平垂直パリティを付与すると以下の通りになります。
それぞれのパリティビットにおいて、各々の該当箇所のビットの和が偶数になっていることがわかります。



入力として与えられる誤りが生じた後のビット列

1 0 1
0 0 0
1 0 1


を上の水平垂直パリティと合わせてみてみると、2 番目の垂直パリティと 2 番目の水平パリティについて各々の該当箇所にあるビットの和が偶数になっていないので 2 番目のデータのブロックの 2 ビット目に誤りが生じているとわかります。よって、誤りを修正した後の送信データは

1 0 1
0 1 0
1 0 1


であるとわかります。

入力される値

h w
data_1_1 data_1_2 ... data_1_w
...
data_h_1 data_h_2 ... data_h_w
vertical_parity_1 vertical_parity_2 ... vertical_parity_h
horizontal_parity_1 horizontal_parity_2 ... horizontal_parity_w


・1 行目では送信データのブロック数 h と各々のブロックのデータ長 w が半角スペース区切りで与えられます。
・2 行目から h + 1 行目では 1 ビットの誤りが生じてしまった後の送信データが与えられます。data_i_j (1 ≦ i ≦ h, 1 ≦ j ≦ w) は i 番目のブロックの j 番目のビットを表しています。各ビットの間は半角スペースで区切られており、各行の間は改行で区切られています。
・h + 2 行目では h ビットの垂直パリティが半角スペース区切りで与えられます。
・h + 3 行目では w ビットの水平パリティが半角スペース区切りで与えられます。


入力値最終行の末尾に改行が1つ入ります。
文字列は標準入力から渡されます。 標準入力からの値取得方法はこちらをご確認ください
期待する出力

data_1_1 data_1_2 ... data_1_w
...
data_h_1 data_h_2 ... data_h_w


・入力として与えられたビットの 1 ビットの誤りを訂正して得られる、誤りが生じる前の送信データを入力と同様の形式で出力してください。
・具体的には、各ビットの値の間は半角スペースで区切り、各行は改行で区切ってください。
・また、末尾に改行を入れ、余計な文字、空行を含んではいけません。

条件

すべてのテストケースにおいて、以下の条件をみたします。

・1 ≦ h ≦ 30
・1 ≦ w ≦ 30
・data_i_j は 0 または 1 (1 ≦ i ≦ h, 1 ≦ j ≦ w)
・vertical_parity_i は 0 または 1 (1 ≦ i ≦ h)
・horizontal_parity_i は 0 または 1 (1 ≦ i ≦ w)

入力例1

3 3
1 0 1
0 1 0
1 0 1
0 0 0
0 0 0

出力例1

1 0 1
0 0 0
1 0 1

入力例2

2 5
1 1 1 0 0
1 0 1 0 1
1 0
1 1 0 0 1

出力例2

1 1 1 0 0
0 0 1 0 1

入力例3

1 3
1 1 1
0
1 0 1

出力例3

1 0 1

入力例4

6 10
0 0 0 0 0 1 0 0 0 1
1 1 0 0 0 1 0 0 0 1
1 1 1 0 1 0 0 1 0 1
1 1 1 1 0 0 0 1 1 0
1 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0 0 0
0 0 0 0 0 0
0 1 0 1 1 0 1 1 1 0

出力例4

0 0 0 0 0 1 0 0 0 1
1 1 0 0 0 1 0 0 0 1
1 1 1 0 1 0 0 1 0 1
1 1 1 1 0 0 0 1 1 0
1 0 0 0 0 0 0 1 0 0
0 0 0 0 0 0 1 0 0 1

問題一覧へ戻る

ページの先頭へ戻る