ObjectiveM中的MasterMind评分算法

时间:2011-03-12 11:10:29

标签: objective-c algorithm

我正在寻找一种优雅的方法来计算Objective C中MasterMind游戏的猜测得分,基于这篇文章已经在stackoverflow上:

MasterMind scoring algorithm in C# using LINQ

3 个答案:

答案 0 :(得分:1)

我认为您可以使用NSArrayNSSet以“不那么优雅”的命令方式执行此操作。

对于LINQ解决方案中使用的功能方法,您可以

1)谷歌搜索一些Objective-C功能库 - http://www.google.com/search?q=functional+programming+objective-c

2)实现所需的功能 - IntersectZipCountSum

  • Intersect(a1, a2)。从数组中创建集合并与objectsPassingTest:进行交集。

  • Zip(block, a1, a2)。迭代max(a1.count,a2.count)并在相应的数组元素上推入调用块的应答数组结果。

  • Count(predicate, array)Sum((x -> predicate(x) ? 1 : 0), array)

  • Sum(block, array)Foldl((x, sum -> sum + block(x)), 0, array)

  • Foldl(block, init, array)id result = init; for (id obj in array) { result = block(result, obj); }

我相信无论你选择什么方法,结果都会像地狱一样难看。 Objective-C就不是那种语言。

答案 1 :(得分:0)

现在我已经想出了这个(好吧,它实际上是C但你可以使用NSArray和isEqual轻松地重写它)

int secret[] = { 1, 2, 3, 1 };
int guess[]  = { 1, 1, 2, 2 };
int white = 0, black = 0;
for(int i=0; i<4; ++i) {
    if( secret[i] == guess[i] ) {
        secret[i] = 0;
        ++white;
        continue;
    }
    for(int j=0; j<4; ++j) {
        if( secret[j] == guess[i] ) {
            secret[j] = 0;
            ++black;
            break;
        }
    }
}

答案 2 :(得分:0)

答案受到Max's answer的启发,但已更新以处理(在我看来)它提供错误答案的案例:

int secret[] = { 1, 1, 2, 3 };
int guess[]  = { 4, 1, 5, 1 };
int white = 0, black = 0;
for(int i=0; i<4; ++i) {
    if( secret[i] == guess[i] ) {
        secret[i] = 0;
        ++white;
        continue;
    }
    for(int j=0; j<4; ++j) {
        if( secret[j] == guess[i] ) {
            if ( secret[j] == guess[j] ) {
                ++white;
            } else {
                ++black;
            }
            secret[j] = 0;
            break;
        }
    }
}