体験を伝える―『ガジェット通信』の考え方

面白いものを探しにいこう 本物を体験し体感しよう 会いたい人に会いに行こう 見たことのないものを見に行こう そしてそれをやわらかくみんなに伝えよう [→ガジェ通についてもっと詳しく] [→ガジェット通信フロアについて]

【謎解きプログラム】条件に当てはまる文字列は?【正規表現】解答と解説

【謎解きプログラム】条件に当てはまる文字列は?【正規表現】

本問題は、表題のテーマで、プログラムにちなんだ謎を解くというものでした。

それでは以下、各問題とその解答を見ていきましょう。

問題のオープニング

ある日、出社すると、あなたのPCのログイン画面に、謎の挑戦状が表示されていた。

「24時間以内に謎が解けない場合は、このPCのデータは消失する。

 謎は、あなたが真のプログラマーなら解けるものだ」

これは挑戦状ではなく脅迫状だ!

そこには、見たことのない謎が掲載されていた。

あなたは歴戦のプログラマーとして、データを救うために、この謎に挑むことになった。

問題1

あなたは、縦横のヒントに正規表現が書かれた、空欄のマスを提示されました。

下記の選択肢のうち、1~n文字目を、下の表の1~n文字目のマスに入れた場合、縦横の正規表現を満たすものを選んで下さい。

// 問題のパズル

[^q]
[^i]
[iq]
1文字目
2文字目

// 選択肢
qq
qi
iq
ii

この問題を2つの方法で解いていきましょう。1つ目は縦軸と横軸に当てはまる文字を、人手で確認して、結果を求める方法です。2つ目は、プログラミングで、条件に一致する選択肢を探す方法です。

まずは、1つ目の方法です。人手で、選択肢から当てはまる文字の候補を確認します。

// 文字の候補を確認
横軸 [iq] は、iかqです。
縦軸1 [^q] は、q以外です。
縦軸2 [^i] は、i以外です。

// 確認した文字を表に

[^q]
[^i]
[iq]
横:iかq
縦:q以外
横:iかq
縦:i以外

[^q]
[^i]
[iq]
i
q

というわけで、選択肢の「iq」が条件に当てはまります。

また、プログラミング(JavaScript)で、条件に一致する選択肢を探してみましょう。共通関数は、以降の問題でも使います。

// 共通関数
var checkXW = function(sel, reX, reY) {
for (var i = 0; i < sel.length; i ++) {
var txt = sel[i].map(function(x) {return x.join('')}).join('');
var chck = [];
console.log(txt);
// 横方向正規表現確認
for (var x = 0; x < reX.length; x ++) {
var t = sel[i][x].join('');
var c = !!t.match(reX[x]);
chck.push(c);
console.log(t, c, reX[x]);
}
// 縦方向正規表現確認
for (var y = 0; y < reY.length; y ++) {
var t = sel[i].map(function(x) {
return x[y];
}).join('');
var c = !!t.match(reY[y])
chck.push(c);
console.log(t, c, reY[y]);
}
// 結果出力
var res1 = chck.map(function(x) {
return x ? 'o' : '-';
}).join('');
var res2 = chck.every(function(x) {
return x;
});
console.log('[result]', txt, res1, res2 ? 'ok!!' : '');
console.log('');
}
console.log('');
};

// 問題1
var sel = [
[['q', 'q']], // 選択肢1
[['q', 'i']], // 選択肢2
[['i', 'q']], // 選択肢3
[['i', 'i']]
// 選択肢4
];
var reX = [/[iq]/];
// 横方向正規表現
var reY = [/[^q]/, /[^i]/]; // 縦方向正規表現

checkXW(sel, reX, reY); // 横縦確認

1 2 3次のページ
CodeIQ MAGAZINEの記事一覧をみる
  • 誤字を発見した方はこちらからご連絡ください。
  • ガジェット通信編集部への情報提供はこちらから
  • 記事内の筆者見解は明示のない限りガジェット通信を代表するものではありません。
GetNews girl / GetNews boy

オスカー2018年晴れ着撮影会