少なくとも平成の初期頃に受けていた一般教養の課題よりは難しいです
ヒットアンドブロウ(hit&blow)というゲームの簡単な解法例です
CodinGameというサイトのゲームを利用しています
トップからCOMPETE > OPTIMIZATION > Bulls and Cows 2
同じ数字のない数列を出題者が考え、解答者が推測するゲームです
まず桁を与えられ、解答者が数字を考える
その数を出題者が推測して答え同じ数字になれば正解になります
解答が出題者の数字と同じ位置にあればヒット、同じ数字ならブロウ、
そのヒントで解答を繰り返していきます
この問題では ヒットとブロウが ブルズとカウズ になってます
初期画面の中でコメントを取ったもの
Rubyで挑戦してみることにしてみました
作った内容としては
1号:解答と同じ桁で同じ数字の重ならないリストを作り順に答える
2号:ヒットとブロウが0なら答えにない
3号:ヒットとブロウの合計が桁と同じなら、その数字以外は答えにない
4号:問題の仕様で先頭に0は入らないのて条件追加
そして完成
画面に収めようとしたためend endの嵐
これで真ん中より少し下です 14人中
詳しい解説
1 呼び出し側のプログラムで利用か?(当初必須とのコメントあり)
2 桁数を取得
3 桁数が5桁より上だとpass
4 numの設定、各数字を数える際に利用
5-12 keta数の数字で各桁の数字が違うものを配列aに追加
13 1桁の数字の時、0はないので先頭を削除
14 配列aをシャッフル(例外数字に一致する可能性を高める)
15 配列o 使用されない数字が入ってきます
16 前回の答えた文字列をlastに
17 メインループ (出題者のヒントと解答の繰り返し)
18 前回の文字列のヒットとブロウを取得(初回のみ -1,-1が入る)
19-21 ヒットとブロウが0なら、各桁の数字を 配列oに追加
22-25 ヒット+ブロウが桁と同じ時、その数字以外を配列oに設定
26 いらないロジック(ミス!)
27-32 配列aから答え取得、もし配列oの数字が入っていれば再取得
33 解答