wpc115



  • Hallo,

    ich versuch mich grad an wpc115. Für alle, die den Link nicht haben, hier ist er noch mal. Auf wie viel Tokens kommt ihr? Kann ich meins noch verbessern?

    #include <iostream>
    using namespace std;
    
    int wpc115(char *master, char *pattern)
    {
    	int counter=0, i=0;						//  9 ->  9
    
    	while(master[i]!='\0')					//  9 -> 18
    	{										//  1 -> 19
    		int j=0;							//  5 -> 24
    		while(master[i+j]==pattern[j])		// 14 -> 38
    		{									//  1 -> 39
    			++j;							//  3 -> 42
    			if(pattern[j]=='\0')			//  9 -> 51
    			{								//  1 -> 52
    				++counter;					//  3 -> 55
    				break;						//  2 -> 57
    			}								//  1 -> 58
    			if(master[i+j]=='\0')			// 11 -> 69
    				return counter;				//  3 -> 72
    		}									//  1 -> 73
    		++i+=j;								//  5 -> 78
    	}										//  1 -> 79
    
    	return counter;							//  3 -> 82
    }
    
    int main()
    {
    	cout << wpc115("Ich bin hmmkljachsödflcfj", "c");
    	return 0;
    }
    


  • das hatten wir doch letzten gerade erst
    ich würds so machen

    int wpc115(char* master,char* pattern){ 
    int rv=0;
    char *q,*r; 
        while(*master++){ 
            for(r=pattern,q=master;*r&&*q;++r,++q) 
                if(*r-*q)break; 
            if(!*r)++rv; 
        } 
    return rv; 
    }
    


  • Windalf schrieb:

    int wpc115(char* master,char* pattern){ 
    int rv=0;
    char *q,*r; 
        while(*master++){ 
            for(r=pattern,q=master;*r&&*q;++r,++q) 
                if(*r-*q)break; 
            if(!*r)++rv; 
        } 
    return rv; 
    }
    

    Das ist aber nicht richtig. das while(*master++) bricht dir das genick. denn dann damit übergehst du master[0] bei den vergleichen...

    von den anderen kritikpunkten lasse ich mal ab 😉

    PS: IIRC habe ich 54. in #cpp gibts glaub ich leute mit 48 oder 46

    kleiner tipp:
    if(master[i+j]=='\0') // 11 -> 69
    return counter;
    das sind _enorm_ viele token.
    if(!master[i+j]) kürzt es schon enorm.
    das [i+j] ist auch noch verdammt viel. also nehmen wir laufende zeiger oder versuchen das +j wegzubekommen oder sonstwas...



  • @Shade
    jo stimmt hab mir keine mühe gegeben und nur den alten code von dem mystrstr aus dem forum kopiert...
    und da kommt auch schon der patch 😃

    int wpc115(char* master,char* pattern){ 
    int rv=0;
    char *p,*q; 
        for(;*master;++master){ 
            for(p=pattern,q=master;*p&&*q&&*p==*q;++p,++q); 
            if(!*p&&++rv)master=q-1;
        } 
    return rv; 
    }
    

    ps mit der whileschleife fand ich den code optisch ansprechender... mal gucken ob mir noch was einfällt um die geschweiften klammern der äusseren forschleife wegzubekommen

    ach so kannst du mir mal erklären was eigentlich genau ziel bei der aufgabe ist.. hab ich irgendwie noch nicht ganz gepeilt... Also die funktion müsste jetzt machen was sie soll aber wie genau ist ein token definiert? und von den teilen soll man ja wenige haben oder?



  • ok die klammer hab ich wegbekommen

    int wpc115(char* master,char* pattern){ 
    int rv=0;
    char *p,*q; 
    for(;*master;!*p&&++rv?master=q:++master) //das dumme dabei ist das man p eigentlich auf was zeigen lassen muss was ungleich 0 ist...
        for(p=pattern,q=master;*p&&*q&&*p==*q;++p,++q); 
    
    return rv; 
    }
    


  • Windalf schrieb:

    ach so kannst du mir mal erklären was eigentlich genau ziel bei der aufgabe ist..

    strstr zu implementieren. nur statt einem zeiger auf das erste vorkommen, gibst du die anzahl der vorkommen zurück. pattern dürfen sich dabei nicht überschneiden.
    dh
    "babab" und "bab" liefert 1 und nicht 2

    wie genau ist ein token definiert?

    Ein token ist einfach ein token, wie es C++ definiert.

    int aba;
    sind 3 token.
    int | aba | ;

    a++ - 13;
    ist
    a | ++ | - | 13 | ;

    if(ab == cd) { continue; }
    if | ( | ab | == | cd | ) | { | continue | ; | }

    sowas ist viel besser als ascii zeichen zählen. so kann man nämlich wenigstens ein bisschen lesbarkeit bieten 🙂

    btw: kommentare sind gratis. dh sie zählen als 0 token

    und von den teilen soll man ja wenige haben oder?

    exakt. AFAIK gilt es 46Token zu unterbieten



  • hmm ich hoffe das hab ich jetzt gepeilt...
    guck mal bitte nach ob ich bei mir diese tokens bei mir richtig zähle
    und es dann auch wirklich begriffen habe

    int wpc115(char* master,char* pattern){ 
    int rv=0;  //<-5
    char *p,*q; //<-5+7
    for(;*master;!*p&&++rv?master=q:++master) //<-12+19 
        for(p=pattern,q=master;*p&&*q&&*p==*q;++p,++q); //<-31+29
    
    return rv; <-60+3 =63 das sind ja belastend viele...
    }
    


  • In deiner ersten for-Schleife sind 20?!

    Tip: Einfach immer alles brav auseinander schreiben:

    for ( ; * master ; ! * p && ++ rv ? master = q : ++ master )
    

    MfG SideWinder



  • Hier mein Code.
    Wenn ich mich nicht verzählt habe, sind es ebenfalls genau 46 Tokens.

    int wpc115(char* master,
               char* pattern)
    {
        char * patternBackup = pattern ; // backup the original pattern pointer
    
        while ( * master ) // while the end of the master string is not reached ...
        {
            if ( * pattern ++ != * master ++ ) pattern = patternBackup ;    // compare one character. if mismatch, reset the pattern pointer and proceed.
            if ( ! * pattern ) return 1 + wpc115 ( master , patternBackup ) ; // if end of pattern string is reached, we have found one occurrence. recursively search the rest of the master string.
        }
    
        return 0 ; // no occurrence found!
    }
    


  • @TomasRiker:

    Aber was machst du wenn du
    "abc" in "ababc" suchst?

    ich habe keinen compiler hier, aber das scheint dein code nicht zu decken, oder?



  • Kann pattern "" sein?



  • Hmm, hast recht, komischerweise ging es zuvor noch.
    Ich habe wohl etwas viel optimiert 😃
    Mit Korrektur sind es 6 Tokens mehr.



  • hmm also gegen die rekursive lösung scheint kaum eine ankommen drin zu sein... oder hat einer ne iterative lösung mit rund 50 tokens?



  • Windalf schrieb:

    hat einer ne iterative lösung mit rund 50 tokens?

    54

    und ne illegale (wegen strstr und strlen) von wesentlich weniger tokens 😉

    @tag:
    sicher bin ich mir nicht. aber ich wüsste nicht was ein leerer pattern string bringen sollte. ich nehme deshalb an, dass er nicht leer sein darf. würde nämlich so ziemlich jeden code fehlschlagen lassen.



  • hmm also alle meine versuche bringen mich nicht wirklich weiter...

    bei der von Striker könnte man sowas in der art versuchen was nochmal ein wenig zeichen spart...

    int wpc115(char* master, char* pattern){
    
        char * patternBackup = pattern; 
    
        while(* master && *pattern)
    		* pattern ++ != * master ++ && (pattern = patternBackup) ;    
    	return * pattern ? 0 : 1 + wpc115 ( master , patternBackup );   
    }
    


  • Wer ist Striker?
    Meine Lösung oben war ja leider fehlerhaft.
    Jetzt habe ich eine mit 49.



  • Ich habe 47 Tokens.

    Aber ist es wirklich Sinn des Wettbewerbs seine Lösung hier zu posten?
    Sollte man das nicht besser erst nach Teilnahmeschluss machen?
    Nur so ne Idee..



  • Wer ist Striker?

    ups sorry, wollte dein nick nicht durch den kakao ziehen, war ein kleines Malheur...
    jo hab die ganze zeit versucht was brauchbar iteratives hinzubekommen aber gegen die rekusion hat man in diesem falle einfach keine chance...
    hatte mir dann halt nochmal deine Lösung angeguckt und festgestellt das bei dem return noch was zu holen ist und man sich die geschweiften klammern sparen kann...

    Aber ist es wirklich Sinn des Wettbewerbs seine Lösung hier zu posten

    gibts denn was zu gewinnen? glaub eher nicht also was hab ich davon wenn ich die Lösung zurückhalte... Macht doch eher mehr spass mit anderen zusammen die Lösung zu entwickeln...



  • also, wenn ich mich nicht vertan hab, dann bin ich auf 44.
    und bei leerem pattern wird 0 zurückgegeben.



  • ups, ich meinte 39 😉


Anmelden zum Antworten