wpc108



  • http://www.geocities.com/acmesofties/wpcq.htm

    #include <iostream>
    #include <algorithm>
    #include <cmath>
    using namespace std;
    
    int wpc108sec(int* low,int* high,int num,int key)
    {
    	int count = 0 ;//5
    	for ( int i = 0 ; i != num ; ++ i )//14
    		if ( low [ i ] <= key && key <= high [ i ] ) //16
    			++ count ;//3
    	return count ;//3
    }//41
    
    int wpc108(int* low,int* high,int num,int key)
    {//hier bitte basteln
    	int count = 0 ;//5
    	for ( int i = 0 ; i != num ; ++ i )//14
    		if ( low [ i ] <= key && key <= high [ i ] ) //16
    			++ count ;//3
    	return count ;//3
    }//41
    
    int main()
    {
    	int const SIZE=100;
    	int low[SIZE];
    	int high[SIZE];
    	for(int o=0;o!=100000;++o)
    	{
    		for(int i=0;i!=SIZE;++i)
    		{
    			low[i]=rand();
    			high[i]=rand();
    			if(low[i]>high[i])
    				swap(low[i],high[i]);
    		}
    		int key=rand();
    		int x1=wpc108sec(low,high,SIZE,key);
    		int x2=wpc108(low,high,SIZE,key);
    //		cout<<x1<<'\t'<<x2<<endl;
    		if(x1!=x2)
    		{
    			cout<<"fehler!";
    			return 1;
    		}
    	}
    	return 0;
    }
    


  • Morgen!

    Gut dass du das Thema hier eröffnest, ich habe nämlich zwei Fragen zu der 108:

    Main criterion of judging: Code Brevity

    What's that? Alles ohne Whitespaces und ganz kurze Variablennamen und zehn Befehle in eine Zeile oder was?
    Mh, ich sehe du zählst die Anzahl der Tokens.. gute Idee!

    The function should return the number of ranges, among the num ranges, {(low[0], high[0]), (low[1], high[1])... (low[num-1], high[num-1])}in which key falls.

    Bist du dir sicher dass du das mit deinem return count richtig erfasst? (wie es besser geht wüsste ich aber auch nicht 😉

    Ist irgendwie komisch formuliert die Aufgabenstellung.



  • Code Brevity zielt nur auf die Tokens ab, nicht auf Whitespaces, Kommentare oder Längen von Variablennamen.



  • int wpc108sec(int* low,int* high,int num,int key) 
    {
        int count = 0, i = num ;//9
        while(i--) //5 
            if ( low [ i ] <= key && key <= high [ i ] ) //16 
                ++ count ; //3 
        return count ; //3 
    } //36
    


  • Ich finde das nimmt jetzt aber den Spaß daraus wenn man die möglichen Lösungen öffentlich diskutiert... BTW: Ich bin bei 34 Tokens :p



  • MaSTaH schrieb:

    BTW: Ich bin bei 34 Tokens :p

    int wpc108sec(int* low,int* high,int num,int key)
    {
        int count = 0;//5
        while ( num -- ) //5
          count += low [ num ] <= key && key <= high [ num ] ; //16
        return count ; //3
    } //29
    

    Keine Ahnung, ob das so funktioniert (ungetestet).

    Muss die Funktion mehrmals aufgerufen werden können oder darf man die so schreiben, dass sie nach dem ersten Aufruf nicht mehr funktioniert?



  • Meins sieht ähnlich aus (30 Tokens)... Man könnte oben noch "static int c;" schreiben um ein Token zu sparen, dann würde man aber Probleme beim zweiten Aufruf bekommen.



  • Das ist meins

    int wpc108sec(int* low, int* high, int num, int key)
    {
        int c = 0; // 5
        while ( num -- ) // 5
          low [ num ] <= key && key <= high [ num ] && ++ c; // 17
        return c ; //3
    } // 30
    

    beziehungsweise (falls erlaubt)

    int wpc108sec(int* low, int* high, int num, int key)
    {
        static int c; // 4
        while ( num -- ) // 5
          low [ num ] <= key && key <= high [ num ] && ++ c; // 17
        return c ; //3
    } // 29
    

    die kürzeste Version die einmal funktioniert ist (inspiriert von deiner)

    int wpc108sec(int* low, int* high, int num, int key)
    {
        static int c; // 4
        while ( num -- ) // 5
          c += low [ num ] <= key && key <= high [ num ]; // 16
        return c ; //3
    } // 28
    

    ist aber bestimmt nicht erlaubt.

    Deine Version funktioniert (EDIT: bin mir aber nicht sicher ob true immer garantiert 1 oder verschieden von 0 sein muss), aber ich bekomme das noch kürzer. Mal überlegen... 😃



  • Mir ist noch was eingefallen... ist aber mit Sicherheit auch verboten! Wo kann man die Regeln für die einzelnen Kategorien (in dem Fall "code brevity") nachlesen? In den FAQs steht da nicht genaues zu.

    int wpc108sec(int* low, int* high, int num, int key, int c = 0)
    {
        while ( num -- ) // 5
          c += low [ num ] <= key && key <= high [ num ]; // 16
        return c ; //3
    } // 24
    


  • MaSTaH schrieb:

    Mir ist noch was eingefallen... ist aber mit Sicherheit auch verboten! Wo kann man die Regeln für die einzelnen Kategorien (in dem Fall "code brevity") nachlesen? In den FAQs steht da nicht genaues zu.

    int wpc108sec(int* low, int* high, int num, int key, int c = 0)
    {
        while ( num -- ) // 5
          c += low [ num ] <= key && key <= high [ num ]; // 16
        return c ; //3
    } // 24
    

    sie versuchen, leute rauszukicken. mit unter umständen völlig abstrusen gründen. mangelde ernsthaftigkeit zum beispiel. oder daß sie gepackte sachen nicht annehmen können.
    es war nicht aufrufbarkeit gefordert, sondern explizit ein prototyp angegeben. die abweichung reicht denen betimmt als grund.
    und das static-ding ist einfach falsch.

    übrigens steht "sec" für secure (sicher) oder so und ist die referenzimplemetierung. die andere verfummele ich immer und teste mit der main, ob auch ja kein fehler ist.

    alle regeln kann man nicht nachlesen. sie erfinden auch gerne neue, um mich zu kicken. bestimmt schon 5 mal. wenn jemand ne neue regel erfährt, soll er sie doch bitte hier posten.



  • Mastah:
    ich sehe die Kuerzung nicht.
    Du hast naemlich vergessen das
    ,int c=0
    mitzuzaehlen.



  • 27



  • volkard schrieb:

    27

    auf 27 komme ich nur, wenn key unsigned ist 😞
    sonst bin ich auf 28



  • volkardus schrieb:

    es war nicht aufrufbarkeit gefordert, sondern explizit ein prototyp angegeben. die abweichung reicht denen betimmt als grund.

    Denke ich auch

    volkardus schrieb:

    und das static-ding ist einfach falsch.

    Ja, aber nur, wenn sie öfter als einmal aufgerufen wird.



  • Shade Of Mine schrieb:

    Mastah:
    ich sehe die Kuerzung nicht.
    Du hast naemlich vergessen das
    ,int c=0
    mitzuzaehlen.

    Sieh es einfach als billigen Trick an :).



  • Wie seht ihr das? Wäre die Variante von cd9000 mit dem count += expression legal?



  • MaSTaH schrieb:

    Wie seht ihr das? Wäre die Variante von cd9000 mit dem count += expression legal?

    warum sollte es nicht legal sein?



  • EDIT: Ok, hab es schon selber geklärt



  • MaSTaH schrieb:

    Deine Version funktioniert (EDIT: bin mir aber nicht sicher ob true immer garantiert 1 oder verschieden von 0 sein muss), aber ich bekomme das noch kürzer. Mal überlegen... 😃

    die acme softies sind nichzt standard-fixiert. wenn's auf jedem 'normalen' compiler klappt, nehmen die es. mal hab ich ne siegerlösung gesehen, die davon ausging, daß ein ascii-zeichensatz drunterliegt.
    man fliegt übrigens, wenn man ne standard-lösung bringt, die der msvc nicht compiliert.



  • int wpc108(int* low, int* high, int num, int key) 
    { 
        int count = 0; // 5 
        while ( num -- ) // 5 
          count += key >= *low++ && key <= *high++; // 14 
        return count; //3 
    } // 27
    

Anmelden zum Antworten