Doxygenもっと日本語対応 作品解説  2013-11-25
 全て クラス ファイル 関数 変数 列挙型 列挙値 ページ
main.cpp
[詳解]
1 #include <iostream>
2 #include <sstream>
3 #include <cstdlib>
4 #include <ctime>
5 #include "エラー定数.h"
6 #include "推定.h"
7 #include "判定.h"
8 #include "順列.h"
9 #include "推定.h"
10 
45 std::vector<unsigned int> 解答の作成( const unsigned int 元数 = 9, const unsigned int 桁数 = 4 )
46 {
47  if ( 元数 < 桁数 )
48  {
49  std::wcerr << L"元の数が桁数より少ないため解答を作成できません"
50  << L"(元数=" << 元数 << L", 桁数=" << 桁数 << L")。" << std::endl;
51  exit( 桁数異常 );
52  }
53  std::vector<unsigned int> 未使用;
54  for ( unsigned int i = 0; i < 元数; ++i ) { 未使用.push_back( i ); }
55  std::vector<unsigned int> r;
56  for ( unsigned int i = 0; i < 桁数; ++i )
57  {
58  const int idx = std::rand() % 未使用.size();
59  const auto it = 未使用.begin() + idx;
60  r.push_back( *it );
61  未使用.erase( it );
62  }
63  return r;
64 }
65 
66 
74 std::wstring 解答文字化( const std::vector<unsigned int>& s, const wchar_t base = L'1' )
75 {
76  std::wstring r;
77  for ( auto it = s.rbegin(); it != s.rend(); ++it )
78  {
79  r += wchar_t( base + *it );
80  }
81  return r;
82 }
83 
84 
91 std::wstring 判定文字化( const 判定結果& s )
92 {
93  std::wostringstream ss;
94  ss << s.mHit << L"ヒット " << s.mBlow << L"ブロー";
95  return ss.str();
96 }
97 
98 
109 {
110  std::ios_base::sync_with_stdio(false);
111  std::locale default_loc("");
112  std::locale::global(default_loc);
113  std::locale ctype_default(std::locale::classic(), default_loc, std::locale::ctype);
114  std::wcout.imbue(ctype_default);
115  std::wcerr.imbue(ctype_default);
116  std::wcin.imbue(ctype_default);
117 }
118 
119 
126 int main()
127 {
129 
130  std::srand( static_cast<unsigned int>( std::time(0) ) );
131 
132  const unsigned int 元数 = 9;
133  const unsigned int 取得長さ = 4;
134 
135  auto 解答 = 解答の作成( 元数, 取得長さ );
136  auto 解答文字 = 解答文字化( 解答 );
137  std::wcout << L"解答 = ";
138  std::wcout << 解答文字 << std::endl;
139 
140  推定 推定器( 元数, 取得長さ );
141 
142  for ( int i = 0; i < 1000000; ++i )
143  {
144  auto 予想 = 推定器.();
145  if ( 予想.size() == 0 )
146  {
147  std::wcout << L"予想が尽きてしまいました。" << std::endl;
148  getchar();
149  exit( 予想消沈 );
150  }
151  auto r = 判定( 解答, 予想 );
153  {
154  getchar();
156  }
157  std::wcout << i << L"回目: " << 解答文字化( 予想 ) << L"->"
158  << 判定文字化( r ) << L"\r";
159  推定器.結果登録( 予想, r );
160  if ( r.mHit == 4 )
161  {
162  break;
163  }
164  }
165  std::wcout << std::endl
166  << L"正解を出せました。Enterキーで終了します。" << std::endl;
167  getchar();
168  return 0;
169 }
判定結果 判定(const T &解答, const T &試行)
ヒットアンドブローの判定を行います
Definition: 判定.h:57
ヒットアンドブローの正解を予測するためのクラスを宣言しています
const int mBlow
位置は異なるが要素ではある数、 mHit は含まない
Definition: 判定.h:36
static エラー定数 m最終エラー
最新の判定に対する前提条件の成否を示します
Definition: 判定.h:38
std::vector< unsigned int > 解答の作成(const unsigned int 元数=9, const unsigned int 桁数=4)
指定引数に基づき乱数で解答を一つ生成します
Definition: main.cpp:45
std::vector< unsigned int > 次()
次の試行値を配列の形で返します
Definition: 推定.cpp:33
ヒットアンドブローの正解を予測するための情報蓄積および分析を行います
Definition: 推定.h:17
int main()
ここから処理が始まります
Definition: main.cpp:126
void 結果登録(const std::vector< unsigned int > &試行, const 判定結果 &結果)
判定結果を登録します
Definition: 推定.cpp:62
ヒットアンドブローの判定結果を保持する構造体
Definition: 判定.h:20
順列または組み合わせの反復取得クラスを宣言しているヘッダファイルです
void 標準入出力日本語化()
std::wcout をまともに使えるように初期化します
Definition: main.cpp:108
ヒットアンドブローの判定結果を受け渡すための構造体や関数の宣言
予想不能状態です、コードが論理的におかしいことを示します
正常に処理されています
std::wstring 解答文字化(const std::vector< unsigned int > &s, const wchar_t base=L'1')
整数の配列から可視化した文字列を返します
Definition: main.cpp:74
const int mHit
位置まで含めて一致した数
Definition: 判定.h:35
桁数指定に異常があります、一方が他方に比べて大きすぎる、など
std::wstring 判定文字化(const 判定結果 &s)
判定結果を n ヒット m ブローの形で表します
Definition: main.cpp:91