Contest: 19 August 2008 - 21 August 2008
-
-
Ich denke, bei diesem kleinen Programm ist die Grösse des Binaries nur abhängig vom verwendeten Compiler (vielleicht auch noch Version + Optimierungseinstellungen) und dem eingesetzten Betriebssystem.
Gruss
Styx
-
CSpille schrieb:
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ß,
CSpille5632 Bytes unter MSVC9 mit folgenden Cmdlines:
Compiler: /O1 /Os /GL /D "WIN32" /D "NDEBUG" /D "_CONSOLE" /GF /FD /MD /GS- /Gy /Fo"Release\" /Fd"Release\vc90.pdb" /W3 /nologo /c /Zi /TP /errorReport:prompt
Linker: /OUT:"test4.exe" /INCREMENTAL:NO /NOLOGO /MANIFEST /MANIFESTFILE:"Release\test4.exe.intermediate.manifest" /MANIFESTUAC:"level='asInvoker' uiAccess='false'" /SUBSYSTEM:CONSOLE /OPT:REF /OPT:ICF /LTCG /NXCOMPAT /MACHINE:X86 /ERRORREPORT:PROMPT kernel32.lib user32.lib gdi32.lib winspool.lib comdlg32.lib advapi32.lib shell32.lib ole32.lib oleaut32.lib uuid.lib odbc32.lib odbccp32.lib
-
Was hat das alles noch mit C++ zu tun?
-
Tachyon schrieb:
Was hat das alles noch mit C++ zu tun?
Die Headerdatei...

Aber ich gebe dir Recht, mit OOP hat das von Anfang an nichts zu tun gehabt...
Aber da C eine Untermenge von C++ ist...
-
Ich hatte gerade Lust es mal auszuprobieren:
832 Bytes - Könnte man aber womöglich noch weiter reduzieren.Code:
#include <windows.h> #pragma comment(linker, "/entry:start") bool is_digit(char c) { return c >= '0' && c <= '9'; } unsigned int convert(char* buffer, unsigned int bufferLength) { if(!bufferLength) { return 0; } unsigned int value = buffer[0] - '0'; for(unsigned int i = 1; i < bufferLength; ++i) { if(is_digit(buffer[i])) { value *= 10; value += buffer[i] - '0'; } else { return 0; } } return value; } void start() { HANDLE inputHandle = GetStdHandle(STD_INPUT_HANDLE); HANDLE outputHandle = GetStdHandle(STD_OUTPUT_HANDLE); DWORD numberOfChars = 0; char buffer[10]; ReadConsoleA(inputHandle, buffer, 10, &numberOfChars, NULL); numberOfChars -= 2; unsigned int input = convert(buffer, numberOfChars); unsigned int i = 0, value = 1000; char const* output = "MDCLXVI"; while(input > 0) { if(input >= value) { WriteConsoleA(outputHandle, &output[i], 1, &numberOfChars, NULL); input -= value; } else { value /= ++i % 2 ? 2 : 5; } } }Den Code habe ich nach Anleitung von Jochen Kalmbach kompiliert:
http://blog.kalmbach-software.de/2008/02/02/smallest-application-size-for-win32-console-application/Grüssli
-
Dravere schrieb:
Ich hatte gerade Lust es mal auszuprobieren:
832 Bytes - Könnte man aber womöglich noch weiter reduzieren.Code:
Den Code habe ich nach Anleitung von Jochen Kalmbach kompiliert:
http://blog.kalmbach-software.de/2008/02/02/smallest-application-size-for-win32-console-application/Grüssli
Dafür gewinnst du nur einen Blumentopf, wenn du die Eingabe direkt in die römische Zeichenkette konvertierst. Das dürfte auch in kleinerem Code resultieren.
-
camper schrieb:
Dafür gewinnst du nur einen Blumentopf, wenn du die Eingabe direkt in die römische Zeichenkette konvertierst. Das dürfte auch in kleinerem Code resultieren.
Ja, ich weiss. Dazu hätte ich aber noch was mehr selber überlegen müssen und hätte nicht nur deinen Code nehmen (stehlen) können :p
Ich wollte ja nur mal schauen, wie gross das Ding wird, am Gewinn bin ich nicht interessiert, welcher ja auch gar nicht existiert. Aber danke für den Blumentopf
Grüssli
-
Tachyon schrieb:
Was hat das alles noch mit C++ zu tun?
.. bisher wenig. Wie wärs's daher mal mit einer C++-Lösung:
#include <algorithm> // std::find #include <locale> // num_get #include <cstring> // std::strlen #include <iostream> class RoemischNumGet : public std::num_get< char > { typedef std::num_get< char > base_type; public: RoemischNumGet() : base_type() {} virtual iter_type do_get( iter_type in, iter_type end, std::ios_base& str, std::ios_base::iostate& err, long& val ) const { const char* R = "IVXLCDM"; const char* Rend = R + std::strlen(R); const long Value[] = { 1, 5, 10, 50, 100, 500, 1000 }; val = 0; for( const char* prev = 0; in != end; ++in ) { const char* i = std::find( R, Rend, *in ); if( i == Rend ) break; if( prev && i > prev ) // höherwertiges Zeichen folgt niederwertigem { err |= std::ios_base::failbit; break; } val += Value[i - R]; prev = i; } if( val == 0 ) err |= std::ios_base::failbit; if( in == end) err |= std::ios_base::eofbit; return in; } }; int main() { using namespace std; cin.imbue( locale( cin.getloc(), new RoemischNumGet ) ); for( int i; cin >> i; ) cout << " = " << i << endl; return 0; }Gruß
Werner
-
Tachyon schrieb:
Was hat das alles noch mit C++ zu tun?
nachdem eine moeglichst kleine Binaerdatei verlangt wird, bieten sich C-Funktionen direkt an... so spart man locker ein paar KiB ein...
-
#include <windows.h> #pragma comment(linker, "/entry:main") int main() { HANDLE inputHandle = GetStdHandle(STD_INPUT_HANDLE); HANDLE outputHandle = GetStdHandle(STD_OUTPUT_HANDLE); DWORD numberOfChars = 0; char buffer[6]; ReadConsoleA(inputHandle, buffer, 6, &numberOfChars, NULL); numberOfChars -= 3; for(unsigned i=0;i<=numberOfChars;) if ( int x = buffer[i]-'0' ) { static const char römisch[] = {'I','V','X','L','C','D','M'}; DWORD y; #if 1 static const char foo[] = {0,0,0,0,1,1,1,1,0,2}; static const char bar[] = {1,1,1,-1,5,5,5,5,-1,10}; WriteConsoleA(outputHandle, römisch+foo[x-1]+2*(numberOfChars-i), 1, &y, NULL); buffer[i]-=bar[x-1]; #else WriteConsoleA(outputHandle, römisch+x/5+2*(numberOfChars-i), 1, &y, NULL); buffer[i]-=5-(x<5)*4; #endif } else ++i; }800 Byte mit, 784 Byte ohne Subtraktionsregel.
-
*camper einen Blumentopf überreicht*
Jetzt gibt es bald nur noch ein Problem. Auf Windows NTFS gibt es keine Dateien, welche kleiner als 4KB sind, bzw. wenn sie kleiner sind, wird der Rest trotzdem belegt. :pGrüssli
-
Hauptsache, man meint, man habe eine möglichst kleine Datei

Naja, das Ganze ist wohl sowieso mehr oder weniger ein Witz; wenn man nicht gerade auf Geräten mit kritischem Speicherplatz programmiert (was man dann eher mit C macht), kommt es wohl kaum auf die Grösse der Anwendung drauf an - aber eben, so als Contest ists halt schon noch lustig

-
So, auch wenn camper nur so mitgemacht hat, hat er trotzdem gewonnen
-
Da gehören aber noch mindestens 10kb Strafe raufgerechnet für das Verwenden von Umlauten im Quellcode.

-
LittleGamer3 schrieb:
Hinweise:
1. Der Code wird unter Mac OS 10.5 kompiliert#include <windows.h> #pragma comment(linker, "/entry:main") int main() { HANDLE inputHandle = GetStdHandle(STD_INPUT_HANDLE); HANDLE outputHandle = GetStdHandle(STD_OUTPUT_HANDLE); DWORD numberOfChars = 0; char buffer[6]; ReadConsoleA(inputHandle, buffer, 6, &numberOfChars, NULL); numberOfChars -= 3; for(unsigned i=0;i<=numberOfChars;) if ( int x = buffer[i]-'0' ) { static const char römisch[] = {'I','V','X','L','C','D','M'}; DWORD y; #if 1 static const char foo[] = {0,0,0,0,1,1,1,1,0,2}; static const char bar[] = {1,1,1,-1,5,5,5,5,-1,10}; WriteConsoleA(outputHandle, römisch+foo[x-1]+2*(numberOfChars-i), 1, &y, NULL); buffer[i]-=bar[x-1]; #else WriteConsoleA(outputHandle, römisch+x/5+2*(numberOfChars-i), 1, &y, NULL); buffer[i]-=5-(x<5)*4; #endif } else ++i; }Nicht schlecht... Gratuliere, dass du es geschafft hast den Code unter OS X
zu kompilieren... Hätte ich nicht gedacht...
-
Schiedsrichter schrieb:
...
Nicht schlecht... Gratuliere, dass du es geschafft hast den Code unter OS X
zu kompilieren... Hätte ich nicht gedacht...Kompliment. Du hast nur 2 Tage gebraucht, das zu bemerken.