01.12.2012 Aufrufe

die datenschleuder. - Chaosradio - CCC

die datenschleuder. - Chaosradio - CCC

die datenschleuder. - Chaosradio - CCC

MEHR ANZEIGEN
WENIGER ANZEIGEN

Erfolgreiche ePaper selbst erstellen

Machen Sie aus Ihren PDF Publikationen ein blätterbares Flipbook mit unserer einzigartigen Google optimierten e-Paper Software.

STRIP INPUT.C<br />

Shortest Programming – Tipps<br />

und Tricks<br />

von Markus Schaber <br />

Eine beliebte sportliche Disziplin unter den Hackern ist es, das kürzestmögliche<br />

Programm für eine gegebene Aufgabe zu schreiben. Auch im <strong>CCC</strong> hat es schon solche<br />

Wettbewerbe gegeben (siehe auch http://ulm.ccc.de/shortest/ ). In <strong>die</strong>sem Artikel<br />

werden (anhand von Beispielen der Sprache C) ein paar der Tricks verraten, wie<br />

Hacker und Haeckse <strong>die</strong> letzten Bytes aus einem Programm quetschen kann. Allerdings<br />

wird nicht alles verraten – etwas “Hack Value” soll schon noch übrig bleiben...<br />

Warnung: Die hier gezeigten Methoden sind im allgemeinen<br />

das genaue Gegenteil von „gutem Programmierstil“, und<br />

können unter Umständen von Arbeitgebern, Übungsaufgaben-Korrektoren,<br />

Open-Source-Projektleitern, Einstellungsprüfern<br />

und anderen, denen man seinen Quelltext zukommen<br />

lässt, mit anscheinend unerklärlichen Anfällen von<br />

Mißfallen bedacht werden.<br />

Leerraum minimieren<br />

Betrachten wir mal das folgende Code-Fragment kritisch [1]:<br />

1. /* Multiply our number with 23<br />

2. * We call this function before each new<br />

base-23 digit is read.<br />

3. */<br />

4. void multiply(void) {<br />

5. int ueber=0;<br />

6. int pos=0;<br />

7. int zwi=0;<br />

8. int alt;<br />

9. do { alt = f[pos];<br />

10. zwi = f[pos] * 23 + ueber;<br />

11. f[pos] = zwi % 11;<br />

12. ueber = zwi / 11;<br />

13. pos++;<br />

14. } while (pos < MAX);<br />

15.<br />

16. if (ueber != 0) {<br />

17. printf(“SHIFT OVERFLOW”);<br />

18. exit(1);<br />

19. }<br />

20. }<br />

Natürlich sollten alle Bestandteile des Quelltextes, <strong>die</strong> den<br />

Compiler nicht interessieren, aus dem Programm entfernt<br />

werden. Dies sind zuallererst natürlich <strong>die</strong> Kommentare.<br />

Ausserdem können Leerräume (Leerzeichen, Tab, Zeilenumbruch)<br />

optimiert werden: Jede Folge von mehr als einem Leeraum<br />

kann zu einem Leerraum zusammengekürzt werden. Als<br />

allererstes kommen also alle Spaces und Tabs am Zeilenende<br />

weg, ebenso wie <strong>die</strong> Einrückung am Zeilenanfang, und sonstige<br />

Ansammlungen von Leerzeichen – damit kommen wir auf<br />

folgenden Quelltext:<br />

1. void multiply(void) {<br />

2. int ueber=0;<br />

3. int pos=0;<br />

4. int zwi=0;<br />

5. int alt;<br />

6. do { alt = f[pos];<br />

7. zwi = f[pos] * 23 + ueber;<br />

8. f[pos] = zwi % 11;<br />

9. ueber = zwi / 11;<br />

44 44<br />

#83 / 2004<br />

10. pos++;<br />

11. } while (pos < MAX);<br />

12. if (ueber != 0) {<br />

13. printf(“SHIFT OVERFLOW”);<br />

14. exit(1);<br />

15. }<br />

16. }<br />

Aber auch innerhalb <strong>die</strong>ses Quelltextes gibt es noch einige<br />

überflüssige Leerräume, <strong>die</strong> man eliminieren kann – vereinfacht<br />

gesagt, an allen Stellen an denen vor oder [2] nach dem<br />

Leerraum kein Bezeichner und keine Zahl steht. An den Stellen,<br />

an denen aus syntaktischen Gründen ein Leerraum bleiben<br />

muss, setze ich gerne Zeilenumbrüche ein – das stört den<br />

Lesefluss, und das Programm sieht optisch länger aus, als es<br />

wirklich ist. Das Programm sieht dann wie folgt aus:<br />

1. void<br />

2. multiply(void){int<br />

3. ueber=0;int<br />

4. pos=0;int<br />

5. zwi=0;int<br />

6. alt;do{alt=f[pos];zwi=f[pos]*23+ueber;f[pos<br />

]=zwi%11;ueber=zwi/11;pos++;}while(pos

Hurra! Ihre Datei wurde hochgeladen und ist bereit für die Veröffentlichung.

Erfolgreich gespeichert!

Leider ist etwas schief gelaufen!