Lieber derBernd,
Deine Problembeschreibung klingt nach dem Spielprinzip von Mastermind. Aber dort sind mehrfache Vorkommen einer Farbe möglich, bei Deiner Vorgabe wäre das aber nicht der Fall.
// check solution against solution-word foreach ($aSolution as $ks => $vs) { if ($aLetters[$ks] == $vs) { $aStatus[] = 'T'; } else { if (in_array($vs, $aLetters)) { $aStatus[] = 'P'; } else { $aStatus[] = 'F'; } } }
Du prüfst im else-Zweig, der dann zutrifft, wenn das Zeichen nicht an der richtigen Stelle steht, ob es wenigstens vorkommt, egal ob es schon einmal verwendet wurde. Auch prüfst Du nicht, ob es bei einer früheren Verwendung bereits "nicht an der richtigen Stelle" war. Beispiele:
Lösung: abcde
- Eingabe1: edcba - Ergebnis: PPTPP
- Eingabe2: abcce - Ergebnis: TTTFT
- Eingabe3: accbe - Ergebnis: TPFPT
Um Versuch2 von Versuch3 unterscheiden zu können, bräuchte es eine Art "Arbeits-Array", in dem nur die bisher schon verwendeten Eingaben enthalten sind. Dann kann man mit in_array() prüfen, ob der gerade überprüfte Buchstabe überhaupt schon verwendet wurde (Eingabe3) und deshalb grundsätzlich als falsch zu bewerten ist.
$solution = 'abcde';
$input = 'acbda';
$aStatus = [];
// convert solution-word to array
$aSolution = str_split(strtoupper($solution));
// convert provided-solution to array
$aInput = str_split(strtoupper($input));
// check input against solution
$aTested = array();
foreach ($aSolution as $iKey => $sValue) {
$already_used = (in_array($sValue, $aTested) !== false);
$aTested[$iKey] = $sValue;
if (!$already_used) {
// correct char and position?
if ($aInput[$iKey] === $sValue) {
$aStatus[$iKey] = 'T';
} else {
// char exists in solution at all?
if (in_array($sValue, $aSolution)) {
$aStatus[$iKey] = 'P';
} else {
$aStatus[$iKey] = 'F';
}
}
} else {
// char has already been used -> error
$aStatus[$iKey] = 'F';
}
}
printf('<pre>%s</pre>', print_r($aStatus, true));
Das Testen überlasse ich Dir. ;-)
Liebe Grüße,
Felix Riesterer.