Question
Multiplier chaque chiffre d'un nombre
- Philippe
- Hors Ligne
- Modérateur
-
- Messages : 1778
- Remerciements reçus 21
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
[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.
- Speed83
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 12
- Remerciements reçus 0
Merci beaucoup pour ton aide !
Je vais analyser ce code afin de bien comprendre son fonctionnement !
Vraiment sympa !
Connexion ou Créer un compte pour participer à la conversation.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
il y a un peu trop de transtypage à mon avis.
En recherchant dans les APIs on peut alléger le code.
Speed83 écrit:
Oui, je n'ai pas pris le temps d'aller au bout de la démo.je ne comprends pas
Speed83 écrit:
Le pb est effectivement de transformer un char en un entier, d'où la méthode statique : [System.Char]::GetNumericValue()je n'arrive pas à isoler chaque chiffre du nombre 12345678 par exemple pour ensuite le multiplier par $i.
[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:
C'est le même principe, mais le type final ($Total) différe :Je bloque sur ça, comment construire ma ligne à partir du nombre 12345678.
[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 +=\"($_ * $i)\" ; $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
\"$Total\"
# exécute la ligne construite
Invoke -Expression \"$Total\"
[/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.
- Philippe
- Hors Ligne
- Modérateur
-
- Messages : 1778
- Remerciements reçus 21
c'est un peu la difficulté que j'ai \"les recherche dans l'API\", je tourne en rond deux heures sans savoir ou cherche !!il y a un peu trop de transtypage à mon avis.
En recherchant dans les APIs on peut alléger le code.
j'avais pas compris que Speed83 voulais multiplier le premier chiffre une fois, le deuxième deux fois, le troisième trois fois etc...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)
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.
- Laurent Dardenne
- Hors Ligne
- Modérateur
-
- Messages : 6311
- Remerciements reçus 68
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.c'est un peu la difficulté que j'ai \"les recherche dans l'API\", je tourne en rond deux heures sans savoir ou cherche
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.
- Speed83
- Auteur du sujet
- Hors Ligne
- Nouveau membre
-
- Messages : 12
- Remerciements reçus 0
Problème résolu !
Connexion ou Créer un compte pour participer à la conversation.
- Vous êtes ici :
-
Accueil
-
forum
-
PowerShell
-
Entraide pour les débutants
- Multiplier chaque chiffre d'un nombre