Gewichten von Einzelnen Zahlen in einem Integer

  • VB.NET
  • .NET 5–6

Es gibt 15 Antworten in diesem Thema. Der letzte Beitrag () ist von bigbase.

    Gewichten von Einzelnen Zahlen in einem Integer

    Moin, seit langem mal wieder am Basteln und habe Folgendes Problem
    Erstmal

    mein Code

    VB.NET-Quellcode

    1. Dim SplitChar As Char
    2. Dim ByteCount As Integer
    3. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    4. Dim SplitPraefix As Integer = tbx_praefix.Text
    5. For ByteCount = 1 To Len(CStr(SplitPraefix))
    6. SplitChar = Mid(CStr(SplitPraefix).Trim, ByteCount, 1)
    7. Next


    Ich möchte SplitChar alle einzelnen zahlen die darin enthalten sind abwechselnd mit2 und 1 gewichten, beginnend mit 2.

    Anschließend möchte ich das Ergebnis prüfen ob es mehr als eine Nummer enthält, wenn ja soll diese gesplitet und miteinander addiert werden.

    Versuche jetzt schon ne weile rum komme aber auf keine lösung please help

    Danke im vorraus

    CodeTags korrigiert ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    @bigbase Fang an mit Option Strict On :!:
    Visual Studio – Empfohlene Einstellungen
    Mach Dir eine entsprechende Variable:

    VB.NET-Quellcode

    1. Dim Gewicht = 2
    2. BENUTZE_DEIN_GEWICHT(Gewicht)
    3. Gewicht = 3 - Gewicht
    4. ' nächste Runde
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    RodFromGermany schrieb:


    Mach Dir eine entsprechende Variable:


    Ich glaube nicht das das die schönste und code sparendste Option ist.

    VB.NET-Quellcode

    1. Public Class Form1
    2. Dim Praefix1 As String
    3. Dim Praefix3 As String
    4. Dim Praefix5 As String
    5. Dim SplitChar As String
    6. Dim ByteCount As Integer
    7. Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    8. Dim SplitPraefix As Integer = tbx_praefix.Text
    9. For ByteCount = 1 To Len(CStr(SplitPraefix))
    10. SplitChar = Mid(CStr(SplitPraefix).Trim, ByteCount, 1)
    11. Next
    12. Praefix1 = SplitChar(1)
    13. Praefix1 = Praefix1 * 2
    14. Praefix3 = SplitChar(3)
    15. Praefix3 = Praefix3 * 2
    16. Praefix5 = SplitChar(5)
    17. Praefix5 = Praefix5 * 2
    18. If Praefix1 >= 10 Then
    19. Dim ByteCount1 As Integer
    20. Dim IntNum1 As Integer
    21. Dim SplitChar1 As String
    22. For ByteCount1 = 1 To Len(CStr(IntNum1))
    23. SplitChar1 = Mid(CStr(IntNum1).Trim, ByteCount1, 1)
    24. Dim PraefixResult1 As String
    25. Dim PraefixResult2 As String
    26. PraefixResult1 = SplitChar1(1)
    27. PraefixResult2 = SplitChar1(2)
    28. PraefixResult1 = PraefixResult1 + PraefixResult2
    29. Next
    30. End If
    31. End Sub
    32. End Class


    CodeTags korrigiert ~VaporiZed

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „VaporiZed“ ()

    Ein kleiner Ansatz, vielleicht hilft es dir weiter.

    Freundliche Grüsse

    exc-jdbi

    Spoiler anzeigen

    VB.NET-Quellcode

    1. ​Option Strict On
    2. Option Explicit On
    3. Module WeightingNumbers
    4. Private ReadOnly Rand As Random = New Random
    5. Public Sub Main()
    6. Dim size = 16
    7. Dim numbers = GenerateNumerics(16)
    8. 'numbers = New Integer() {3, 0, 8, 4, 3, 3, 1, 1, 8, 7, 3, 0, 5, 5, 7, 0}
    9. Array.Reverse(numbers)
    10. For i = 1 To numbers.Length - 1 Step 2
    11. numbers(i) = 2 * numbers(i)
    12. If numbers(i) >= 10 Then
    13. numbers(i) = ToCrossSum(numbers(i))
    14. End If
    15. Next
    16. Array.Reverse(numbers)
    17. Dim result = numbers.Sum
    18. Stop
    19. End Sub
    20. Private Function ToCrossSum(number As Int32) As Int32
    21. If number < 10 Then Return number
    22. Dim sum = 0
    23. Dim n = number
    24. While Not n = 0
    25. sum += n Mod 10
    26. n \= 10
    27. End While
    28. Return sum
    29. End Function
    30. Private Function GenerateNumerics(size As Int32) As Int32()
    31. Dim result = New Int32(size - 1) {}
    32. For i = 0 To result.Length - 1
    33. result(i) = Rand.Next(10)
    34. Next
    35. Return result
    36. End Function
    37. End Module
    Ein Consolen-Testprogramm:

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Module Module1
    4. Sub Main()
    5. Dim zahl As String = "3084331187305570"
    6. Dim L As Integer = zahl.Length - 1
    7. Dim sum As Integer
    8. Dim Arr(L) As String
    9. 'step 1
    10. For i As Integer = 0 To L
    11. If i Mod 2 = 0 Then
    12. Arr(i) = (Convert.ToInt16(zahl.Substring(i, 1)) * 2).ToString
    13. Else
    14. Arr(i) = zahl.Substring(i, 1)
    15. End If
    16. Next
    17. Debug.Print(zahl)
    18. Debug.Print(String.Join("", Arr))
    19. 'step 2
    20. For i = 0 To L
    21. If Arr(i).Length > 1 Then
    22. Arr(i) = (Convert.ToInt16(Arr(i).Substring(0, 1)) _
    23. + Convert.ToInt16(Arr(i).Substring(1, 1))).ToString
    24. End If
    25. Next
    26. Debug.Print(String.Join("", Arr))
    27. 'step 3
    28. For i = 0 To L
    29. sum += Convert.ToInt16(Arr(i))
    30. Next
    31. Debug.Print("Sum = " & sum.ToString)
    32. Debug.Print("Sum Mod 10 = " & (sum Mod 10).ToString)
    33. End Sub
    34. End Module

    bigbase schrieb:

    Ich glaube nicht das das die schönste und code sparendste Option ist.


    Wenn ich einen kleinen Tip geben darf. Arbeite mehr Dotnet-Konform. Solche Threads wie dieser hier dürfen ruhig auch solche Fragen beinhalten. Du arbeitest immer noch mit diesen VB-Altlasten wie Len, Mid, CStr etc. Die würde ich als Erstes mal eliminieren.

    Zur Funktion von deinem Vorhaben vielleicht auch noch schnell eine Kleinigkeit. Ein String ist ein zusammenhängendes Gebilde, das den Vorteil bietet, durch die einzelnen Zeichen durch zu iterieren. Mid oder Substring so finde ich, haben ihren tollen Zweck, aber schlussendlich sind sie eigentlich gar nicht nötig.

    Sofern dir ein solcher String Schwierigkeiten verursacht, dann konvertieren den String einfach in eine Integer-Array. Das lässt sich mit Convert.ToInt32 leicht bewältigen. Einfach von diesen Zwischen-Werten noch den Ascii Index abzählen und schon hast du eine gültige Integer-Array. Irgendwie so.

    VB.NET-Quellcode

    1. ​Dim ArrI32 = MyString.Select(Function(c) Convert.ToInt32(c) - 48).ToArray


    Wenn dir eine Rückwärts-Schleife Schwierigkeiten macht, dann versuche es mit der Revers-Methode wie ich es gemacht habe.

    usw.

    Alle diese kleinen Fragen führen schlussendlich dazu, dass du mit der Zeit viel optimierteren Code produzierst den du vor allem problemlos verstehst. Warum also nicht dieses Forum dazu nutzen, um solche Fragen geklärt zu bekommen. Es gibt hier wirklich sehr gute und kompetente User, die dir sicher gerne gute Tips abgeben.

    Übrigens glaube ich dir, dass du gute Kenntnisse im Umgang mit deinem Vorhaben hast, aber in der Umsetzung der Algos da würde ich auf jeden Fall noch ein paar Tips abholen hier.

    Freundliche Grüsse

    exc-jdbi

    bigbase schrieb:

    Ich glaube nicht das das die schönste und code sparendste Option ist.
    Welchen Teil dieser Deiner Aufgabenstellung erfüllt mein Snippet nicht?

    bigbase schrieb:

    Ich möchte SplitChar alle einzelnen zahlen die darin enthalten sind abwechselnd mit2 und 1 gewichten, beginnend mit 2.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Noch eine Variante:

    VB.NET-Quellcode

    1. Option Strict On
    2. Option Explicit On
    3. Module Module1
    4. Sub Main()
    5. Dim zahl As String = "3084331187305570"
    6. Dim L As Integer = zahl.Length - 1
    7. Dim sum, tmp As Integer
    8. Dim Arr(L) As Integer
    9. For i As Integer = 0 To L
    10. tmp = Asc(zahl(i)) - 48
    11. If i Mod 2 = 0 Then
    12. tmp *= 2
    13. If tmp > 9 Then tmp -= 9
    14. Arr(i) = tmp
    15. Else
    16. Arr(i) = tmp
    17. End If
    18. sum += Arr(i)
    19. Next
    20. Debug.Print("Zahl : " & zahl)
    21. Debug.Print("Step 2: " & String.Join("", Arr))
    22. Debug.Print("Sum = " & sum.ToString)
    23. Debug.Print("Sum Mod 10 = " & (sum Mod 10).ToString)
    24. End Sub
    25. End Module
    kann man noch stark vereinfachen, insbesondere wenn die Schleife Step verwendet:

    VB.NET-Quellcode

    1. Sub Main()
    2. Dim sZahl As String = "3084331187305570"
    3. Dim ArrI32 = sZahl.Select(Function(c) Convert.ToInt32(c) - 48).ToArray
    4. For i = 0 To ArrI32.Length - 1 Step 2
    5. Dim tmp = ArrI32(i) * 2
    6. If tmp > 9 Then ArrI32(i) = tmp - 9
    7. Next
    8. Dim isValid = ArrI32.Sum Mod 10 = 0
    9. Debug.Print("Zahl : " & sZahl)
    10. Debug.Print("Step 2: " & String.Join("", ArrI32))
    11. Debug.Print("Sum = " & ArrI32.Sum)
    12. Debug.Print("Sum Mod 10 = " & isValid)
    13. End Sub
    edit: rechenFehler korrigiert

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Die Lösung ist jetzt natürlich nicht mehr schwer.

    @ErfinderDesRades von dir habe ich eine anonyme Methode erwartet :)

    Meine Lösung ist natürlich nichts mehr besonderes. Würde sicher auch noch mit SelectMany funktionieren.

    VB.NET-Quellcode

    1. ​Dim result = digits.
    2. Select(Function(x, idx) If(idx Mod 2 = 0, x + x, x)).
    3. Select(Function(x, idx) If(idx Mod 2 = 0, If(x >= 10, x - 9, x), x)).
    4. Sum Mod 10 = 0


    Freundliche Grüsse

    exc-jdbi