Contest: 19 August 2008 - 21 August 2008



  • #include <iostream>
    using namespace std;
    
    int main()
    {
    	int eingabe;
    	cin >> eingabe;	
    
    	while (eingabe>=1000)
    	{
    		cout << "M";
    		eingabe = eingabe - 1000;
    	}
    	if (eingabe>=900)
    	{
    		cout << "DCCCC";
    		eingabe = eingabe - 900;
    	}
    	if (eingabe>=800)
    	{
    		cout << "DCCC";
    		eingabe = eingabe - 800;
    	}
    	if (eingabe>=700)
    	{
    		cout << "DCC";
    		eingabe = eingabe - 700;
    	}
    	if (eingabe>=600)
    	{
    		cout << "DC";
    		eingabe = eingabe - 600;
    	}
    	if (eingabe>=500)
    	{
    		cout << "D";
    		eingabe = eingabe - 500;
    	}
    	if (eingabe>=400)
    	{
    		cout << "CCCC";
    		eingabe = eingabe - 400;
    	}	
    	if (eingabe>=300)
    	{
    		cout << "CCC";
    		eingabe = eingabe - 300;
    	}
    	if (eingabe>=200)
    	{
    		cout << "CC";
    		eingabe = eingabe - 200;
    	}
    	if (eingabe>=100)
    	{
    		cout << "C";
    		eingabe = eingabe - 100;
    	}
    	if (eingabe>=90)
    	{
    		cout << "LXXXX";
    		eingabe = eingabe - 90;
    	}
    	if (eingabe>=80)
    	{
    		cout << "LXXX";
    		eingabe = eingabe - 80;
    	}
    	if (eingabe>=70)
    	{
    		cout << "LXX";
    		eingabe = eingabe - 70;
    	}
    	if (eingabe>=60)
    	{
    		cout << "LX";
    		eingabe = eingabe - 60;
    	}	
    	if (eingabe>=50)
    	{
    		cout << "L";
    		eingabe = eingabe - 50;
    	}
    	if (eingabe>=40)
    	{
    		cout << "XXXX";
    		eingabe = eingabe - 40;
    	}
    	if (eingabe>=30)
    	{
    		cout << "XXX";
    		eingabe = eingabe - 30;
    	}
    	if (eingabe>=20)
    	{
    		cout << "XX";
    		eingabe = eingabe - 20;
    	}
    	if (eingabe>=10)
    	{
    		cout << "X";
    		eingabe = eingabe - 10;
    	}
    	if (eingabe>=9)
    	{
    		cout << "VIIII";
    		eingabe = eingabe - 9;
    	}
    	if (eingabe>=8)
    	{
    		cout << "VIII";
    		eingabe = eingabe - 8;
    	}
    	if (eingabe>=7)
    	{
    		cout << "VII";
    		eingabe = eingabe - 7;
    	}
    	if (eingabe>=6)
    	{
    		cout << "VI";
    		eingabe = eingabe - 6;
    	}
    	if (eingabe>=5)
    	{
    		cout << "V";
    		eingabe = eingabe - 5;
    	}
    	if (eingabe>=4)
    	{
    		cout << "IIII";
    		eingabe = eingabe - 4;
    	}
    	if (eingabe>=3)
    	{
    		cout << "III";
    		eingabe = eingabe - 3;
    	}
    	if (eingabe>=2)
    	{
    		cout << "II";
    		eingabe = eingabe - 2;
    	}
    	if (eingabe>=1)
    	{
    		cout << "I";
    		eingabe = eingabe - 1;
    	}
    
    	cout << endl;	
    	return 0;
    }
    


  • Glaubst du mir jetzt?
    Ich möchte nur mal sehen, wie andere das Problem angehen und ob es möglich ist, den Quellcode kürzer zu halten...


  • Mod

    Wieviel von diesen 16kb wohl auf durch die Funktion bedingt sein werden...
    Sorry, aber das sind einfach unsinnige Randbedingungen.



  • LittleGamer3 schrieb:

    Glaubst du mir jetzt?
    Ich möchte nur mal sehen, wie andere das Problem angehen und ob es möglich ist, den Quellcode kürzer zu halten...

    Soll jetzt der Quellcode kürzer sein, oder dessen Kompilat?
    Btw. ist es der Quellcode, der später wartbar und übersichtlich sein muss, nicht das Kompilat.



  • Das fertig kompilierte Programm soll weniger Speicherplatz beanspruchen als meins.



  • Wenn es um die Größe des Binaries geht solltest du die iostream-Anforderung definitiv rausnehmen.
    Außerdem sollte jeder selbst kompilieren dürfen, immerhin kann man durch etwas Feintuning deutlich Platz sparen.

    Aber dir scheint es hier weniger um einen Coding-Contest zu gehen als darum wer die eleganteste Lösung bietet, richtig?

    Also eher eine Frage der Ästethik. Dein Code ist so schon in Ordnung, zwar sehr lang, aber er ist weder schwer zu verstehen noch unübersichtlich. Die 16KB kommen hauptsächlich dadurch zu Stande, dass du die C++ IOStreams benutzt (die verschlingen schon ganz schön was an Platz im Verhältnis zu deinem Code) und wahrscheinlich ist es auch noch ein Debug Build. Mit Mac OS kenn ich mich nicht so aus und ich weiß nicht welchen Compiler du benutzt hast, daher kann ich dir nicht genau sagen woran es liegt.



  • Du hast das genau richtig verstanden. Ich hab mit
    g++ main.cpp -o romq
    kompiliert.

    Postet einfach mal eure Codes oder Vorschläge

    EDIT: Wie kann ich die Iostream rausnehmen?



  • Die andere Richtung wird hier verlangt. Ich bin bei 175 Zeichen 😉



  • .filmor schrieb:

    Die andere Richtung wird hier verlangt. Ich bin bei 175 Zeichen 😉

    und das funktioniert???


  • Mod

    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.



  • LittleGamer3 schrieb:

    .filmor schrieb:

    Die andere Richtung wird hier verlangt. Ich bin bei 175 Zeichen 😉

    und das funktioniert???

    duerfte sogar einfacher sein...

    ich bin derzeit bei 8054 Byte im Release-Mode (mit deinen Compilerflags sogar nur 7819 Byte)

    #include <cstdio>
    
    int main()
    {
    int eingabe;
    scanf( "%u", &eingabe );
    
    while ( eingabe >= 1000 )
    {
    putchar( 'M' );
    eingabe -= 1000;
    }
    while ( eingabe >= 500 )
    {
    putchar( 'D' );
    eingabe -= 500;
    }
    while ( eingabe >= 100 )
    {
    putchar( 'C' );
    eingabe -= 100;
    }
    while ( eingabe >= 50 )
    {
    putchar( 'L' );
    eingabe -= 50;
    }
    while ( eingabe >= 10 )
    {
    putchar( 'X' );
    eingabe -= 10;
    }
    while ( eingabe >= 5 )
    {
    putchar( 'V' );
    eingabe -= 5;
    }
    while ( eingabe >= 1 )
    {
    putchar( 'I' );
    eingabe--;
    }
    
    putchar( '\n' );
    }
    

    geht sicher besser...



  • ich hab noch ein #include vorne drann gemacht, dann hat es den fünf zahlen standgehaten... hat fertig kompiliert jedoch auch 16KB



  • 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.

    kannst du das prog mal so posten, dass es funktioniert?


  • Mod

    LittleGamer3 schrieb:

    kannst du das prog mal so posten, dass es funktioniert?

    Das Programmgerüst hast du doch vorgegeben.



  • camper schrieb:

    cout << i["MDCLXVI"];
    

    Komm schon, das hast du nur gemacht um ihn zu flachsen 😉



  • Dein Prog hat 13.008 KB



  • .filmor schrieb:

    camper schrieb:

    cout << i["MDCLXVI"];
    

    Komm schon, das hast du nur gemacht um ihn zu flachsen 😉

    ehrlich gesagt find ich den else block unübersichtlicher


  • Mod

    kannst ja das cout-Statement mal durch putchar ersetzen und gegen den anderen Code antreten lassen.



  • 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.

    Immer nicht. Sein Programm wirkt auf der ersten Blick zwar furchtbar kompliziert, aber wenn man es sich dann anschaut sieht man ja gleich, dass am Anfang eine Schleife ist mit zwei Zeilen Inhalt und danach kommen ja nur noch if-Blöcke die man von oben nach unten runterlesen kann. Und da ist ja keine komplizierte Logik drin versteckt.
    Die Zeit das Programm von ihm zu verstehen verbringt man bei deinem Vorschlag schon mit i["MC..."].

    Ich nehm mal an dein i["MC..."] würdest du in ein richtiges Programm nicht schreiben, sonst müsst ich dich jetzt noch belehren
    😃 😉


  • Mod

    .filmor schrieb:

    camper schrieb:

    cout << i["MDCLXVI"];
    

    Komm schon, das hast du nur gemacht um ihn zu flachsen 😉

    Ich glaube keinen Zweifel daran gelassen zu haben, dass ich das Ganze nicht ernst nehme.


Anmelden zum Antworten