Contest: 19 August 2008 - 21 August 2008



  • Ich installier mir grad windows, so dass ich den contest trotzdem durchführen kann



  • #include <cstdio>
    
    int Rom(int ein, int teiler, char rom){
    	int temp, i;
    	temp = ein / teiler;
    	if(temp){
    		for(i = 0; i < temp; i++)
    			 putchar(rom);
    		return ein % teiler;
    	}else
    		return ein;
    }
    
    int main(){
    	int eingabe = 0, i;
    	int teiler[] = {1000, 500, 100, 50, 10, 5, 1};
    	char rom[] = {'M', 'D', 'C', 'L', 'X', 'V', 'I'};
    	scanf("%u", &eingabe);
    
    	for(i = 0; i < 7; i++){
    		eingabe = Rom(eingabe, teiler[i], rom[i]);
    	}
    	putchar('\n');
    	return 0;
    }
    

    Sorry, hab nen Fehler mit dem Teiler gemacht... 👎



  • So, hier mal kurz der Zwischenstand:
    1. zwutz & styx (16,2KB)
    2. camper (477KB)
    3. LittleGamer3 (478KB)

    Hinweis:
    Die Executables wurden unter windows kompiliert



  • solltest mal lernen wie man den compiler richtig einstellt.



  • LittleGamer3 schrieb:

    2. camper (477KB)
    3. LittleGamer3 (478KB)

    nicht dein Ernst, oder?



  • du boone schrieb:

    solltest mal lernen wie man den compiler richtig einstellt.

    Schreibs doch einfach...

    Doch ist mein ernst zumindest wirds mal angezeigt



  • camper schrieb:

    [

    int i = 0, wert = 1000;
    while( eingabe > 0 )
        if ( eingabe >= wert )
        {
            cout << i["MDCLXVI"];
            eingabe -= wert;
        }
        else
            wert /= ++i % 2 ? 2 : 5;
    

    Dürfte kaum zu erheblich kleinerem binary führen.

    alter schwede was du für code schreibst ist ja nicht mehr normal codest du 10 stunden am tag mit c++?



  • ommffg schrieb:

    alter schwede was du für code schreibst ist ja nicht mehr normal codest du 10 stunden am tag mit c++?

    Was hat das damit zu tun?
    Obwohl es noch nicht wirklich das ist:
    http://en.wikipedia.org/wiki/Obfuscated_code

    Schreib einmal funktionierenden Code und dann verkürze den, wo es geht. Dann bist du schnell bei unleserlichem Code, den mal selber nach ein paar Tagen nicht mehr lesen kann.



  • Hi LittleGamer3,

    12976 Byte mit MacBook Pro auf Mac OS X 10.5

    keine Optimierungen: g++ spille.cpp -o romq

    #include <iostream>
    
    const char letters[] = {'M', 'D', 'C', 'L', 'X', 'V', 'I'};
    const unsigned int values[] = {1000, 500, 100, 50, 10, 5, 1};
    
    int main()
    {
            int eingabe;
            std::cin >> eingabe;
            unsigned int i = 0;
            while(eingabe){
                    unsigned int j = values[i];
                    if(eingabe>=j){
                            std::putchar(letters[i]);
                            eingabe -= j;
                    }
                    else
                            ++i;
            }
            std::putchar('\n');
            return 0;
    }
    

    Gruß,
    CSpille



  • Hi LittleGamer3,

    die Binaries sind so groß, weil dein Windows-Compiler den kompletten
    iostream-header reinpackt -> Mein Programm wird auch weit über 100KB groß.

    Ich kann natürlich gegen deine vorgegebene Schablone verstoßen 😉

    #include <cstdio>
    
    const char letters[] = {'M', 'D', 'C', 'L', 'X', 'V', 'I'};
    const unsigned int values[] = {1000, 500, 100, 50, 10, 5, 1};
    
    int main()
    {
            int eingabe;
            std::scanf("%u", &eingabe);
            unsigned int i = 0;
            while(eingabe){
                    unsigned int j = values[i];
                    if(eingabe>=j){
                            std::putchar(letters[i]);
                            eingabe -= j;
                    }
                    else
                            ++i;
            }
            std::putchar('\n');
            return 0;
    }
    

    Unter Mac 12692 Byte...
    und das Binary wird auch unter Windows in die nähe des Spitzenreiters kommen,
    ich denke sogar leicht drunter sein...

    Gruß,
    CSpille


  • Mod

    for(int i=0,w=1000;eingabe>=w-w/(10-i%2*5)&&cout<<"MDCLXVI"[i+(2-i%2)*((eingabe-=w)<0&&(eingabe+=w+w/(10-i%2*5)))]||(w/=5-++i%2*3););
    

    Kein echter Versuch von Obfuscation. Ohne Subtraktionsregel ist es allerdings langweilig, und als Nebenbedingung habe ich mir gestellt, alles wichtige in einen einzelnen Ausdruck zu stecken. Nächste Stufe könnte sein, diesen Ausdruck regulärer zu gestalten ( x op ( y op ( z op ( ... usw ) ) ).



  • CSpille schrieb:

    #include <cstdio>
    
    const char letters[] = {'M', 'D', 'C', 'L', 'X', 'V', 'I'};
    const unsigned int values[] = {1000, 500, 100, 50, 10, 5, 1};
    
    int main()
    {
            int eingabe;
            std::scanf("%u", &eingabe);
            unsigned int i = 0;
            while(eingabe){
                    unsigned int j = values[i];
                    if(eingabe>=j){
                            std::putchar(letters[i]);
                            eingabe -= j;
                    }
                    else
                            ++i;
            }
            std::putchar('\n');
            return 0;
    }
    

    Unter Mac 12692 Byte...

    Welche Compilerversion verwendest du?
    Bei mir ist das Binary 14088 Bytes gross (i686-apple-darwin8-g++-4.0.1)...



  • Hi Styx,

    ich verwende:
    i686-apple-darwin9-gcc-4.0.1 (GCC) 4.0.1 (Apple Inc. build 5484)

    Aber ich hab dein Programm mal kompiliert... Deins ist 20 Byte kleiner...

    Gruß,
    CSpille



  • Hi @all,

    #include <cstdio>
    
    int main() {
            int eingabe;
            std::scanf("%u", &eingabe);
            bool b = false;
            unsigned int v=1000;
            char letters[] = {'M', 'D', 'C', 'L', 'X', 'V', 'I'};
            char* letter = letters;
            while(eingabe){
                    if(eingabe>=v){
                            std::putchar(*letter);
                            eingabe -= v;
                    }
                    else {
                            v /= (b) ? 5 : 2;
                            b = !b;
                            ++letter;
                    }
            }
            std::putchar('\n');
            return 0;
    }
    

    12652 Bytes...

    Gruß,
    CSpille



  • camper schrieb:

    S.T.A.L.K.E.R. schrieb:

    Dein Code ist so schon in Ordnung, zwar sehr lang, aber er ist weder schwer zu verstehen noch unübersichtlich.

    Ein sehr langer Code ist auch immer unübersichtlich.

    int i = 0, wert = 1000;
    while( eingabe > 0 )
        if ( eingabe >= wert )
        {
            cout << i["MDCLXVI"];
            eingabe -= wert;
        }
        else
            wert /= ++i % 2 ? 2 : 5;
    

    Dürfte kaum zu erheblich kleinerem binary führen.

    Bei meiner heiligen Milchkuh, was ist i["MDCLXVI"] für eine kranke Shitkacke???



  • OMGLOLWTF schrieb:

    Bei meiner heiligen Milchkuh, was ist i["MDCLXVI"] für eine kranke Shitkacke???

    Das gleiche wie "MDCLXVI"[i]. Du hast 'ne Milchkuh?



  • Ja, ich habe eine Milchkuh. Aber leider melke ich sie viel zu selten, weil ich die meiste Zeit meinen Hühnern das Fell über die Ohren ziehen muss. 👎 🙄

    Erbitte Links zu weiterführenden Erklärungen!



  • Brauchst keinen Link, p[i] ist definiert als *(p + i). Da die Addition kommutativ ist, ist das gleich *(i + p) => i[p].



  • @CSpille
    @Thread Starter

    Ihr habt beide einen Fehler 🙂 Ihr kennt doch den Film Rocky? Gut Rocky 4 Steht auf der Verpackung Rocky IV nicht IIII 🙂 IIII gibt es nicht. Genau wie eine 9 = IX und nicht VIIII ist :). Nur das mal zu römischen Zahlen.



  • OMGLOLWTF schrieb:

    Ja, ich habe eine Milchkuh. Aber leider melke ich sie viel zu selten, weil ich die meiste Zeit meinen Hühnern das Fell über die Ohren ziehen muss. 👎 🙄

    Erbitte Links zu weiterführenden Erklärungen!

    Gerne: http://de.wikipedia.org/wiki/Milchkuh


Anmelden zum Antworten