Programmierpuzzle 3 (C) von m3ph1st0s: „Easy Bug“ [geschlossen]

11

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

Bogdan Alexandru
quelle
Ich gehe davon aus, dass das Ändern eines Zeichens das Ändern von Leerzeichen in Nicht-Leerzeichen umfasst. Wenn ja, ich denke, ich habe alle 3 Lösungen für Teil 1 gefunden.
Mellamokb
oh..sorry..Ich hatte vor, das explizit zu leugnen, aber ich habe es vergessen. Ich werde jetzt bearbeiten. Danke fürs fragen.
Bogdan Alexandru
Oh gut. Weil ich für meine aktuellen 3 Lösungen keine Antwort für Teil 3.2.2 finden kann ... Ich denke, das bedeutet, dass ich noch eine suchen muss :)
mellamokb
ja :) viel Glück dabei
Bogdan Alexandru
1
@ardnew: Ich glaube nicht, dass das OP einmal die ursprüngliche Absicht der Frage geändert hat. Ich bin damit einverstanden, dass es bessere Möglichkeiten gibt, die Frage zu beheben, als am Ende eine Reihe von Bearbeitungen zusammenzufassen ... aber es ist immer noch die gleiche Frage, bei der einige Dinge geklärt sind.
Mellamokb

Antworten:

8

3.1

for( i = 0;-i < n; i-- )
for( i = 0; i < n; n-- )
for( i = 0; i + n; i-- )

Bei jeder dieser Änderungen gibt das Programm 20 '+' Zeichen aus. Dieser ist nah:

for( i = 0;~i < n; i-- )

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.

int n = 20L;
int n = 20f;
int n = 20d;
uint n = 20;

for( i = 0L; ... )
for( i = 0f; ... )
for( i = 0d; ... )

iprintf("+");
printf("+x");
printf("x+");

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.

int n = 20L;
int n = 20.001;
int n = 20.999;
int n = 20 + 0x100000000L;
Mob
quelle
Ja, Sie haben genau die gleichen Antworten wie ich (ich habe sie vorher nicht gepostet, weil ich nicht alles beantwortet habe). Ich denke, die Antwort auf 3.2.2 liegt in der dritten Lösung zu 3.1, die keiner von uns gefunden hat (und die Regel befolgt, dass der Raum nicht geändert werden darf).
Mellamokb
Auf 3.2.1, ich bin nicht sicher über den fund dSuffixe für intTypen (na ja, dfür jede Art für diese Angelegenheit), aber es gibt ein paar andere , die Sie links ab haben: int n = 20l, int n = 20U, und int n = 20u. Ich glaube auch nicht, dass uintes sich um eine Standardtypkennung in C oder C ++ handelt. Welchen Compiler verwenden Sie überhaupt für diese?
Neu
Sie haben hier ziemlich gute Arbeit geleistet, aber nicht vollständig! Erstens ist die ~ i-Lösung immer noch gut! Die Anforderung bestand darin, 20 "+" - Zeichen auszugeben, sodass 21 immer noch eine gute Lösung ist (die einzige schlechte Lösung ist die unendliche Ausgabe). Damit haben Sie jetzt 4 Lösungen gefunden! Und das Lustige ist, ich habe noch eine :) Über die 3.2.2 ist es schlecht, da ich speziell den Wert von n ändern musste, um nicht ein paar Tricks zu machen, um es 20 zu machen :)
Bogdan Alexandru
1
Außerdem ändern sowohl die -i- als auch die ~ i-Lösung die Leerzeichen, sodass ich sie als "Teillösungen" betrachte. Die 3. vollständige Lösung muss ein Nicht-Leerzeichen ändern, wie im Quiztext angegeben
Bogdan Alexandru
1
Sie haben das Problem nicht verstanden. Ich sagte, dass die Änderung die gleiche Ausgabe wie das entsprechende modifizierte Programm erzeugen wird. das heißt, ich habe die korrigierten Programme C1, C2, C3. Nach der Zeicheneinfügung habe ich P1, P2, P3. Die Anforderung ist: P1 hat den gleichen Ausgang wie C1, P2 hat den gleichen Ausgang wie C2, P3 hat den gleichen Ausgang wie C3. Es ist NICHT P1, P2, P3 mit der gleichen Ausgabe
Bogdan Alexandru
2

3.1

Noch ein Rätsel. Aber normale Lösungen sind langweilig, was ist mit etwas Besonderem?

Lösung eins:

#include <stdio.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i++ )
      printf("+");
   return 0;
}

Ich beschloss, NUR EINEN CHARAKTER zu ändern -. Keine anderen Zeichen als -wurden geändert.

Lösung zwei:

#include <stdio.h>
int main() {
   int i=printf("++++++++++++++++++++");exit(0);
   int n = 20;
   for( i = 0; i < n; i-- )
      printf("+");
   return 0;
}

Dies ändert genau ein Zeichen - das Semikolon danach int iin =printf("++++++++++++++++++++");exit(0);.

Lösung drei:

#include <stdix.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i-- )
      printf("+");
   return 0;
}

Dies lädt den stdix.hSystemheader. Fügen Sie im Systemeinschlusspfad die folgende Datei mit dem Namen stdix.h ein. Es muss folgenden Inhalt enthalten.

static inline void printf(const char *string) {
    int i;
    for(i = 0; i < 20; i--)
        putchar('+');
    exit(0);
}

3.2

Fügen Sie nun einen Buchstaben ein. Nun, das ist einfach, ersetzen Sie int main()durch int main(a). Dies gilt nicht nach Standards, aber wen interessiert das?

Konrad Borowski
quelle
0

Puzzle 3.1 Antworten

  1. Wechseln i--zu n--(Demo: http://ideone.com/l0Y10 )
  2. Wechseln i < nzu i + n(Demo: http://ideone.com/CAqWO )
  3. Wechseln Sie [SPACE]i < nzu -i < n. (Demo: http://ideone.com/s5Z2r )

Puzzle 3.2.1

Wechseln Sie int n = 20zu int n = 20L( Lam Ende ein hinzufügen ).

Puzzle 3.2.2

Ich habe noch keine Antwort gefunden ...

mellamokb
quelle
gute Standardlösung für 3.1 und 3.2.1.
Bogdan Alexandru
0

3.1

  1. Wechseln Sie i--zun--
  2. i<n zu -i<n
  3. (Leider ungültige Antwort, da ich nicht beim Compiler nachgefragt habe, bevor ich andere Antworten gesehen habe)

3.2.1

int n = 20 

zu

uint n = 20

(Compiler abhängig ...)

3.2.2

int n =-20L;

for(i = -1; i%n; i--)

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ätte

Dissident Pinguin
quelle
0
#include <stdio.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i++  )
      printf("+");
        printf("\n");
   return 0;
}
CHINMAY AGRAWAL
quelle
1
Stellen Sie sicher, dass Sie die Programmsprache und die Anzahl der Zeichen zu Ihrer Antwort hinzufügen.
Timtech
1
@ Timtech warum Zeichenanzahl? Dies ist kein Code-Golf
stolzer Haskeller
1
@ Timtech auch warum die Sprache einschließen? Dies ist eine sprachspezifische Herausforderung.
stolzer Haskeller