インターンシップ・ワークショップ 2022&23Winter エンジニア編オンラインテスト解説

インターンシップ・ワークショップ 2022&23 Winter エンジニア編 「ゲームへのデータ組み込みによる実践的な技術習得!」につきまして、弊社エンジニアによるプログラムWEBテストの解説を掲載させていただきます。

不定長データから値を求めよ【 解説 】

はじめに

おかげさまで、多くの方にチャレンジしていただきましたが、結果を見る限り、今回の試験はちょっと難しかったようですね…!

今回の問題は、
純粋なプログラミング能力コンピューターの基礎知識を確認する目的で設計してみました。

多かったミス

オーバーフロー対応が不十分だった
・オーバーフローしているかどうかを知るためには、演算結果を32bit よりも大きいサイズの整数型に格納するのが簡単なのですが、そうなってないコードが多かったですね。

ローテート処理に不備があった
・C++の演算子<<と>>は算術シフトなので、ローテート処理を自作しなければならないのですが、この処理の不備が多かったです。
・わざわざstd::bitset を使って文字列に変換するようなコードも多かったです。
 値がコンピューター上でどのようの表現されているのかを理解できていれば、このような冗長なコードにはならないはずです。
・C++20には rotr、rotl というこの問題に最適な関数が用意されているのですが、試験環境では使えなかったはずです、申し訳ございません。

ところで、long のサイズはいくつ?

このコード、正常にコンパイルされるでしょうか?
それともコンパイラに怒られちゃうでしょうか?

static_assert(sizeof(long) == 4, “longのサイズは4ですよね?”);

正解は、怒られないかもしれないし、怒られるかもしれません。
なぜそうかと言うと、
処理系 によって動作が異なるからです。
・最近の言語には無い、C++ ならではの厄介な特徴です。
・雑に説明すると、コンパイラやOSが異なると、違う動作をする可能性があるんです。

C++の基本型(組み込み型:int とか long とか )は、処理系によってサイズが異なることがあるので、 cstdint で定義されている型 を使いましょう!

試験環境では動作するけど、Visual Studio では動作しないコードがたくさんありました。処理系の違いを吸収できていなかったからですね。

なぜ負の数の除算をエラーにしたのか?

この問題では、負数の除算、剰余をエラーにするように指示していました。
なぜでしょうか?
実はそれも、処理系の話が絡んでいます。
除算の結果が処理系によって異なる(可能性がある)ためです。

しかし、C++11で除算に関するルールが明確にされたので、C++11 以降ではこの
ような問題は発生しません。
なので、豆知識として押さえておけば十分です。

0による除算をエラーにしてたのも、もちろん意図がありますが、それはさすがにわかっていますよね?わからない人は今すぐ調べよう!

解答例

※画像をクリックすると拡大表示されます。

100 人いれば、 100 通りのプログラム!

みなさんのコードを読んでみて、改めてプログラミングの面白さと難しさに気付かされました!
苦戦してる様子、持てる知識をフル活用して、何とか形にしようとしてる様子が見受けられましたよ。
回答例は割とスッキリと仕上げられたと思いますが、これがベストな形ではないはずです。よりベターなコードが 1 つでも多く生まれたら嬉しいです!