Question Multiplier chaque chiffre d'un nombre

Plus d'informations
il y a 9 ans 3 mois #22644 par Philippe
salut Speed83 et Laurent

ma première idée etait de reprendre le travail de Laurent comme ça :

[code:1]
$n = 12345678
$s = $n.ToString()
$t = [char[]]$s
[system.Array]::Reverse($T)
$i=1
$total = 0
$T | foreach {
$total += $($i * [int][string]$_)
Write-Host \"($i * $_) + \" -NoNewline
$i++
}
\" = $total\"
# donne : (1 * 8) + (2 * 7) + (3 * 6) + (4 * 5) + (5 * 4) + (6 * 3) + (7 * 2) + (8 * 1) + = 120
[/code:1]
mais avant de finir je me suis dit si je change le nombre d'origine ça marche plus :whistle: :
[code:1]
$n = 568678
$s = $n.ToString()
$t = [char[]]$s
[system.Array]::Reverse($T)
$i=1
$total = 0
$T | foreach {
$total += $($i * [int][string]$_)
Write-Host \"($i * $_) + \" -NoNewline
$i++
}
\" = $total\"
# donne : (1 * 8) + (2 * 7) + (3 * 6) + (4 * 8) + (5 * 6) + (6 * 5) + = 132
# au lieu de : (5 * 8) + (6 * 7) + (8 * 6) + (6 * 8) + (7 * 6) + (8 * 5) = 260
[/code:1]

du coup j'ai refait la boucle comme ça :

[code:1]$n = 12345678
$chaine = [string]$n
$total = 0
for ($i = 0; $i -lt $chaine.Length; $i++) {
$t = $([int][string]$chaine[$i]) * $([int][string]$chaine[(-$i-1)])
$total += $t
Write-Host \"($([int][string]$chaine[$i]) * $([int][string]$chaine[(-$i-1)]))\" -NoNewline
if ($i -lt $chaine.Length-1) {Write-Host \" + \" -NoNewline }
}
Write-Host \" = $total\"
# donne : (1 * 8) + (2 * 7) + (3 * 6) + (4 * 5) + (5 * 4) + (6 * 3) + (7 * 2) + (8 * 1) = 120
# avec 12399 ça donne : (1 * 9) + (2 * 9) + (3 * 3) + (9 * 2) + (9 * 1) = 63[/code:1]
je crois que tu a tout pour la dernière étape pour l'utilisation du invoke-expression si tu en a toujours besoin !<br><br>Message édité par: 6ratgus, à: 23/11/16 17:11

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 9 ans 3 mois #22647 par Speed83
Hello 6ratgus,

Merci beaucoup pour ton aide !

Je vais analyser ce code afin de bien comprendre son fonctionnement ! :cheer:

Vraiment sympa !

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 9 ans 3 mois #22648 par Laurent Dardenne
Salut 6ratgus,
il y a un peu trop de transtypage à mon avis.
En recherchant dans les APIs on peut alléger le code.


Speed83 écrit:

je ne comprends pas

Oui, je n'ai pas pris le temps d'aller au bout de la démo.

Speed83 écrit:

je n'arrive pas à isoler chaque chiffre du nombre 12345678 par exemple pour ensuite le multiplier par $i.

Le pb est effectivement de transformer un char en un entier, d'où la méthode statique : [System.Char]::GetNumericValue()
[code:1]
# typer dés le départ évite de recevoir un double (1.25)
[int]$Number = 12345678
#Au cas où
#sinon le signe '-' se retrouve dans le tableau :/
If ([Math]::«»Sign($Number) -eq -1) { Throw 'Pas implémenté.' }

#Conversions en une ligne
[Char[]]$T = $Number.ToString()
#nécessite un type array
[System.Array]::Reverse($T)
[int] $Total = 0
$I=1
#j'ai un faible pour le pipeline :«»-)
$T|Foreach { $Total +=([System.Char]::GetNumericValue($_)*$i) ; $i++}
#Le résultat est un entier
$Total
[/code:1]

Speed83 écrit:

Je bloque sur ça, comment construire ma ligne à partir du nombre 12345678.

C'est le même principe, mais le type final ($Total) différe :
[code:1]

$Number = 12345678
If ([Math]::«»Sign($Number) -eq -1) { Throw 'Pas implémenté.' }
[Char[]]$T = $Number.ToString()
[System.Array]::Reverse($T)
#Tableau non typé
$Total=@()
$I=1
$T|Foreach { $Total +=\&quot;($_ * $i)\&quot; ; $i++}
#Le résultat est un tableau de string
#on utilise le séparateur d'élément pour construire la chaîne finale
$Ofs ='+'
# la ligne exécutée
\&quot;$Total\&quot;
# exécute la ligne construite
Invoke -Expression \&quot;$Total\&quot;
[/code:1]
Je te laisse créer une fonction dédiée :-)
[edit]
Et créer le jeu de test...<br><br>Message édité par: Laurent Dardenne, à: 23/11/16 20:40

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 9 ans 3 mois #22651 par Philippe
salut Laurent

il y a un peu trop de transtypage à mon avis.
En recherchant dans les APIs on peut alléger le code.

c'est un peu la difficulté que j'ai \&quot;les recherche dans l'API\&quot;, je tourne en rond deux heures sans savoir ou cherche !! :blush:

J'aurai besoin de multiplier chaque chiffre de ce nombre comme dans l'exemple ci-dessous :
(1*8)+(2*7)+(3*6)+(4*5)+(5*4)+(6*3)+(7*2)+(8*1)

j'avais pas compris que Speed83 voulais multiplier le premier chiffre une fois, le deuxième deux fois, le troisième trois fois etc...
vu la formule ça laisse pensé à multiplié le premier par le dernier le second par l'avant dernier, etc ...
je doit être trop fatigué !!!

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 9 ans 3 mois #22674 par Laurent Dardenne
6ratgus écrit:

c'est un peu la difficulté que j'ai \&quot;les recherche dans l'API\&quot;, je tourne en rond deux heures sans savoir ou cherche

Pour ce type de traitement, j'utilise dans les mots clés C# et le traitement (sign, char numeric), j’obtiens un résultat rapidement.
Le nommage des API dotnet étant à mon avis bien pensé, la relecture s'en trouve aussi facilité.
Et souvent il s'agit de méthode statique d'une classe.

Tutoriels PowerShell

Connexion ou Créer un compte pour participer à la conversation.

Plus d'informations
il y a 9 ans 3 mois #22684 par Speed83
Merci à vous 2 !

Problème résolu ! :)

Connexion ou Créer un compte pour participer à la conversation.

Temps de génération de la page : 0.051 secondes
Propulsé par Kunena