Schauen wir uns eine typische Schleife an, die normalerweise 8 Iterationen durchführt:
for (int x=0; x<8; ++x);
Du musst es unendlich machen!
Es ist ein Beliebtheitswettbewerb für alle Sprachen, die eine solche Art von for
Schleife unterstützen. Also gewinnt die Lösung mit der höchsten Punktzahl (Upvotes minus Downvotes).
Wenn Ihre Sprache die andere Form der for
Schleife hat, Sie sich aber sicher sind, können Sie damit etwas Cooles machen, die Antwort gerne posten und als nicht konkurrierend markieren. Ich behalte mir das Recht vor, den Umfang der verfügbaren Konstruktionen und Sprachen zu vergrößern, er wird jedoch niemals verkleinert, sodass Sie keine Angst haben, zuvor korrekte Lösungen zu verwerfen.
Was ist eine Lösung?
Lösung besteht aus zwei Programmen.
Das erste Programm ist ein sauberes Programm. Dies ist das typische Programm in Ihrer Sprache, bei dem die for
Schleife 8 Iterationen durchführt. Es sollte das normale Programm sein, das jeder Entwickler schreiben könnte. Keine speziellen Hacks für Vorbereitungszwecke. Beispielsweise:
int main()
{
for (int x=0; x<8; ++x);
return 0;
}
Das zweite Programm wird erweitert. Dieses Programm sollte den gesamten Code aus dem bereinigten Programm und zusätzlichen Code enthalten. Es gibt nur eine begrenzte Anzahl von Erweiterungspunkten. Weitere Informationen finden Sie im Abschnitt zu den vollständigen Regeln. Ein erweitertes Programm für das obige Clean kann sein
inline bool operator < (const int &a, const int &b)
{
return true;
}
int main()
{
for (int x=0; x<8; ++x);
return 0;
}
Das ist nur ein Beispiel (in C ++ nicht kompilierbar), um eine Idee zu zeigen. Das wirklich korrekte erweiterte Programm muss kompilierbar sein, funktionieren und eine Endlosschleife haben.
Regeln vervollständigen
Beide Programme:
- Jede Sprache, die solche
for
Schleifen unterstützt, ist in Ordnung. - Der Schleifenkörper muss leer sein. Genauer gesagt, Sie können eine Ausgabe oder einen anderen Code in die Schleife einfügen, aber das Verhalten der Schleife sollte im Fall einer leeren Schleife gleich sein.
Sauberes Programm:
Die Schleife verwendet einen ganzzahligen oder numerischen Zähler und führt 8 Iterationen durch:
for (int x=0; x<8; ++x); // C, C++, C# for (var x=0; x<8; ++x); // C#, Javascript for (auto x=0; x<8; ++x); // C, C++ for (auto signed x=0; x<8; ++x); // C, C++ for (register int x=0; x<8; ++x); // C, C++
Benutzerdefinierte Typen sind nicht zulässig.
- Die Verwendung von Eigenschaften (außer globalen Variablen) anstelle von Schleifenvariablen ist nicht zulässig.
Die Variablendeklaration kann innerhalb oder außerhalb der Schleife erfolgen. Folgender Code ist in Ordnung:
int x; for(x=0; x<8; ++x);
Es kann entweder ein Präfix- oder ein Postfix-Inkrement verwendet werden.
Das Schleifenlimit
8
sollte als konstantes Literal geschrieben werden, ohne dass es in einer benannten Konstante oder Variablen gespeichert wird. Es wurde entwickelt, um Lösungen zu verhindern, die darauf beruhen, dass eine Variable oder Konstante mit dem Wert 8 deklariert und dann durch den anderen Wert neu zugewiesen, überschrieben oder abgeschattet wird:const double n = 8; int main() { const double n = 9007199254740992; for (double x=0; x<n; ++x); return 0; }
Erweitertes Programm:
- Muss den gesamten Code des sauberen enthalten.
- Sollte sauberes Programm in begrenzter Anzahl von Erweiterungspunkten verlängern.
- Muss dieselbe
for
Schleife wie eine Endlosschleife selbst ausführen .
Das Platzieren der Schleife in einer anderen unendlichen Konstruktion ist nicht in Ordnung. - Das Patchen des Codes zur Laufzeit oder zur Kompilierungszeit ist zulässig, solange die Textdarstellung unverändert bleibt.
- Das Einfügen der Konstruktion in eine Zeichenfolge und das Weitergeben an
eval
ist nicht zulässig.
Erweiterungspunkte:
- Überall außerhalb des Fragments mit sauberem Code, einschließlich anderer Dateien oder anderer Assemblys.
for
Anweisung (als Einzelstück -for
Konstruktion und sein Körper) muss unverändert bleiben.- Die Variablendeklaration muss gleich bleiben.
- Jeder Punkt zwischen einfachen Anweisungen kann als Erweiterungspunkt verwendet werden.
- Wenn und nur wenn die Variable außerhalb der Schleife und ohne sofortige Zuweisung des Werts deklariert wurde, kann eine solche Zuweisung hinzugefügt werden.
/* extension point here */
int main()
/* extension point here */
{
/* extension point here */
int x /* extension point for assignment here */;
/* extension point here */
for (x=0; x<8; ++x);
/* extension point here */
return 0;
/* extension point here */
}
/* extension point here */
int main()
{
/* BEGIN: No changes allowed */ int x = 0; /* END */
/* extension point here */
/* BEGIN: No changes allowed */ for (x=0; x<8; ++x); /* END */
return 0;
}
PS: Stellen Sie nach Möglichkeit einen Link zur Online-IDE bereit.
java.lang.Integer
? 2. Dies wäre besser mit einem richtigen Gewinnkriterium.