C++で算数に挑戦
id:atmonadからネタミシュランの画像が送られてきました。
□□□□
□□□
+ □□
―――――
2008
0..9の数字を1個ずつ入れて、余ったものを答えなさい。
ですって。
(ものすごいずれてるでしょうがごめんなさい。等幅フォントのやり方知っている人がいたら教えてください。)
そして私の脳に真っ先に浮かんだ解法がこれ。
brute.cpp
#include <iostream> #include <algorithm> using namespace std; int main(){ int nums[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; while (next_permutation(nums, nums+10)){ int a = nums[0]*1000 + nums[1]*100 + nums[2]*10 + nums[3]; int b = nums[4]*100 + nums[5]*10 + nums[6]; int c = nums[7]*10 + nums[8]; if(a+b+c == 2008 && nums[0]!=0 && nums[4]!=0 && nums[7]!=0){ cout << a << endl; cout << " " << b << endl; cout << " " <<c << endl << endl; } } return 0; }
最終奥義 ブルートフォースアタック
・・・アタックってつけたらパスワードクラックじゃん
g++ -Wall -O3 brute.cpp
time ./a >out.txt
real 0.390s
user 0.202s
sys 0.093s
ものすごいその場の勢いだけでやった。cygwin。
468通りの入れ方があり、余るのはすべて8です。
一番最初に見つかったのを挙げると
1025
936
47
ですか。
いやあ、大勝利!気分がいいですねえ!
算数での解法は考える気もうせました。
next_permutationすげえええええ。
順列を生成するのがalgorithmにあるのは知ってたけどここまで簡単とは。
しかも抽象化されてる。
イテレータはランダムアクセス?双方向?
データ型は比較オペレータかな?