Dies ist der dritte Teil meiner Reihe von C / C ++ - Rätseln. Falls Sie die ersten 2 verpasst haben, sind sie hier: (1) Programmierpuzzle 1 (C ++ ) von m3ph1st0s (2) Programmierpuzzle 2 (C ++) von m3ph1st0s: "Call hard!"
Ich muss sagen, dass meine Rätsel 100% original sind. Wenn nicht, werde ich dies immer im Text angeben. Mein 3. Puzzle besteht aus 2 Teilen:
Puzzle 3.1
Dieser Teil (3.1) ist kein Originalpuzzle von mir, sondern stammt von einer Internetseite, die ich vor einiger Zeit gelesen habe. Ich benutze es hier als Ausgangspunkt und Aufwärmübung für Sie. Lösen Sie dieses Problem und fahren Sie mit dem zweiten Teil fort.
Jemand hat 20 Mal versucht, das "+" - Zeichen zu drucken, und dabei das folgende Programm entwickelt:
#include <stdio.h>
int main() {
int i;
int n = 20;
for( i = 0; i < n; i-- )
printf("+");
return 0;
}
Die Tatsache, dass es nicht das erwartete Ergebnis hatte, ist offensichtlich - das Programm endet nie. Repariere es! Einfach? Korrigieren Sie jetzt das Programm, indem Sie NUR EIN ZEICHEN ändern - natürlich ohne Leerzeichen! Für diese Herausforderung gibt es 3 Lösungen. Finde alle 3. Nur um es klar zu machen: Das Programm muss 20 "+" - Zeichen ausgeben und schnell enden. Bevor ich kritisiere, was "schnell" bedeutet, sage ich, dass es höchstens ein paar Sekunden bedeutet (was übrigens zu viel ist, aber nur um es kristallklar zu machen).
Puzzle 3.2
EDITED Ich wurde bereits früher darauf hingewiesen, dass die Lösung für das 3.2.2-Puzzle möglicherweise vom Compiler abhängig ist. Um mögliche Diskussionen zu diesem Thema auszuschließen, werde ich die Idee modifizieren und bei einem nächsten Rätsel verbessern, wenn ich besonders darauf achte, keine Kontroversen zu erzeugen. Um dieses Rätsel aufrechtzuerhalten, werde ich jedoch eine kleine Änderung für 3.2.2 vornehmen (die Lösung wird einfacher, aber sauberer).
Als ich das Puzzle zum ersten Mal sah, fand ich es ziemlich großartig. Ich habe es geschafft, es zu lösen, aber nicht sofort, da es einige sorgfältige Aufmerksamkeit erfordert. Wenn Sie hier sind, bedeutet dies, dass auch Sie es gelöst haben. Wenn Sie dazu ein Programm geschrieben haben, um alle möglichen Zeichen durch alle möglichen Werte zu ersetzen und jede Lösung zu testen, sind Sie verloren. Hart arbeitender Kerl. Nachdem Sie das Programm korrigiert haben, das 20 "+" - Zeichen schreibt:
3.2.1: Fügen Sie einen einzelnen Buchstaben und nichts weiter in den Code ein, damit das Ergebnis gültig ist und in allen 3 korrigierten Programmen dasselbe ausgibt. Unnötig zu erwähnen, dass der Brief vor dem Einfügen von main stehen muss (ich sage das, weil ich keine Leute hören möchte, die nur einen Brief nach dem Programm setzen und deren Compiler irgendwie sehr freundlich war).
BEARBEITET (siehe unten) - Bei diesen letzten Fragen wird berücksichtigt, dass der Zähler i bei -1 statt bei 0 beginnt.
3.2.1.5: Wiederholen Sie alle vorherigen Probleme mit der Bedingung, dass die Ausgabe mindestens 19 "+" - Zeichen enthält (aber immer noch eine endliche Ausgabe). Das Ändern von Leerzeichen ist zulässig. Jetzt haben Sie vielleicht mehr Lösungen gefunden als im ersten Fall. Einige davon werden definitiv für die 3.2.2-Frage passen.
3.2.2: Wählen Sie einen anderen Wert, um die Variable n zu initialisieren, damit die resultierende Ausgabe für mindestens ein korrigiertes Programm in 3.2.1.5 gleich bleibt (nicht unbedingt für alle).
LAST EDIT1 : Das Programm so zu ändern, dass 21 "+" Zeichen ausgegeben werden, ist immer noch eine gute Lösung, da im Originaltext nicht "genau" 20 Zeichen angegeben wurden. Die unendliche Ausgabe ist jedoch verboten. Dies bedeutet natürlich nicht, dass wir alle Hunderte von "+" - Zeichen ausgeben, da dies nicht verboten ist. Das Eliminieren einer schönen 21 Ausgabe wäre jedoch nicht im Sinne dieses Wettbewerbs.
LAST EDIT2 : Wenn man LAST EDIT1 betrachtet und Platzänderungen akzeptiert , scheint es, dass wir jetzt 5 mögliche Lösungen haben, von denen vier bereits in den Antworten hervorgehoben wurden. Die letzte Herausforderung wurde jedoch nicht berührt, und ich muss noch einmal klarstellen: n muss ein anderer Wert zugewiesen werden , Lösungen, die n durch einige Tricks 20 zuweisen, tun dies nicht (wie n = 20L). Außerdem bevorzuge ich die 3. Lösung, die keine Leerzeichen ändert.
LAST EDIT3 : Ich habe die letzten Fragen bearbeitet, bitte lesen!
Die Herausforderung besteht darin, beide Teile des Puzzles zu lösen. Der erste, der es tut, gewinnt.
Ich hoffe es ist alles klar, wenn nicht, poste bitte irgendwelche Fragen und ich werde sie so schnell wie möglich bearbeiten. Prost. hervorgehobener Text