Étant donné une série de mots, je dois trouver le mot qui a obtenu le meilleur score. Chaque lettre d'un mot marque des points en fonction de sa position dans l'alphabet: a = 1, b = 2, c = 3 etc. Je dois renvoyer le mot ayant obtenu le meilleur score sous forme de chaîne.

Ainsi, dans la chaîne 'man i need a taxi up to ubud', la chaîne de retour correcte serait taxi car elle a des lettres de grande valeur comme t et x.

Ma confusion réside dans la manière d'attribuer une valeur à chaque lettre de chaque mot. Je comprends d'exploser la chaîne d'entrée, puis de foreach par-dessus pour exploser les mots, mais comment incrémenter la valeur en fonction de l'ordre dans l'alphabet? Je suis très confus.

function high($x) {
    $alphabet = ["a", "b", "c", "d", "e", "f", "g", "h", "i", "j", 
                "k", "l", "m", "n", "o", "p", "q", "r", "s", "t", 
                "u", "v", "w", "x", "y", "z"];
    $nA = array_flip($alphabet);

    $words = explode(" ", $x);
    foreach($words as $w) {
      explode("", $w);
    }
    return "";
}
php
1
Jason Yaraghi 15 oct. 2020 à 21:58

2 réponses

Meilleure réponse

Comme vous ne vous souciez pas vraiment du score, plus le mot avec les caractères les plus élevés, vous pouvez utiliser ord() pour calculer la valeur ascii. Cela a l'alphabet dans l'ordre croissant et donne donc une valeur plus élevée - mais il est toujours basé sur la position.

Cela divise les mots, puis pour chaque mot ajoute la valeur ascii et garde une trace des plus élevés ...

function high($x) {
    // Split sentence into words (lower cased)
    $words = explode(" ", strtolower($x));
    $max = 0;
    $maxWord = '';
    foreach($words as $w) {
        // Keep track of 'value' of word
        $value = 0;
        // For each letter of the word ($i)...
        for ( $i = 0, $len = strlen($w); $i < $len; $i++ )  {
            // $w[$i]  is the letter we are dealing with (treat a string as an array)
            // Take the ascii value of this character and adjust it by 'a'
            $value += (ord($w[$i]) -ord('a'));
        }
        // Check if the new highest value
        if ( $value > $max )    {
            $max = $value;
            $maxWord = $w;
        }
    }
    return $maxWord;
}
1
Nigel Ren 15 oct. 2020 à 19:19

Vous devez parcourir chaque mot, comme vous l'avez dit - et pour chaque mot, déterminer son score. Ensuite, vous devez enregistrer le score de ce mot, et le mot lui-même, ou la position de ce mot. Si le score suivant que vous calculez a un score supérieur à celui que vous avez enregistré, écrasez-le - sinon, passez à l'itération suivante. Enfin, renvoyez la valeur.

Utilisez strtolower() pour vous assurer que les mots sont en minuscules, sinon une chaîne comme A man with a XRAY ne trouverait pas XRAY comme mot ayant obtenu le meilleur score.

function high($input) {
    // Initialize: Convert the string to lowercase, and generate an array of the alphabet
    $input = strtolower($input);
    $alphabet = range('a', 'z');
    $values = array_flip($alphabet);

    // Split the words into an array, and declare initial scores
    $words = explode(" ", $input);
    $highestScore = null;
    $highestIndex = null;
    
    // Iterate over each word
    foreach($words as $k=>$w) {
        // Calculate the score of the current word
        // The score is the position of the flipped alphabet array, or 0 if its not in the lsit
        $score = array_sum(array_map(function($v) use ($values) {
            return $values[$v] ?? 0;
        }, str_split($w)));

        // If the current score is higher than the previous highest, overwrite it
        if ($highestScore < $score) {
            $highestScore = $score;
            $highestIndex = $k;
        }
    }

    // Return the word at the index where the score was the highest
    // If there were no scores (if $input is empty), return a default message
    return $words[$highestIndex] ?? 'N/A - No words found';
}

La fonction array_map() renverra un tableau de toutes les valeurs individuelles de ce mot (chaque lettre), nous utilisons donc array_sum() pour obtenir la somme complète du tableau.

Puisque nous utilisons return $values[$v] ?? 0; et ne créons que des valeurs à partir de a-z, tous les autres caractères auront un score de 0. Comme la chaîne est transformée en minuscules, cela signifie qu'elle traitera a et { {X3}} avec le même score de 1. Les caractères spéciaux comme !?# et ainsi de suite obtiendraient un score de 0.

2
Qirel 15 oct. 2020 à 19:42