我正在寻找一种优雅的方法来计算Objective C中MasterMind游戏的猜测得分,基于这篇文章已经在stackoverflow上:
答案 0 :(得分:1)
我认为您可以使用NSArray
和NSSet
以“不那么优雅”的命令方式执行此操作。
对于LINQ解决方案中使用的功能方法,您可以
1)谷歌搜索一些Objective-C功能库 - http://www.google.com/search?q=functional+programming+objective-c
或
2)实现所需的功能 - Intersect
,Zip
,Count
,Sum
。
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;
}
}
}