お待たせしました、約1年ぶりのSTYLYからの挑戦状です。相変わらず奇問好きのSTYLY エンジニアリングマネージャーからの新たな出題。楽しんで解いてください!
下記から2問以上正解された方は、書類選考なしで必ず面談をさせていただきます。
問1 究極の疑問の答え
ある二次元の座標系において
一次方程式
において、2個の点が分かると係数a,bが一意に特定可能です。
二次方程式
においては、3個の点が分かると係数a,b,cが一意に特定可能です。逆に、2個以下では係数a,b,cを特定することは出来ません。この性質を利用すると、二次方程式の定数項cを暗号文として、3つの点の値が分からないと復元不能な暗号文の生成が可能です。
ここで、
(1, 56)
(2, 90)
(4, 266)
(7, 980)
(14, 6426)
という5つの点があります。これは4つの点が分かると解読可能な暗号文です。暗号文を解読してください。
また、4点の組み合わせにより、復号された数字が変わらないことをプログラムで示してください。
問2 同値?
以下は配列にランダムな数字で設定し、その実行時間を計測するプログラムである。
#include<iostream>
#include<array>
#include<random>
#include<chrono>
using namespace std;
int main(){
const size_t width = 100000;
const size_t height = 10000;
static array<array<int, width>, height> a;
chrono::system_clock::time_point start, end;
random_device rnd;
mt19937 mt(rnd());
start = std::chrono::system_clock::now();
for (int i = 0; i < height; i++) {
for (int j = 0; j < width; j++) {
a[i][j] = mt();
}
}
end = std::chrono::system_clock::now();
cout << "pattern1:" << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << "[ms]" << endl;
start = std::chrono::system_clock::now();
for (int i = 0; i < width; i++) {
for (int j = 0; j < height; j++) {
a[j][i] = mt();
}
}
end = std::chrono::system_clock::now();
cout << "pattern2:" << std::chrono::duration_cast<std::chrono::milliseconds>(end - start).count() << "[ms]" << endl;
return 0;
}
実行すると
$ ./a.out
pattern1:21545[ms]
pattern2:30326[ms]
という結果を得た。
pattern1とpattern2では、実行時間に差がある。その理由を答えてください。
問3 誰がために鐘は鳴る
以下のバイナリファイルを実行してください。
また、このファイルをどのように解析し、何であるかを解説し、実行したスクリーンショットを添付してください。
https://drive.google.com/file/d/1_EBmrnAMmH4n5Nti2hoDznHGg817kRKp/view?usp=drive_link
問4 GRAND SLAM
以下の文字列を出力するプログラムを120Byte以内で書いてください。
また、どのように考えたのかを記述してください。
出力:
👆👉👇👈
👆🏻👉🏻👇🏻👈🏻
👆🏼👉🏼👇🏼👈🏼
👆🏽👉🏽👇🏽👈🏽
👆🏾👉🏾👇🏾👈🏾
👆🏿👉🏿👇🏿👈🏿
リダイレクトでファイルへ出力し、エディタで閲覧したときの表示: