Ich weiß zwar nicht, wie die Berechnung bei MTV funktioniert, ich kann mir aber überlegen, welche Anforderungen so ein Algorithmus erfüllen muss (sollte):
- Er muss ganze Zahlen im Interval [0,100] ausspucken.
- Er sollte beim Tausch der Argumente das gleiche Ergebnis produzieren.
- Die Ergebnisse müssen reproduzierbar sein.
- Verschiedene Namen mit gleichen Buchstaben (z.B. Alex und Axel) sollten nicht zum selben Ergebnis führen.
- Er sollte keinen Überlauf produzieren (Die Bedingung ist während der Implementation hinzugekommen :-( )
Aus 1 folgernd, bietet sich an, den Modulo-Operator zu verwenden.
Aus 2 folgt, dass man zur Verbindung Rechenarten benutzt, die dem Kommutativgesetz genügen (Addition, Multiplikation).
Aus 3 folgt, dass man weder Zufall, noch aktuelle Zeit oder ähnliches einfließen lässt.
Aus 4 folgt, dass die Buchstaben anhand ihrer Position im Namen gewichtet werden sollten.
Aus 5 folgt, dass bereits Zwischenergebnisse auf das gewünschte Interval reduziert werden sollten, ohne das Ergebnis zu beeinflussen (Modulo bietet sich auch hier an).
Aus den Bedingungen einen Algorithmus zu produzieren ist gar nicht so schwer.
Ich habe mir überlegt, die Buchstaben über ihre Position im ASCII-Zeichensatz zu Zahlen zu machen und als Wichtung die erhaltene Zahl mit der Position des Buchstabens im Namen (beginnend bei 1) zu multiplizieren. Die Ergebnisse der einzelnen Buchstaben werden addiert und mit modulo 101 sofort auf das passende Interval reduziert.
Hier ein Beispiel in PHP:
PHP:
<form action="match.php" method="get">
<input type="text" name="a" value="<?
echo (isset($_GET['a'])?$_GET['a']:""); ?>">
<input type="text" name="b" value="<?
echo (isset($_GET['b'])?$_GET['b']:""); ?>">
<input type="submit" name="matchit" value="match?">
</form>
<?
function match($a,$b) {
$m=0;
for ($i=0;$i<strlen($a);$i++) {
$m+=(ord($a{$i})*($i+1));
$m = $m % 101;
}
for ($i=0;$i<strlen($b);$i++) {
$m+=(ord($b{$i})*($i+1));
$m = $m % 101;
}
return $m;
}
if (isset($_GET['a']) && isset($_GET['b'])) {
echo $_GET['a']
." passt mit "
.match($_GET['a'],$_GET['b'])
."% zu ".$_GET['b']
.".";
}
?>
Wenn das mit Deinem Traumpartner nicht hinkommt, kannst Du ja noch ein bisschen am Algorithmus schrauben
Gruß hpvw