Ergebnis 1 bis 10 von 10

Thema: 10 Variablen miteinander vergleichen

Hybrid-Darstellung

Vorheriger Beitrag Vorheriger Beitrag   Nächster Beitrag Nächster Beitrag
  1. #1

    10 Variablen miteinander vergleichen

    Man nehme folgende Situation an.

    V1 besitzt einen Wert X. Die folgenden 9 Variablen (V2, V3, V4, V5, V6, V7, V8, V9, V10) besitzen ebenfalls alle unterschiedliche Werte, wobei es auch sein kann, dass zwei oder mehrere Variablen zufällig den gleichen Wert haben und / oder mit der V1 übereinstimmen.

    Die folgende Abfrage soll nun herausfinden:
    Welche Variablen sind kleiner als V1 und welche der Variablen, die kleiner sind als V1, ist die kleinste?

    Es gibt 10 Varis. V1, V2, V3. V4, V5, V6, V7, V8, V9 und V10. Jede Vari, außer V1, hat einen Switch, der sie überhaupt erst gültig macht, egal welchen Wert sie hat. Ist der zugehörige Switch auf OFF, so wird die betreffende Vari überhaupt nicht erst berücksichtigt. Also S2 aktiviert V2, S3 aktiviert V3, S4 aktiviert S4 etc. pp.

    Beispiel, was der Code machen soll:

    V1=10
    V2=9, V3=11, V4=16, V5=19, V6=22, V7=11, V8=3, V9=4
    S2= ON, S5=ON, S7=ON, S8=ON, S9=ON

    Schritt 1: Welche Vari ist kleiner als V1?

    Nur V2, V5, V7, V8 und V9 werden berücksichtigt, weil ihre zugehörigen Switches laut Bedingung auf ON geschaltet sind. Nun soll verglichen werden welche dieser Varis kleiner ist als V1:

    V2=9, V8=3, V9=4

    Der Rest fällt raus, weil V5 und V7 größer sind als V1.

    Schritt 2: Kleinste Vari erfassen:

    V2=9, V8=3, V9=4. Der Code soll erfassen, welche von den verbleibende Varis die kleinste ist. In diesem Beispiel ist es V8=3

    Konsequenz:

    Die kleinste Vari soll von V1 abgezogen werden, d.h. V1-V8 = 10-3=7

    Das Ergebnis wäre also 7.


    Hier hab ich leider so ziemlich kein Plan wie ich an den Code überhaupt rangehen soll.

    Kann mir jemand von den abgespacten Technik-Freaks vllt nen kurzen Schlag auf den Hinterkopf verpassen und mir ne Anregung geben wie ich hier zum Ziel komme?

    Geändert von TwoFace (22.05.2013 um 01:12 Uhr)

  2. #2
    Pseudo-Code (weil keine Ahnung mehr vom Maker :P):

    Code:
    variable smallest = V1;
    variable smallestPointer = Adresse von V1;
    variable pointer = Adresse von V2;
    loop {
     if (Wert auf den pointer zeigt < smallest) {
      smallest = Wert auf den pointer zeigt;
      smallestPointer = pointer;
     }
     if (Adresse auf die pointer zeigt == Adresse von V10) {
      break;
     }
     Adresse auf die pointer zeigt + 1;
    }
    In smallestPointer steht dann die Adresse der kleinsten Variable drin.
    Ist das einigermaßen verständlich?

  3. #3
    Zitat Zitat von Owly Beitrag anzeigen
    Ist das einigermaßen verständlich?
    Hmm, ich verstehs nicht ganz.

    Wieso das hier:

    Zitat Zitat
    variable smallest = V1;
    variable smallestPointer = Adresse von V1;
    Wie ist das mit dem Pointer gemeint und was ist ein Pointer in dem Fall überhaupt? Einfach die Value einer Variable? Ich hör das in letzter Zeit immer öfter, kann mir darunter aber nicht wirklich was vorstellen. Vielleicht kann das jemand erklären.

    Geändert von TwoFace (21.05.2013 um 19:36 Uhr)

  4. #4
    Unter der Bezeichnung Pointer versteht man in der Programmierung die Adresse eines Datums im Speicher. Man benutzt soetwas zum Beispiel bei der Programmierung mit C und C++.
    Im Maker kann man soetwas simuliert als die ID der Variablen verstehen. Jede Variable hat eine eindeutige Identifikationsnummer (sie sind durchnummeriert) und man kann entweder explizit den Wert einer Variable erfragen oder den Wert einer Variablen an einer Position. Der zweite Fall wäre somit die Nutzung eines "Pointers" auf die Variable.

  5. #5
    Möchtest du eigentlich wirklich eine Liste aller Zahlen, die kleiner als Variable 1 sind oder suchst du nur die kleinste Variable?

    Ich hab jedenfalls Owlys Code mal an den Maker angepasst:

    Zitat Zitat von EasyEventExporter, von mir editiert ;-)
    - SCRIPT -
    <> Change Variable: VAR KleinsterWert = VAR Variable1
    <> Change Variable: VAR PositionKleinsterWert = 1
    <> Change Variable: VAR Zähler = 2
    <> Loop
    . <> Change Variable: VAR Testwert = Variable[@Zähler]
    . <> Fork Condition: If VAR Testwert < VAR KleinsterWert then ...
    . . <> Change Variable: VAR KleinsterWert = Variable[@Zähler]
    . . <> Change Variable: VAR PositionKleinsterWert = VAR Zähler
    . . <>
    . : End of fork
    . <> Change Variable: VAR Zähler += 1
    . <> Fork Condition: If VAR Zähler == 11 then ...
    . . <> Break Loop
    . . <>
    . : End of fork
    . <>
    : End of loop

  6. #6
    Ich habe es im 2K versucht, aber das Ding ist nichts mehr für mich. Irgendwo steckt in meinem Code der Wurm:

    Zwei von drei mal sortiert er richtig. Keine gute Quote.

    Edit:
    Oh, ich bin langsam. :P

  7. #7
    Mir scheint, dass mein Anliegen missverstanden wurde. Ich hab mein Problem allerdings auch zu schwammig formuliert und zuviele Details weggelassen, daher hab ich beschlossen, euch ein Zahlenbeispiel zu geben, das beschreibt, was genau der Code eigentlich tun soll mit zusätzlichen Konkretisierungen, die im Code eine Rolle spielen. Verzeiht, das Problem ist nicht so oberflächlich zu beschreiben wie ich zuerst dachte. Also:

    Es gibt 10 Varis. V1, V2, V3. V4, V5, V6, V7, V8, V9 und V10. Jede Vari, außer V1, hat einen Switch, der sie überhaupt erst gültig macht, egal welchen Wert sie hat. Ist der zugehörige Switch auf OFF, so wird die betreffende Vari überhaupt nicht erst berücksichtigt. Also S2 aktiviert V2, S3 aktiviert V3, S4 aktiviert S4 etc. pp.

    Beispiel, was der Code machen soll:

    V1=10
    V2=9, V3=11, V4=16, V5=19, V6=22, V7=11, V8=3, V9=4
    S2= ON, S5=ON, S7=ON, S8=ON, S9=ON

    Schritt 1: Welche Vari ist kleiner als V1?

    Nur V2, V5, V7, V8 und V9 werden berücksichtigt, weil ihre zugehörigen Switches laut Bedingung auf ON geschaltet sind. Nun soll verglichen werden welche dieser Varis kleiner ist als V1:

    V2=9, V8=3, V9=4

    Der Rest fällt raus, weil V5 und V7 größer sind als V1.

    Schritt 2: Kleinste Vari erfassen:

    V2=9, V8=3, V9=4. Der Code soll erfassen, welche von den verbleibende Varis die kleinste ist. In diesem Beispiel ist es V8=3

    Konsequenz:

    Die kleinste Vari soll von V1 abgezogen werden, d.h. V1-V8 = 10-3=7

    Das Ergebnis wäre also 7.


    Ich hoffe es wird nun verständlicher was ich meine. Das Problem ist simpel, mit dem Maker allerdings nicht so leicht zu lösen. Zumindest finde ich keinen Ansatz.

    Geändert von TwoFace (22.05.2013 um 01:11 Uhr)

  8. #8
    Switches lassen sich nicht "anpointern" und sind fürs Scripten daher unbrauchbar.

  9. #9
    Vorab solltest du die Idee mit den Switches schonmal vergessen. Es gibt einen simpleren Weg, statt auf einen SwitchPointerPatch zu warten: Werte, die nicht abgefragt werden sollen, mit -1 multiplizieren (bei Erhöhung/Senkung im Hintergrund aber Minus statt Plus, um den Betrag zu erhöhen usw.).

    Zitat Zitat von EasyEventExporterEdit
    - VarCheck -

    <> Change Variable: [0021 Check_Target] Set 1
    <> Change Variable: [0022 Check_ID_First/Now] Set 1
    <> Change Variable: [0023 Check_ID_Last] Set 10
    <> Change Variable: [0024 Check_Value_Memory] Set Var[V[0021]] Value
    <> Change Variable: [0025 Check_ID_Memory] Set 0
    <> Label: 1
    <> Fork Condition: If Variable [0022 Check_ID_First/Now] is V[0021] Not
    <> Change Variable: [0026 Check_Value] Set Var[V[0022]] Value
    <> Fork Condition: If Variable [0026 Check_Value] is 0 or more
    <> Comment: Jede Var mit negativem Wert wird nicht berücksichtigt.
    <> Fork Condition: If Variable [0026 Check_Value] is V[0024] Less/Equal
    <> Change Variable: [0024 Check_Value_Memory] Set Var[V[0022]] Value
    <> Change Variable: [0025 Check_ID_Memory] Set Var[0022]'s Value
    <>
    : End
    <>
    : End
    <>
    : End
    <> Fork Condition: If Variable [0022 Check_ID_First/Now] is V[0023] Not
    <> Change Variable: [0022 Check_ID_First/Now] + 1
    <> Jump To Label: 1
    <>
    : End
    <> Fork Condition: If Variable [0025 Check_ID_Memory] is 0 Not
    <> Change Variable: [0026 Check_Value] Set Var[V[0021]] Value
    <> Show Message: Var.No \v[0021] (hat den Wert \v[0026]) wird um \v[0024] subtrahiert.
    <> Change Variable: [0026 Check_Value] - Var[0024]'s Value
    <> Show Message: Das Ergebnis ist \v[0026].
    <> Comment: Send Value of V[0026]
    : oder:
    :
    : Variable Oper: [V[0021]] Set, Var V[0026]'s Value
    <>
    : Else Handler
    <> Show Message: Alle geprüften Werte sind größer als das Ziel.
    <>
    : End
    <>
    Es werden alle Werte zwischen ID_First und ID_Last mit der Var-ID in Check_Target verglichen. Alles mit einem Wert unter Null bleibt draußen. Bei gleichen kleinsten Zahlen wird der letzte erfasste Wert genommen.

    Zum Thema "Variablen liegen verstreut herum": verpasse den genutzten Variablen einen Pseudo-Header. Zum Bsp. zu nutzende Werte um +7 000 000 erhöhen, Fork Cond. if V[xxxx] is 7 000 000 or more um zugewiesene Variablen zu erkennen, dann -7 000 000 gefolgt von allen Berechnungen und Abfragen, am Ende wieder +7 000 000. Oder was auch immer für Erkennungsmuster, die in keiner anderen Variable je erreicht werden.

  10. #10
    bugmenot: Ich versteh deinen Code zwar nicht ganz d.h. ich kann deinen Code schlecht mit deiner Erklärung verknüpfen, aber ich werd ihn mal so testen, wie dus mir geraten hast. Danke dafür.

    Die Idee, Varis, die nicht berücksichtigt werden sollen, durch "x(-1)" rauszusortieren, find ich gut. Wär ich jetz auch nich so wirklich draufgekommen. Vllt krieg ich mit dem Ansatz ja auch nen eigenen Code hin. Wird heut mal versucht.

    Corti: Hab auch nicht vor die Switches anzupointern. Jede Vari hat einen Switch zugeordnet bekommen. Es macht ja keinen Sinn, Werte in die Rechnung mit einzubeziehen, die laut Spiel noch gar nicht gelten dürfen. Das regelt der jeweilige Switch.

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •