Beheben einer unterbrochenen Schleife durch Ändern genau eines Zeichens
Lesezeit: 3 Minuten
Javier
ich fand eine Seite mit einigen komplizierten C-Puzzles. Ich beschäftige mich gerade damit:
Das Folgende ist ein Stück C-Code, dessen Absicht es war, ein Minuszeichen 20 Mal zu drucken. Aber das merkt man, das geht nicht.
#include <stdio.h>
int main()
{
int i;
int n = 20;
for( i = 0; i < n; i-- )
printf("-");
return 0;
}
Nun, das Korrigieren des obigen Codes ist einfach. Um das Problem interessant zu machen, müssen Sie den obigen Code beheben, indem Sie genau ein Zeichen ändern. Es gibt drei bekannte Lösungen. Sehen Sie, ob Sie alle drei bekommen können.
Ich kann nicht herausfinden, wie man es löst. Ich weiß, dass es durch Ändern behoben werden kann -- zu ++aber ich kann nicht herausfinden, welches einzelne Zeichen geändert werden muss, damit es funktioniert.
Ich denke nicht, dass dies “zu lokalisiert” ist. Während es in der realen Welt vielleicht nicht allzu nützlich ist, ist es ein interessantes Rätsel.
– Javier
23. März 2010 um 20:43 Uhr
Übrigens fehlt uns noch eine Lösung.
– Javier
23. März 2010 um 20:45 Uhr
@Felix: Nun, natürlich tun wir das jetzt nicht. Ich habe das geschrieben, als wir es waren.
– Javier
23. März 2010 um 21:06 Uhr
Gab Royer
Hier ist eine Lösung:
for( i = 0; -i < n; i-- )
printf("-");
Hier ist ein zweites, danke an Mark für seine Hilfe!
for( i = 0; i + n; i-- )
printf("-");
Und Mark hatte auch den dritten, der ist
for( i = 0; i < n; n-- )
printf("-");
Der zweite würde nicht funktionieren. Sie erhalten -20, -21, -22,.... Aber i + n Sollte es tun.
– Felix Klinge
23. März 2010 um 20:41 Uhr
Ich denke, das zweite braucht i+n statt i-n und du hast es. Nett.
– Mark Wilkins
23. März 2010 um 20:43 Uhr
Sie haben Recht! Ich war mir sicher, dass es irgendwie damit zusammenhängt, hatte aber die Hoffnung etwas früh im Prozess aufgegeben 😛
– Gab Royer
23. März 2010 um 20:47 Uhr
Das zweite ist genial. Vielen Dank. Danke auch an Mark, der offenbar viel dazu beigetragen hat.
– Javier
23. März 2010 um 20:50 Uhr
Markus Wilkins
Veränderung i-- zu n-- ist ein anderer.
Okay – Gab hat das Problem behoben, also habe ich die andere Lösung entfernt. Er gewinnt!
@Gab: Heh – ich bin froh, dass du mich mit deinem um eine Minute geschlagen hast 🙂
– Mark Wilkins
23. März 2010 um 20:39 Uhr
Ich habe die andere Antwort akzeptiert, weil sie alle drei Lösungen enthält, aber vielen Dank.
– Javier
23. März 2010 um 20:51 Uhr
@Javier: Gute Entscheidung. Gab dachte an zwei, bevor ich es tat. Lustiges Problem.
– Mark Wilkins
23. März 2010 um 21:03 Uhr
Dritte Antwort:
for( i = 0; i + n; i-- )
printf("-");
Danke an Gab Royer für die Inspiration.
Erklärung: Irgendwann , i + n wird darin enden, dass -20 + 20 = 0 welches ist false.
for( i = 0; i < n; n-- )
printf("-");
i– in n– geändert
Hier ist einer davon, glaube ich:
for( i = 0; i < n; n-- )
rlotun
Der Vergleich in der for-Schleife kann ein beliebiger Ausdruck sein – Sie können i negieren.
for (i = 0; -i < n ; i--)
Robert Davis
Lösung 1
#include <stdio.h>
int main()
{
int i;
int n = 20;
for( i = 0; i < n; n-- ) // Change i-- to n--
printf("-");
return 0;
}
Lösung 2
#include <stdio.h>
int main()
{
int i;
int n = 20;
for( i = 0; -i < n; i-- ) // Compare to -i
printf("-");
return 0;
}
Habe kein drittes gerechnet.
13653200cookie-checkBeheben einer unterbrochenen Schleife durch Ändern genau eines Zeichensyes
Ich denke nicht, dass dies “zu lokalisiert” ist. Während es in der realen Welt vielleicht nicht allzu nützlich ist, ist es ein interessantes Rätsel.
– Javier
23. März 2010 um 20:43 Uhr
Übrigens fehlt uns noch eine Lösung.
– Javier
23. März 2010 um 20:45 Uhr
@Felix: Nun, natürlich tun wir das jetzt nicht. Ich habe das geschrieben, als wir es waren.
– Javier
23. März 2010 um 21:06 Uhr