インターンシップ・ワークショップ 2021Summer エンジニア編プログラムオンラインテスト解説

こんにちは。採用担当Hです。
今回はインターンシップ・ワークショップ 2021Summer エンジニア編 「放課後インターンシップ!C++新人研修体験」のプログラムオンラインテストの解説をさせていただきます!

試験問題

今回のインターン選考試験は「上記の暗号化をする関数を作成してください」という問題ですが勘のいい方は「ほぼ Base32 (*1) だよね?」と気が付いたかもしれません。
はい、その通りです。

ビット演算復習

バイナリデータを 5bit ずつ切り分けるには、ビット演算を使うと楽ですよ。
2進数やビット演算は、コンピュータの授業では最初の方に学ぶのですが、忘れてしまっている方も多いようですので、自信がない方は復習してみるといいですよ。
ビット演算 – Wikipedia(*2)」に綺麗にまとまっているので、ぜひ目を通してみてください。

ビット演算の使い道

XOR を使った簡単な暗号
簡単に使えるのでちょっとした暗号化に大人気!
でも速攻で破られるので、これ単体での暗号化は思いとどまった方が良いですよ。
この例では key が 1byte ですが 、key を長くすれば少しは破られ難くなるハズです。(焼け石に水)

// XOR 暗号 ・ 復号 関数
void crypt( size_t data_size, const char *input_data, char *output_data, char key)
{
  for( size_t i = 0; i < data_size; ++i){
          output_data[i] = input_data[i] ^ key;
  }
}

回答例

こちらから回答例をzipでダウンロードできます。

解説!
解き方は仕様書に書いてある通りで、5bit ずつ区切って、 table 参照するだけです。
5bit と 8bit(1byte) の最小公倍数である 40bit(5byte) 分の処理を書けば、あとはそれの繰り返しです。

回答例は素直にbit 演算を使用していますが
・算術演算と条件分岐だけで解く方
std::bitset –> std::string (*3) にして5文字ずつ区切ってから数値に変換する方
もいらっしゃって楽しかったです。

また9月以降にプログラミングコンテストも予定していますので、ぜひチャレンジしてみてください!お待ちしております!

引用元
(*1)Base32 From Wikipedia, the free encyclopedia
(*2)ビット演算  ウィキペディア (Wikipedia): フリー百科事典
(*3)cpprefjp – C++日本語リファレンス