LaBouaBouate

La formule magique

Ma solution

Pour ça j’avais envie de vous partager une commande assez spécifique mais qui peut avoir son utilité : Invoke-Expression

Ma fonction :

function LaFormuleMagique {
    param([Int64]$i)
    $expression = ([string]$i).ToCharArray() -join '+'
    $result = Invoke-Expression -Command $expression
    return $result
}

En version courte, le cœur de la fonction peut être résumé à : iex("$i".ToCharArray()-join'+')

Explications

On va y aller étape par étape :

([string]$i) : permet de convertir le nombre entier en une chaine de caractères

PS C:\> $i = [string]2568

.ToCharArray() : une fois que l’entier est transformé, on peut utiliser la méthode ToCharArray pour convertir la chaine “2568” en un tableau avec les valeurs 2, 5, 6 et 8

PS C:\> $i = $i.ToCharArray()
PS C:\> $i

2
5
6
8

-join '+' : on réassemble ensuite le tableau en joignant les caractères entre eux avec un “+”

PS C:\> $i = $i -join '+'
PS C:\> $i

2+5+6+8

Une fois notre chaine de caractère prête, il ne reste plus qu’à l’interpréter comme une ligne de commande. Et pour ça on peut utiliser la commande Invoke-Expression (iex pour les intimes) :

PS C:\> Invoke-Expression $i

21

La solution droit au but

Trouvée par @Clément Vigier.

Ici pas le temps de niaiser, on va aller directement à la solution sans chercher à utiliser une commande aussi peu efficace que Invoke-Expression. On va utiliser une méthode différente pour découper notre nombre (via -split) et l’incontournable commande Measure-Object pour compter la somme de nos chiffres. Voilà ce que ça donne en code :

function LaFormuleMagique {
    param([Int64]$i)
    $result = $i -split '' | Measure-Object -Sum
    return $result.Sum
}

Explications

On commence par découper notre nombre via un -split '' qui a un avantage et un inconvénient par rapport à la méthode que j’ai utilisé. D’un côté il n’y a pas besoin de convertir notre nombre en une chaine de caractère, mais de l’autre côté : découper un nombre de quatre chiffres nous donne 6 items en résultat :

PS C:\> 2568 -split ''

2
5
6
8

Si vous ne voyez pas les six items, sachez qu’il y a un item vide avant le 2 et un item vide après le 8. Vous pouvez vous en débarrasser avec la méthode .Trim() si ça vous dérange, mais dans notre cas ils n’auront aucun impact sur notre calcul puisque 0+2+5+6+8+0 donne le même résultat que 2+5+6+8. Il ne nous reste plus qu’à calculer la somme de tous nos chiffres, et pour ça on utilise la commande Measure-Object qui permet de faire bien plus que simplement compter le nombre d’items dans une collection.

En effet, Measure-Object permet de :

On va donc utiliser le paramètre -Sum pour demander à PowerShell de nous calculer la somme des chiffres présents dans notre liste.

Cet article pourrait-il vous intéresser ?
Commentaires