Алгоритм оценки MasterMind в Objective C - PullRequest
2 голосов
/ 12 марта 2011

Я ищу элегантный способ вычислить оценку предположения в игре MasterMind в Objective C, основываясь на этой статье, уже посвященной стекопотоку:

Алгоритм оценки MasterMind в C # с использованием LINQ

Ответы [ 3 ]

1 голос
/ 12 марта 2011

Я полагаю, что вы можете сделать это «не очень элегантно», с помощью NSArray и NSSet.

Для функционального подхода, используемого в решении LINQ, вы можете либо

1)Google для некоторых функциональных библиотек 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 просто не такой язык.

0 голосов
/ 24 ноября 2017

Ответ, вдохновленный Ответом Макса , но обновленный, чтобы иметь дело со случаем, когда (на мой взгляд) он дает неправильный ответ:

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;
        }
    }
}
0 голосов
/ 12 марта 2011

Пока я придумал это (ну, на самом деле это 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;
        }
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...