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にあるのは知ってたけどここまで簡単とは。
しかも抽象化されてる。
イテレータはランダムアクセス?双方向?
データ型は比較オペレータかな?