一人ヌメロン

ヌメロンというゲームをご存知でしょうか. 簡単に言うと二人で遊ぶ数字当てゲームです. お互いに数字をコールしていき,数字と桁が一致している数・数字は合っているが桁は異なる数を教えます.

結構頭を使うゲームで,慣れていないとなかなか推理できません. というわけで一人でヌメロンを遊ぶゲームをpythonでサクッと実装してみたので公開します.

import random
import argparse


def eat_bite(ans, pred):
    eat = sum([int(a == p) for a, p in zip(ans, pred)])
    bite = sum([int(a in pred) for a in ans]) - eat
    return eat, bite


if __name__ == '__main__':
    parser = argparse.ArgumentParser()
    parser.add_argument("N", type=int)
    parser.add_argument("--dbg", action="store_true")
    args = parser.parse_args()

    ans = list(range(10))
    random.shuffle(ans)
    ans = ans[:args.N]
    if args.dbg:
        print("anser", ans)
    print("Please input {} numbers (space separeted)".format(args.N))
    while True:
        pred = list(map(int, input().split()))
        eat, bite = eat_bite(ans, pred)
        if eat == args.N:
            print(ans)
            print("clear!")
            break
        else:
            print("eat: {} bite: {}".format(eat, bite))

実行するときに桁数を指定します.3だと簡単ですが,4はなかなか難しいです.

Please input 3 numbers (space separeted)
0 1 2
eat: 0 bite: 0
3 4 5
eat: 0 bite: 1
6 7 8
eat: 0 bite: 1
4 6 9
eat: 1 bite: 0
5 7 9
eat: 1 bite: 1
9 8 5
eat: 0 bite: 3
5 9 8
eat: 0 bite: 3
8 5 9
[8, 5, 9]
clear!

これ最適戦略は何なんでしょう,終了までの期待値も気になります.