wpc111
-
wie zählt man die auf einfache art, bzw zählt man da auch ; und , mit?
Hab nämlich auch grad die funktion geschrieben
-
ChockoCookie schrieb:
wie zählt man die auf einfache art, bzw zählt man da auch ; und , mit?
alles wird gezählt. ein token ist was, wo man kein leerzeichen reinschreiben darf, ohne daß es kaputtgeht.
siehe http://www.c-plusplus.net/forum/viewtopic.php?t=70888&highlight=
wir zählen der einfachheit halber aber nicht das, was eh sicher gleich bleibt, also den funktionskopf und die äußeren geschweiften klammern.60
-
volkard schrieb:
60
ich glaube ich bleibe auf den 67 hängen... Wie hast du das gemacht? Ich habe die Auswertung bei der Rückgabe auf ein Minimum verkürzt (19 oder so). Irgendwas mache ich beim auslesen der Operanden und des Operators anscheinend falsch
.
-
MaSTaH. schrieb:
volkard schrieb:
60
ich glaube ich bleibe auf den 67 hängen... Wie hast du das gemacht? Ich habe die Auswertung bei der Rückgabe auf ein Minimum verkürzt (19 oder so). Irgendwas mache ich beim auslesen der Operanden und des Operators anscheinend falsch
.
jo, die ausgabe hat auch bei mir 19.
und unter 71 bin ich eh nur gekommen, weil ihr so unglaublich tiefe zahlen gesagt habt, daß ich in winkelzügen gedacht hab, die sonst nur bashar kann (womit einen verwendete rogrammiertechnik bereits aufgedeckt ist).
dem hörensagen nach sind aber 55 zu schlagen.
-
volkard schrieb:
[..]
jo, die ausgabe hat auch bei mir 19.
und unter 71 bin ich eh nur gekommen, weil ihr so unglaublich tiefe zahlen gesagt habt, daß ich in winkelzügen gedacht hab, die sonst nur bashar kann (womit einen verwendete rogrammiertechnik bereits aufgedeckt ist).
[..]
Ausgabe hat 19? Wow, und ich dachte 21 wäre nicht zu schlagen.
Was sind Winkelzüge? Motivation durch unrealistische Ziele, das klingt gut, kannst du das weiter erläutern?
Noch ne Frage an die Runde:
Kann Eure Version Aufgaben in der Art rechnen: "-3+4" ?
In der Aufgabenstellung stand ja sie möchten Integers haben..
Meine kanns nicht, wie siehts bei euch aus?
-
meine kann auch nicht. ist aber nicht explizit gesagt worden. naja, haben sie wenigstens wieder einen grund volkard zu kicken
.
@volkard: kannst du das nach abgabeschluss mal posten? würde mich jetzt stark interessieren in welchen winkelzügen du gedacht hast.
-
MaSTaH schrieb:
meine kann auch nicht. ist aber nicht explizit gesagt worden. naja, haben sie wenigstens wieder einen grund volkard zu kicken
.
ich hab diesbezüglich angefragt.
<deepak-p@eth.net>: chnisi04.eth.net [202.9.145.104]: >>> DATA <<< 452 chnisi04.eth.net: Server too busy
-
So, 12:00pm Zentralindischer Zeit dürfte vorbei sein
. Habs vor ner halben Stunde abgeschickt! Meine 67-Token-Lösung ist:
int wpc111(char* str) { int a = 0, b = 0, t; while(t = *str++ - 42, t > 5) a *= 10, a += t - 6; while(*str) b *= 10, b += *str++ - 48; return t-- ? a - --t * b : a * b; }
Bin mal gespannt was ihr so fabriziert habt.
-
Ich bin nicht unter 60 Token gekommen:
int wpc111(char* str) { int i = 0, j, op ; // 9 while ( * str ) // 5 i = * str < 48 // 6 ? // 1 op = * str ++ - 44, // 8 j = i , // 4 0 // 1 : // 1 i * 10 + * str ++ - 48 ; // 10 return op + 2 ? j - i * op : j * i ; // 15 // total: 60 tokens }
-
auch 60.
int wpc111(char* str) { int a=0,d;//7 while((d=*str++)>=48)//12 a=a*10+d-48;//10 int b=d?wpc111(str):0;//12 return d-42?a-b*(d-44):a*b;//19 }
-
Meine iterative 66 Token Version:
// first and second number in str // numbers are read into num2, so we must // clear it first. int num1, num2 = 0, // 7 // operator between them op; // 2 // -- // 9 // while not at end of string while ( *str ) // 5 // if current char is an operator.. *str < 48 ? // 5 // ..then save operator, save number, start new number op = *str++, num1 = num2, num2 = 0 : // 14 // .. else it's digit, add next digit and advance in str // *str - 48 to convert from ascii code num2 = num2*10 + *str++ - 48; // 12 // -- // 36 // choose return type from operator return op == 43 ? num1+num2 : // if operator is +, return sum, else.. op == 45 ? num1-num2 : // ..if op == 45 we have a -, else.. num1*num2; // ..return product * // -- // 21
-
Mit sscanf() wär ich auch auf 60
- naja mal basteln
MfG SideWinder
-
MaSTaH schrieb:
würde mich jetzt stark interessieren in welchen winkelzügen du gedacht hast.
da ich auf normalen wegen einfach nicht runterkam, hab ich nur noch überlegt, wo ich rekursion einbringen kann, obwohl rekursion bei diesem problem gar nichts zu suchen hat. ich war sicher, daß ich euch nur noch mit nem abartigen trick schlagen kann. und beim freitagsabendkrimi ist mir es dann gekommen. die funktion kann ja auf "10+12" angewandt 22 ausgeben, indem sie das undokumentierte feature benutzt, daß sie auf "12" angewandt 12 ausgibt.
hat aber nix grbracht, wie ich an den 60 toens von cd9000 sehe.
-
SideWinder schrieb:
Mit sscanf() wär ich auch auf 60
- naja mal basteln
mit sscanf 60?
OMGint wpc111(char* str) { int a,b,c; //7 sscanf(str,"%d%c%d",&a,&b,&c); //16 return b==42 ? a*c : a-c*(b-44); //19 }
es ist sogar legaler C89 code... ob ich das einschicken hätte sollen?
-
Shade Of Mine schrieb:
SideWinder schrieb:
Mit sscanf() wär ich auch auf 60
- naja mal basteln
mit sscanf 60?
OMGint wpc111(char* str) { int a,b,c; //7 sscanf(str,"%d%c%d",&a,&b,&c); //16 return b==42 ? a*c : a-c*(b-44); //19 }
es ist sogar legaler C89 code... ob ich das einschicken hätte sollen?
Bin inzwischen drunter, war bloß meine erste überlegung -> einfachste variante: variablen, sscnaf, switch, return
Also mich nicht sofort aufgeben, danke
MfG SideWinder
-
Sieht hier jemand noch Optimierungsvorschläge? Komme bloß auf 62. Soll die Funktion mehr als ein Mal funktionieren brauch ich sogar 66
int wpc111 (char *str) { static char op ; // 4 int zahl = 0 ; // 5 == 9 while ( * str > 47 ) // 7 zahl = zahl * 10 + * str ++ - 48 ; // 12 == 19 if ( op ) // 4 return zahl ; // 3 op = * str ++ ; // 6 == 13 int zahl2 = wpc111 ( str ) ; // 8 return op == '+' ? zahl + zahl2 : // 9 op == '-' ? zahl - zahl2 : // 8 zahl * zahl2 ; // 4 == 21 == 62 }
MfG SideWinder
-
SideWinder schrieb:
Sieht hier jemand noch Optimierungsvorschläge? Komme bloß auf 62. Soll die Funktion mehr als ein Mal funktionieren brauch ich sogar 66
Jo, muss öfters funktionieren. mach op einfach zu einem int
dein return ist zu lahm, das geht wesentlich kürzer - code siehst du ja hier.
-
Was genau bringt mir op als int?
MfG SideWinder
-
Mit der neuen return bin ich dann auf 62 fix, und 58 für einmalige Benützung. Muss schauen, dass sich das automatisch resetted *g*
Edit: Gut bin jetzt fix auf 60, op ist nun normaler int und ich prüfe nicht mehr ob op bereits gesetzt wurde sondern ob ich am Ende des Strings bin und spare mir deshalb diese Behandlung - fertig.
MfG SideWinder
-
*VERZÄHLT - es sind 67*
59 Tokens:
int wpc111 (char *str) { int zahl = 0 ; // 5 == 5 while ( * str > 47 ) // 7 zahl = zahl * 10 + * str ++ - 48 ; // 12 == 19 if ( ! * str ) // 6 return zahl ; // 3 int op = * str ++ ; // 7 == 16 int zahl2 = wpc111 ( str ) ; // 8 return op == '*' ? zahl * zahl2 : // 9 zahl - zahl2 * ( op - 44 ) ; // 10 == 19 == 59 }
Aber da ist irgendwie noch mehr drin, ich hab das so im Gefühl
MfG SideWinder