Contest: 19 August 2008 - 21 August 2008



  • So, ich bin hier zwar nich angemeldet, hab aber ne idee für einen lustigen contest:

    Aufgabe:
    Ein Programm in C++ coden, welches eingegebene Zahlen in Römische umrechnet. Das Programm soll so klein wie möglich sein und über die laufen Eingabeaufforderung laufen. Vorgegebener Code:

    #include <iostream>
    using namespace std;
    
    int main()
    {
      int eingabe;
      cin >> eingabe;
    
      return 0;
    }
    

    Es dürfen keine weiteren Bibliotheken eingebunden werden. Die Subtraktionsregel muss nicht beachtet werden (=>wikipedia).

    Bsp:
    76 = LXXVI
    512 = DXII
    566 = DLXVII
    316 = CCCXVI
    4444 = MMMMCCCCXXXXIIII

    Bewertung:
    Es wird nur die Größe des kompilierten Codes beachtet.

    Hinweise:
    1. Der Code wird unter Mac OS 10.5 kompiliert
    2. Es werden per Zufallsgenerator 5 Zahlen erzeugt, mit denen der Rechner getestet wird.
    3. Es gibt nichts zu Gewinnen.
    4. Das sind keine Hausaufgaben. Ich habe vorher natürlich auch ein Programm geschrieben, welches 16 KB hat. Wenn ihr mir nicht glaubt poste ich es.

    So und jetzt viel Spaß



  • Bist mir ja ein Scherzkeks, welche Größe denn Maximal? Wieviele Zeilen Code?



  • Das ist egal. Da steht nichts davon also ist es Dir überlassen. Das prog muss halt funzen und meine 16Kb wirst du wohl unterbieten können?



  • Bis wann musst Du die Aufgabe denn abgegeben haben?



  • steht im titel? (21 August)



  • Und warum sollte Dir jemand gratis Deine Hausaufgaben machen?



  • Es sind nich meine Ha's. Ich hab kein Informatik und bin in der 10. Klasse. Willst du meinen Quellcode sehen?



  • LittleGamer3 schrieb:

    Willst du meinen Quellcode sehen?

    Immer her damit. 😉



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


Anmelden zum Antworten