wpc111



  • 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?
    OMG

    int 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?
    OMG

    int 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



  • kann es sein, dass du dich verzählt hast?



  • Öhm eigentlich sollte mir das nicht passiert sein, aber ich zähl nochmal nach zur Sicherheit

    Edit: omg stimmt, die 8 hab ich vergessen 😞 - dann heißts weiter basteln

    Edit2: Aber viel mehr ist aus meiner denkweise nicht mehr rauszuholen, muss ich also noch schauen ob mir noch ein neuer Denkansatz einfällt der nicht bereits genannt wurde.

    Wenn tatsächlich 55 zu schlagen sind... *es sei denn das ist wieder bloß volkards unmögliches Ziel für Motivation*

    MfG SideWinder


Anmelden zum Antworten