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
quelle
Antworten:
3.1
Bei jeder dieser Änderungen gibt das Programm 20 '+' Zeichen aus. Dieser ist nah:
Es werden 21 '+' Zeichen ausgegeben.
3.2.1
Ich habe mindestens 112 Möglichkeiten gefunden, um dieses Problem zu lösen, indem ich einen Buchstaben eingefügt habe. Möglicherweise funktionieren nicht alle auf allen Compilern.
Ersetzen Sie die letzten beiden durch einen beliebigen Buchstaben
x
, um 104 mögliche Lösungen zu erhalten. Wenn Sie eine der letzten beiden Zeilen verwenden, wird die Ausgabe geändert, die Ausgabe bleibt jedoch für alle drei korrigierten Programme gleich.3.2.2
Alles, was ich mir ausgedacht habe, sind einige Dinge, die bei der Zuweisung an auf die Nummer 20 zurückgesetzt werden
int
.quelle
f
undd
Suffixe fürint
Typen (na ja,d
für jede Art für diese Angelegenheit), aber es gibt ein paar andere , die Sie links ab haben:int n = 20l
,int n = 20U
, undint n = 20u
. Ich glaube auch nicht, dassuint
es sich um eine Standardtypkennung in C oder C ++ handelt. Welchen Compiler verwenden Sie überhaupt für diese?3.1
Noch ein Rätsel. Aber normale Lösungen sind langweilig, was ist mit etwas Besonderem?
Lösung eins:
Ich beschloss, NUR EINEN CHARAKTER zu ändern
-
. Keine anderen Zeichen als-
wurden geändert.Lösung zwei:
Dies ändert genau ein Zeichen - das Semikolon danach
int i
in=printf("++++++++++++++++++++");exit(0);
.Lösung drei:
Dies lädt den
stdix.h
Systemheader. Fügen Sie im Systemeinschlusspfad die folgende Datei mit dem Namen stdix.h ein. Es muss folgenden Inhalt enthalten.3.2
Fügen Sie nun einen Buchstaben ein. Nun, das ist einfach, ersetzen Sie
int main()
durchint main(a)
. Dies gilt nicht nach Standards, aber wen interessiert das?quelle
Puzzle 3.1 Antworten
i--
zun--
(Demo: http://ideone.com/l0Y10 )i < n
zui + n
(Demo: http://ideone.com/CAqWO )[SPACE]i < n
zu-i < n
. (Demo: http://ideone.com/s5Z2r )Puzzle 3.2.1
Wechseln Sie
int n = 20
zuint n = 20L
(L
am Ende ein hinzufügen ).Puzzle 3.2.2
Ich habe noch keine Antwort gefunden ...
quelle
3.1
i--
zun--
i<n
zu-i<n
3.2.1
zu
(Compiler abhängig ...)
3.2.2
druckt 19 + Zeichen, wie bei
int n = 20L;
. Ich hätte es mir jedoch nicht ausgedacht, wenn ich keine anderen Antworten auf 3.2.1 gesehen hättequelle
quelle