1. paizaラーニングトップ
  2. レベルアップ問題集
  3. 行列計算メニュー(言語選択)
  4. 問題一覧 Perl編
  5. ハミング符号 2 Perl編

行列計算メニューのサムネイル
ハミング符号 2 Perl編(paizaランク A 相当)

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

問題

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

ハミング符号の手順はおおまかに次の 3 つに分かれます。
(1) データを符号化する
(2) 誤りがあるかを判定する
(3) 誤り訂正をおこなう

この問題は、(2) の「誤りがあるかを判定する」という手順に対応します。

0, 1 のみを要素に持つ行列 (行ベクトル) w = [w_1 w_2 ... w_7] が与えられます。
まず、次の行列 H を用いて、行列 (行ベクトル) r = w✕H を計算してください。
この計算によって得られた r は 3 つの要素からなるベクトルです。
必要に応じて、後述する配列・リストを利用しても構いません。
(問題文はまだ続きます。)



// 行列 H, C++用
const vvi H = {{1, 0, 0},
{0, 1, 0},
{1, 1, 0},
{0, 0, 1},
{1, 0, 1},
{0, 1, 1},
{1, 1, 1}}


# 行列 H, Python 用
H = [[1, 0, 0],
[0, 1, 0],
[1, 1, 0],
[0, 0, 1],
[1, 0, 1],
[0, 1, 1],
[1, 1, 1]]


次に、i 番目の要素 s_i を r の各要素 r_i (1 ≦ i ≦ 3) を 2 で割った余りとする行列 (行ベクトル) s = [s_1 s_2 s_3] = [r_1%2 r_2%2 r_3%2] を求めてください。
このとき、s = [0, 0, 0] である(s のすべての要素が 0 である)なら、行ベクトル s と-1 を出力して終了してください。

s ≠ [0, 0, 0] である場合は、さらに次の手順を行ってください。
「j 番目の要素だけが 1 で、他の要素が 0 である 7 次元行ベクトル」をe_j (1 ≦ j ≦ 7) とします。
例えば e_1 = [1, 0, 0, 0, 0, 0, 0], e_4 = [0, 0, 0, 1, 0, 0, 0] です。
ここで、 p = e_j ✕ H とし、k 番目の要素 q_k を p の各要素 p_k (1 ≦ k ≦ 3) を 2 で割った余りとする行列 (行ベクトル)を q = [q_1 q_2 q_3] = [p_1%2 p_2%2 p_3%2] とします。
このとき、q = s が成り立つような整数値 j が 1 つ存在します(そのような j が存在する w が入力として与えられます)。
そのような j を求め、行ベクトル s と j を出力してください。

入力される値

w_1 w_2 ... w_7


・行ベクトル w = [w_1 w_2 ... w_7] が空白区切りで 1 行で与えられます。


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

次のフォーマットに従って、出力を行ってください。

s_1 s_2 s_3
j

1 行目に行ベクトル s = [s_1 s_2 s_3] を空白区切りで出力してください。
2 行目に j を出力してください。ただし、s = [0, 0, 0] の場合は -1 を出力してください。
末尾に改行を入れ、余計な文字、空行を含んではいけません。

条件

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

・w_i は 0, 1 (1 ≦ i ≦ 7)
・w は s = [0, 0, 0] か、q = s が成り立つような e_j が存在する入力のみが与えられる。

入力例1

0 0 1 0 0 1 1

出力例1

0 1 0
2

入力例2

0 1 0 0 1 0 1

出力例2

0 0 0
-1

入力例3

0 1 1 1 1 0 0

出力例3

0 0 0
-1

問題一覧へ戻る

ページの先頭へ戻る