wpc115
-
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 habeint 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! }
-
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

-
Na hoffentlich ist er auch fehlerfrei

@TomasRiker
Dein Code findet "alaal" nicht in "alalaal"Mein Versuch:
int wpc115(char *master, char *pattern) { // remember where we started char* oldpattern = pattern, *oldmaster = master; // now test against the pattern // make sure master always points one after the last checked character while(*pattern && *pattern == *master++) ++pattern; // If *pattern is now NUL, we've found our substring. return // add 1 if we've found our substring !*pattern + // don't search further if master is empty (*master // if pattern was found, continue search after the substring // else continue one char after the original master string so we don't miss some substrings ? wpc115(*pattern ? ++oldmaster : master, oldpattern) : 0); } // a simple test case #include <cassert> #define test(a,b,c) assert(wpc115(a, b) == c); int main(int argc, char* argv[]) { test("babab", "bab", 1); test("xbababx", "bab", 1); test("babbab", "bab", 2); test("ababababa", "bab", 2); test("hallo welt", "l", 3); test("blablala", "blal", 1); test("blablalal", "blal", 1); test("alalaal", "alaal", 1); test("ababc", "abc", 1); test("abc", "abc", 1); test("abc", "acb", 0); test("a", "a", 1); test("a", "b", 0); return 0; }
-
@tag:
Danke für den Hinweis.
Und danke für Deinen Testcode.
Also, mein neuester Versuch besteht alle Tests...
PS: Die Strg-Taste hilft in Visual C++ beim Zählen der Tokens!
Einfach gedrückt halten und mit den Cursortasten zwischen den Tokens navigieren.
-
@tag: du kannst noch zwei klammern weglassen
[Nachtrag]
Meine Loesung hat 50 Tokens. In die Tests die ich gemacht hab, sind alle
erfolgreich durchgelaufen. Aber ob ichs einschicken werden...mal sehn
[/Nachtrag]mfg
v R
-
welche Klammern denn? die beim ?: sind notwendig, weil das + eine höhere Priorität hat, die kriege ich nicht weg
-
@Windalf: Wo gabs das hier denn erst vor kurzem? Ich find nix.
@ShadeOfMine: Dein erster Tipp bringt nicht ne Menge, sondern ein Token (wenn '\0' nur als ein Token zählt, wie jemand in #cpp meinte).
Sorry, kann nur wenig ins Internet, deshalb antworte ich nicht öfter.
PS: Ich hab noch nicht weiter optimiert, das kommt aber noch.
-
CME386 schrieb:
(wenn '\0' nur als ein Token zählt, wie jemand in #cpp meinte)
Ist nur eins. Schliesslich kannst du nicht \ 0 schreiben.