If mit mehreren Möglichkeiten abkürzen?



  • Ist das schon minimal, Paul?



  • Nein, man könnte jetzt auf Anzahl der gesetzten Bits testen, aber keine Ahnung wie.

    31 Tage ungerade
    30 Tage gerade



  • int wieviele_tage(int monat)
    {
       return monat == 2 ? 28 : (30 + ((1 << (monat - 1)) & 2773));
    }
    


  • 😃 Hast du dir das eben gerade mal so ausgedacht?^^

    Ich komm hier gerade auf:

    return monat==2 ? 28 : 30 + ((monat ^ monat>>3)&1);
    

    Total fehlerhaft 😞
    Edit, jetzt müsste es passen!



  • void days(int month, int year)
    {
      static int lut[2][24] = {
        {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31},
        {31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}
      };
      return lut[(year % 4 == 0) && (year % 400 != 0)][month];
    }
    

    :p



  • Ich mach auch mit:

    "\x1f\x1c\x1f\x1e\x1f\x1e\x1f\x1f\x1e\x1f\x1e\x1f"[month-1]
    

    PS: Ich vermisse den WPC.



  • Bashar, jetzt hab ich wieder was gelernt 😉



  • return "OLONONOONONO"[month-1]-48+(month==2&&!(year%4)&&year%400);
    


  • Die Spaßvögel sollen sich hier mal registrieren, wär gut für die Stimmung 🙂



  • OLONONOONONO schrieb:

    return "OLONONOONONO"[month-1]-48+(month==2&&!(year%4)&&year%400);
    

    Hübsch, aber klappt noch nicht ganz.

    "OLONONOONONO"[month-1]-48+(month==2&&(!(year%4)&&year%100||!(year%400)))
    


  • Ui ui ui, da hat sich ja mal was entwickelt.
    Ich fühle mich dennoch genötigt, den _korrekten_ Spießercode abzuliefern.

    bool IsLeapyear(int year)
    {
    	if(year<1)
    		return false;
    	if(year%4) return false;
    	if(year<=1582) return true;
    	if(year%100) return true;
    	if(year%400) return false;
    	return true;
    }
    int DaysPerMonth(int month, int year)
    {
    	switch(month)
    	{
    		case 1:
    		case 3:
    		case 5:
    		case 7:
    		case 8:
    		case 10:
    		case 12:
    			return 31;
    		case 4:
    		case 6:
    		case 9:
    		case 11:
    		    return 30;
    		case 2:
    			return(28+IsLeapyear(year));
    		default:
    			return 0;
    	}
    }
    

    🙂



  • Michael E. schrieb:

    OLONONOONONO schrieb:

    return "OLONONOONONO"[month-1]-48+(month==2&&!(year%4)&&year%400);
    

    Hübsch, aber klappt noch nicht ganz.

    "OLONONOONONO"[month-1]-48+(month==2&&(!(year%4)&&year%100||!(year%400)))
    

    <krümelkack>
    Das ist nicht portabel, da der C++ Standard kein ASCII erzwingt. Ich glaube, die einzige Garantie, die da gemacht wird, ist, dass '0'+x mit 0<=x<=9 die richtige Dezimalziffer gibt, also dass '0', '1', '2', ..., '9' aufeinanderfolgende char-Werte sind.
    </krümelkack>

    Ich würd's wahrscheinlich mit switch machen. Das ist einfach am leserlichsten. Ich möchte trotzdem eine Lösung zeigen, die wir hier noch nicht gesehen haben:

    template<class T, usnigned N, class U>
    inline bool binary_search(const T(&oa)[N], U x)
    {
      return std::binary_search(oa+0,oa+N,x);
    }
    
    ...
    if (month==2) return 28+isLeapYear(year);
    static const int m30[] = {4,6,9,11};
    return binary_search(m30,month) ? 30 : 31;
    

    @Vicious Falcon: Du weißt, dass return keine Funktion ist und die Klammern um den Ausdruck überflüssig sind, ja?



  • Ja, war ein Copy & Paste-Problem, falsch angefangen und im Folgenden so durchgezogen.
    :xmas1:



  • int wieviele_tage(int monat)
    {
       return ((0xEEFBB3 >> ((monat - 1)*3)) & 0x3) + 28;
    }
    


  • Jetzt fällt mir erst auf, dass das ja bloß ein gepacktes lookup-feld ist 😃



  • (Meep Meep) schrieb:

    int wieviele_tage(int monat)
    {
       return ((0xEEFBB3 >> ((monat - 1)*3)) & 0x3) + 28;
    }
    

    auch nett! das *3 sollte aber wohl ein *2 sein.
    ...fehlt nur noch das Schaltjahr...

    int wieviele_tage(int monat, bool schaltjahr)
    {
       return (((0xEEFBB3+(schaltjahr<<2)) >> ((monat - 1)<<1)) & 0x3) + 28;
    }
    

    🙂


Anmelden zum Antworten