Ansatz um zusammenhängende Zahlen zu erkennen

  • Hallo!

    ich sitze an einem AutoIt Skript und traf auf folgende Problemstellung:

    Es werden Variablen bel. ganzzahlige Werte zwischen 2 und 14 übergeben. Als nächstes soll überprüft werden ob die Zahlen zusammenhängend sind.
    Also zum Beispiel:

    $Var1 = 5 $Var2 = 7 $Var3 = 4 $Var4 = 6 $Var5 = 3

    Da sollte nun True rauskommen wegen 3 4 5 6 7.

    Zusätzlich sollen auch "Lücken" erkannt werden. Zum Beispiel: 3 4 5 7 8 (Die "Lücke" zwischen 5 und 7)

    Hätte jemand einen Ansatz, wie sich dies realisieren lassen könnte? Für jeden Tipp wär ich sehr dankbar!

    Einmal editiert, zuletzt von johnny2011 (29. Dezember 2011 um 01:31)

  • Ähm ...
    Du solltest lieber einen Array nehmen, das macht sich wirklich besser (spart variablen !)
    Zudem könntest du den ja auch ordnen, oder willst du am Ende keine Ordnung haben ?

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal

  • Probiere es mal damit:

    [autoit]


    $Var1 = 1
    $Var2 = 2
    $Var3 = 3
    $Var4 = 4
    $Var5 = 6

    [/autoit][autoit][/autoit][autoit]

    $i = 2
    $previous = Execute("$Var1")
    Do
    $current = Execute("$Var" & $i)
    If $current <> $previous + 1 Then
    MsgBox(16, "Fehler", "Keine Folge")
    Exit
    Else
    $previous = $current
    EndIf
    $i += 1
    Until Not IsDeclared("Var" & $i)

    [/autoit][autoit][/autoit][autoit]

    MsgBox(64, "Information", "Ist eine Folge!")

    [/autoit]


    Macht so keinen Sinn eine Zahlenfolge zu prüfen, aber egal...


    Gruß,
    UEZ

    Auch am Arsch geht ein Weg vorbei...

    ¯\_(ツ)_/¯

  • Meine erste Intuition:

    Spoiler anzeigen
    [autoit]


    #include <Array.au3>

    [/autoit] [autoit][/autoit] [autoit]

    Global $num [8] = [1,2,3,4,8,6,7,8]
    $wrong = ""

    [/autoit] [autoit][/autoit] [autoit]

    For $x = 0 To UBound($num)-2
    if $num [$x]+1 <> $num[$x+1] then
    $num [$x+1] = $num[$x]+1
    $wrong &= "|" & $x+2
    endif
    Next

    [/autoit] [autoit][/autoit] [autoit]

    $wrong = StringSplit($wrong,"|") ; $wrong [0] - 1 = Anzahl der falschen Werte und $wrong [n] = Stelle der falschen Zahl
    _ArrayDisplay($wrong)

    [/autoit]

    Musste noch ein bisschen anpassen. Das Anfangs Array zerstöre ich in meinem Algorithmus, müsste man also Klonen oder einen andere Methode finden.

  • Hi,
    schreibe die Zahlen in ein Array, welches du dann sortieren kannst

    [autoit]

    _arraysort()

    [/autoit]


    Dann durchsuche das Array nach den Lücken.

    Spoiler anzeigen
    [autoit]

    #include <Array.au3>
    Dim $a[1]
    While 1
    $w = InputBox("Zahl eingeben", "Zahlen zw. 1 und 14", "")
    If $w = "" Or @error Then ExitLoop
    ReDim $a[UBound($a) + 1]
    $a[UBound($a) - 1] = Int(Number($w))
    ConsoleWrite('@@ Debug(' & @ScriptLineNumber & ') : $w = ' & $w & @CRLF & '>Error code: ' & @error & @CRLF) ;### Debug Console
    WEnd

    [/autoit] [autoit][/autoit] [autoit]

    _ArrayDisplay($a)
    _ArraySort($a)
    _ArrayDisplay($a)
    _ArrayUnique($a)
    _ArrayDisplay($a)

    [/autoit] [autoit][/autoit] [autoit]

    $string = $a[0]
    For $i = 1 To UBound($a) - 1
    If $a[$i] - 1 = $a[$i - 1] Then
    $string &= $a[$i] & " "
    Else
    $string &= " Lücke " & $a[$i] & " "
    EndIf
    Next
    MsgBox(0, 0, $string)

    [/autoit]
  • deshalb schrieb ich ja du könntest es mit arrays machen, war mein erster gedanke mit ArraySort, da ich aber net wusst was du machst hab ich das fpr mich bealten

    Es gibt sehr viele Leute, die glauben. Aber aus Aberglauben.
    - Blaise Pascal