Samstag, 14. Mai 2011

Quine Wettbewerb: Finde das kürzeste

Anlässlich des 150. Posts habe ich mir wieder einen kleinen "Wettbewerb" ausgedacht.
Ziel ist es, ein möglichst kurzes Quine zu schreiben, welches eine bestimmte Anweisung ausführt.
Zur Erinnerung: Ein Quine ist ein Programm, welches seinen eigenen Quellcode komplett ausgibt, auf diesem Blog gibt es auch einen Post darüber.
Aufgabe ist es nun, aus folgendem Programm ein Quine zu machen:

class Quine
{
    static void Main(string[] args)
    {
        System.Diagnostics.Process.Start(System.Environment.SystemDirectory + "\\shutdown.exe", "-s -t 120");
    }
}

Der Wettbewerb soll über 3 Wochen laufen, also bis Samstag den 4.5. Wer bis dahin den kürzesten Code gepostet hat, gewinnt ;-)
Ich lege vor.
Das Quine soll natürlich exakt den Programmcode drucken, hierbei sind Zeileneinrückungen aber nicht wichtig.
Ein kleiner Tipp, wie man die Ausgabe leicht überprüfen kann:
Mit Console.SetOut() lässt sich die Ausgabe der Konsole in einen Stream umleiten, so kann z.B. in eine Datei geschrieben werden, also einfach die entsprechenden Befehle in das Programm schreiben (sie zählen nicht zum Quine dazu).
Mit Programmen wie Beyond Compare kann dann die Gleichheit überprüft werden (also definiere, alles was Beyond Compare als gleich ansieht gilt) und mit z.B. Word kann leicht die Länge der Datei gezählt werden.
Mein Quine Code lautet:

class Quine
{
    static void Main(string[] args)
    {
        // Zählt nicht dazu, auskommentieren um Ausgabe umzuleiten: System.IO.StreamWriter sw = new System.IO.StreamWriter(@"C:\Users\User\Desktop\Neues Textdokument (2).txt");
        // ", System.Console.SetOut(sw);
        System.Diagnostics.Process.Start(System.Environment.SystemDirectory + "\\shutdown.exe", "-s -t 120");
        string s = "class Quine {3} {0} {3} static void Main(string[] args) {3} {0} {3} System.Diagnostics.Process.Start(System.Environment.SystemDirectory + {2}{5}{5}shutdown.exe{2}, {2}-s -t 120{2}); {3} string s = {2}{1}{2}; {3} System.Console.WriteLine(s, System.Convert.ToChar(123), s, System.Convert.ToChar(34), System.Environment.NewLine, System.Convert.ToChar(125), System.Convert.ToChar(92)); {3} {4} {3} {4}";
        System.Console.WriteLine(s, System.Convert.ToChar(123), s, System.Convert.ToChar(34), System.Environment.NewLine, System.Convert.ToChar(125), System.Convert.ToChar(92));
        // ", sw.Close();
    }
}

Die Länge hiervon beträgt 763 Zeichen.

Und jetzt, viel Glück und viel Spaß.

PS: Speichert vorher alle Dokumente bzw. schaut euch an, wie man das Herunterfahren von Windows abbrechen kann (Stichwort: shutdown -a).

Kommentare:

  1. Erstmals Glückwunsch zu deinem 150. Post. Werde mich in den nächsten Tagen mal an die Aufgabe ranmachen (du meintest wohl, dass der Wettbewerb bis am 4.6 läuft?).

    AntwortenLöschen
  2. Danke! Fast, ich hatte an 4.5. gedacht, also noch rund 3 Wochen.

    AntwortenLöschen
  3. Mit 1-wöchiger Verspätung beende ich mal den Wettbewerb. Leider gab es keinen Lösungsbeitrag (mein Quine war anscheinend schon so gut ;-)), trotzdem danke an alle die sich Gedanken gemacht haben!
    Wem später noch etwas einfällt kann dieses gerne hier posten und auch sonstige Anregungen zu Quines etc. sind erwünscht!

    AntwortenLöschen
  4. Hey Kannst du mal schauen wie man einen Mausklick Simulieren kann?

    Wer echt nett ich finde im Internet nämlich nichts!!

    AntwortenLöschen
  5. Hallo,

    coole Idee! War echt nicht so einfach, jetzt ist der Post dazu aber fertig: http://csharp-tricks.blogspot.com/2011/07/maus-steuern.html
    Hoffe es hilft dir und anderen.

    AntwortenLöschen
  6. Sorry Konnte erst heute es lesen, aber Danke!

    AntwortenLöschen
  7. Hey Oliver!

    Ich weiß, es hat nichts mit dem Post zu tun, aber:

    kennst du eine Möglichkeit, Windows (7) automatisch hochfahren zu lassen? (Ich weiß, dass man sowas im BIOS einstellen kann) Aber in Windows selbst auch? Wäre sehr hilfreich, da ich vorhabe, ein Weckprogramm zu schreiben.

    Grüße!
    Julian

    AntwortenLöschen
  8. Hi Julian,

    ich würde sagen, wenn der PC komplett aus ist, kannst du nur über das BIOS etwas machen, da ja noch kein Teil des Betriebssystems geladen ist.
    Nur falls der PC im Standby Modus ist könnte man eventuell das BIOS umgehen (Stichwort geplante Tasks o.ä.).

    Viele Grüße
    Oliver

    AntwortenLöschen
    Antworten
    1. Danke, für deine Antwort :)
      Hmm, schade eigentlich. Und kann man geplante Tasks mithilfe von C# Code erstellen, oder muss man den Aufgabenmanager von Windows dafür benutzen?

      Julian

      Löschen