Zahlenkreis Algorithmus



  • a=1
    b=20
    c=5
    d=9

    a, b, c und d sind frei wählbar, wobei für die Menge (M) a <= b gilt und c ∈ M ist. d ist völlig frei wählbar und kann auch -1333 oder 546 sein.

    Ich suche im Moment einen Einzeiler. In mehreren Zeilen ist es kein Problem.



  • Und jetzt nochmal in verständlich, bitte.



  • adamsmith schrieb:

    a=1
    b=20
    c=5
    d=9

    a, b, c und d sind frei wählbar, wobei für die Menge (M) a <= b gilt und c ∈ M ist. d ist völlig frei wählbar und kann auch -1333 oder 546 sein.

    Ich suche im Moment einen Einzeiler. In mehreren Zeilen ist es kein Problem.

    Dein Deutsch verstehe ich nicht.

    Zeig den Mehrzeiler als C++-Code. Das ist dann eine eindeutige Anfrage.
    Falls die Variablen Einschränkungen im Wertebereich haben, schreibe sich auch dazu.



  • int const upper_limit = 30,
                  lower_limit = 10,
                  intervall_size = 20;
    
        int current = 15;
    
        current -= 24;
    
        if( current < 0 )
            current += intervall_size * ( (lower_limit - current) / intervall_size + 1 );
    
        current %= intervall_size;
    

    Kannst du natürlich entsprechend abkürzen wenn die untere Intervallgrenze nur 0 ist.

    Edit: Volkard, kannst gerne raus editieren falls das jetzt nicht nötig war.



  • ((a-2+c+d)%(b-a+1)+b-a+1)%(b-a+1)+1
    


  • Ach, er will Einzeiler! *sigh*



  • meinzeiler schrieb:

    ((a-2+c+d)%(b-a+1)+b-a+1)%(b-a+1)+1
    

    äh, das letzte +1 sollte +a sein. ((a-2+c+d)%(b-a+1)+b-a+1)%(b-a+1)+a



  • camper schrieb:

    foo % -20 ?

    Jetzt habe ich dich. Abgesehen von dem Fragezeichen.
    C++ verwendet die symmetrische Variante des Modulo-Operators:
    a mod m=am(sgn(a)sgn(m)am)a ~mod~ m = a - m * ( sgn(a)sgn(m) \lfloor \frac{|a|}{|m|} \rfloor )

    Sind also sowohl a (-4) als auch m (hier -20) negativ, ergibt sich
    a mod m=am(am)a ~mod~ m = a - m * ( \lfloor \frac{a}{m} \rfloor )
    Allerdings kann a wie in diesem Beispiel kleiner sein als m, daher kann es passieren dass am = 0\lfloor \frac{a}{m} \rfloor ~=~ 0 wird.
    Damit ist das Ergebnis a (-4) - was aber nicht stimmen kann.



  • meinzeiler schrieb:

    meinzeiler schrieb:

    ((a-2+c+d)%(b-a+1)+b-a+1)%(b-a+1)+1
    

    äh, das letzte +1 sollte +a sein. ((a-2+c+d)%(b-a+1)+b-a+1)%(b-a+1)+a

    Der Preis scheint auf den ersten Blick an meinzeiler zu gehen.

    Der Algo scheint zu stimmen. 😉



  • meinzeiler schrieb:

    meinzeiler schrieb:

    ((a-2+c+d)%(b-a+1)+b-a+1)%(b-a+1)+1
    

    äh, das letzte +1 sollte +a sein. ((a-2+c+d)%(b-a+1)+b-a+1)%(b-a+1)+a

    Lol! Dein Algorithmus erzeugt zweimal undefiniertes Verhalten für a=b+1a = b + 1



  • Sone schrieb:

    meinzeiler schrieb:

    meinzeiler schrieb:

    ((a-2+c+d)%(b-a+1)+b-a+1)%(b-a+1)+1
    

    äh, das letzte +1 sollte +a sein. ((a-2+c+d)%(b-a+1)+b-a+1)%(b-a+1)+a

    Lol! Dein Algorithmus erzeugt zweimal undefiniertes Verhalten für a=b+1a = b + 1

    Eine von mir getätigte Randbedingung war ab, dass a <= b sein muss. Deshalb kann a nicht b+1 sein.



  • Sone schrieb:

    meinzeiler schrieb:

    meinzeiler schrieb:

    ((a-2+c+d)%(b-a+1)+b-a+1)%(b-a+1)+1
    

    äh, das letzte +1 sollte +a sein. ((a-2+c+d)%(b-a+1)+b-a+1)%(b-a+1)+a

    Lol! Dein Algorithmus erzeugt zweimal undefiniertes Verhalten für a=b+1a = b + 1

    Bitte zuerst die Aufgabenstellung lesen bevor du antwortest.

    adamsmith schrieb:

    wobei für die Menge (M) a <= b gilt und c ∈ M ist.

    Und erklär mir bitte mal, was "zweimal undefiniertes Verhalten" bedeutet.



  • Randbedingung übersehen, in der Tat - das macht es einfacher, und deinen Code korrekt.

    meinzeiler schrieb:

    Und erklär mir bitte mal, was "zweimal undefiniertes Verhalten" bedeutet.

    Damit meinte ich, dass an zwei Stellen undefiniertes Verhalten erzeugt wird. Natürlich ist es aber in Wirklichkeit nur einmal, da schon nach dem ersten mal das ganze Ergebnis undefiniert wird.

    Ich dachte übrigens auch, a und b sind nicht die Intervallgrenzen sondern...



  • Ich habe den Einzeiler von meinzeiler jetzt schnell noch einmal durchgetestet und er liefert exakt dieselben werde, wie mein Mehrzeiler mit if-else-Bedingung.

    Console.WriteLine(Circle(1, 20, 5, 9));     // 14
    Console.WriteLine(Circle(1, 20, 5, -9));    // 16
    Console.WriteLine(Circle(1, 20, 5, -5));    // 20
    Console.WriteLine(Circle(1, 20, 1, 0));     // 1
    Console.WriteLine(Circle(1, 20, 1, 20));    // 1
    Console.WriteLine(Circle(1, 20, 1, 19));    // 20
    Console.WriteLine(Circle(1, 20, 18, 19));   // 17
    Console.WriteLine(Circle(1, 20, 20, 1));    // 1
    Console.WriteLine(Circle(1, 20, 20, -1));   // 19
    Console.WriteLine(Circle(1, 20, 1, -2));    // 19
    Console.WriteLine(Circle(1, 20, 2, -2));    // 20
    Console.WriteLine(Circle(1, 20, 1, 44));    // 5
    Console.WriteLine(Circle(1, 20, 1, -38));   // 3
    

    Danke! 🙂



  • adamsmith schrieb:

    Ich habe den Einzeiler von meinzeiler jetzt schnell noch einmal durchgetestet und er liefert exakt dieselben werde, wie mein Mehrzeiler mit if-else-Bedingung.

    Aber er ist langsamer und schlechter lesbar.



  • volkard schrieb:

    adamsmith schrieb:

    Ich habe den Einzeiler von meinzeiler jetzt schnell noch einmal durchgetestet und er liefert exakt dieselben werde, wie mein Mehrzeiler mit if-else-Bedingung.

    Aber er ist langsamer und schlechter lesbar.

    Ich dachte, das wäre jetzt eine Spaßaufgabe - du willst das tatsächlich in deiner Anwendung hinschreiben? 😮



  • volkard schrieb:

    adamsmith schrieb:

    Ich habe den Einzeiler von meinzeiler jetzt schnell noch einmal durchgetestet und er liefert exakt dieselben werde, wie mein Mehrzeiler mit if-else-Bedingung.

    Aber er ist langsamer und schlechter lesbar.

    Schlechter lesbar, ja. Aber auch langsamer?

    Hier übrigens der Mehrzeiler von mir.

    int Circle(int a, int b, int c, int d)
    {
        int x = (c + d) % b;
    
        if(x == 0)
        {
            return b;
        }
        else if(x > b)
        {
            return x - b;
        }
        else if(x < 0)
        {
            return b + x;
        }
        else
        {
            return x;
        }
    }
    


  • adamsmith schrieb:

    Hier übrigens der Mehrzeiler von mir.

    int Circle(int a, int b, int c, int d)
    {
        int x = (c + d) % b;
    
        if(x == 0)
        {
            return b;
        }
        else if(x > b)
        {
            return x - b;
        }
        else if(x < 0)
        {
            return b + x;
        }
        else
        {
            return x;
        }
    }
    

    Das ist mal ne gute Grundlage.
    Danke.



  • Sone schrieb:

    Ich dachte, das wäre jetzt eine Spaßaufgabe - du willst das tatsächlich in deiner Anwendung hinschreiben? 😮

    Du Nube sollst noch bescheiden und hilfreich sein. Bitte bitte.



  • volkard schrieb:

    Sone schrieb:

    Ich dachte, das wäre jetzt eine Spaßaufgabe - du willst das tatsächlich in deiner Anwendung hinschreiben? 😮

    Du Nube sollst noch bescheiden und hilfreich sein. Bitte bitte.

    Ok ok.


Anmelden zum Antworten