Programmierrätsel 1 von m3ph1st0s (C ++) [geschlossen]

26

Dies ist das erste einer Reihe von C ++ - Rätseln für Sie. Ich hoffe, Sie werden es genießen.

Also, Puzzle Nr. 1:

Angesichts des folgenden Programms:

#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

Fügen Sie irgendwo im Programm Code in eine einzelne neue Zeile ein, sodass die Ausgabe 0 lautet. Die neue Zeile enthält höchstens 18 Zeichen (einschließlich Leerzeichen), und die restlichen Zeilen bleiben unverändert. Hier ist ein Beispiel für einen gültigen neuen Code:

#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   int* p = NULL;
   const float c=0.5;
   std::cout << a/b-a*c;
}

Eine neue Zeile mit 15 Zeichen wurde eingefügt, damit es in Ordnung ist. Es löst jedoch nicht das Problem.

Wenn dir das zu einfach ist, mach dir keine Sorgen, es kommt noch mehr !!

Bogdan Alexandru
quelle
2
Ich bin sehr froh, dass gelegentlich jemand eine C ++ - Frage stellt! Ich meine, mit all den Rätseln, bei denen eine C ++ - Lösung 20 oder 30 Zeilen umfassen würde, werden Leute, die Lösungen in J oder K oder Golfscript posten, nach einer Weile frustrierend.
Mr Lister
3
Muss das Ergebnis valides, gut definiertes C ++ sein oder kann es UB verwenden? (Aber wie Herr Lister bemerkte, ist der ursprüngliche Code nicht einmal C ++ gültig.)
Konrad Rudolph
4
es ist nicht gültig. main muss int zurückgeben (lese den c ++ Standard)
BЈовић
2
Wir verpassen den Punkt hier. Setzen Sie ein int und ein return 0, wenn es Ihnen etwas ausmacht, habe ich nicht.
Bogdan Alexandru
11
@ Bogdan: Dafuq? Zum einen ist DevC ++ so unsäglich alt, dass die Ausgabe irrelevant ist. Und zweitens macht es kein gültiges C ++, wenn ein bestimmter Compiler in einer bestimmten Konfiguration zu einem beliebigen Zeitpunkt ein bestimmtes Betriebssystem als Ziel akzeptiert oder nicht.
DeadMG

Antworten:

14
#define int float

sollte auch funktionieren und ist gleich lang.

Dan
quelle
Dies ist, was ich im Sinn hatte, als ich zum ersten Mal auf die Idee kam
Bogdan Alexandru
5
#define int floatist eigentlich undefiniertes Verhalten. Sie dürfen Schlüsselwörtern keine neue Bedeutung geben.
Fredoverflow
Fred, kannst du deine Quellen zitieren? In den GCC-CPP-Dokumenten heißt es: "Sie können jeden gültigen Bezeichner als Makro definieren, auch wenn es sich um ein C-Schlüsselwort handelt."
Dan
@ Dan: Der C ++ Standard verbietet es.
DeadMG
3
Es mag UB sein, aber einige populäre Compiler unterstützen es trotzdem. Ich habe #define int ERRORmich gezwungen, das Äquivalent von int32_tanstelle von eingebauten Typen zu verwenden. Als ich herumkam int main(), hatte ich das Makro vergessen und mich gefragt, warum zum Teufel mein Code nicht kompiliert werden konnte.
Dan04
33

Wir können a = 1 loswerden, indem wir es in einen anderen Bereich verschieben:

#include <iostream>
main() 
{
int a=0;if(0)
    const int a=1;
    const int b=2;
    const float c=0.5;
    std::cout << a/b-a*c;
}

Das sind meiner Meinung nach 13 Zeichen. Oder besser noch eine neue a, die auch 0 ergibt:

#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
if(int a=2)
   std::cout << a/b-a*c;
}

Das sind 11 Zeichen

frozenkoi
quelle
24
#include <iostream>
main() 
{
   const int a=1;
#define a 0
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

1 neue Zeile, 12 neue Zeichen

Mob
quelle
Das ist, was ich einreichen wollte ... +1 für Sie.
H2CO3
Meine erste Idee beim Lesen der Frage)))
Qwertiy
23

Also #define a 0, fertig. Ich habe gesehen, dass das gepostet wurde - nicht überraschend.

Überraschenderweise wurde dies nicht gepostet:

#include <iostream>
main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout<<0||
   std::cout << a/b-a*c;
}

14 Zeichen

Das sollte doch reichen, oder?

sehe
quelle
21
#include <iostream>
main() 
{
const int a=0;//\
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

17 Zeichen.

Das ursprüngliche Programm wird übrigens nicht unter MSVC kompiliert, was sich darüber beschwert, dass maines keinen Rückgabetyp gibt.

Herr Lister
quelle
2
int a = 0; // \ macht auch den Trick
copy
2
Absolut. Aber ist das ein "Shortest Line Wins" -Wettbewerb?
Mr Lister
Ich dachte es mir, aber es ist nicht so. Nizza Trick übrigens
Kopie
2
Ja, die kürzeste Lösung gewinnt auf codegolf SE. Siehe FAQ
BЈовић
2
@ BЈовић die FAQ sagt, dass die kürzeste Lösung für aktuelle Code-Golf-Fragen gewinnt. Diese Frage ist nicht eindeutig eine Code-Golf-Frage.
Kojiro
11

18, einschließlich Newline

#define float int
Shiona
quelle
Ich bin mir nicht sicher, ob das funktioniert ... du hast c als float deklariert und mit 0.5 initialisiert
Bogdan Alexandru
5
Welches wird auf Null abgeschnitten.
DeadMG
du hast recht, komische sache ich bin noch nie auf die initialisierung eines int mit dezimalwert gestoßen, ich hätte gedacht, es wäre ein compilerfehler, aber es wird nur eine
bogdan alexandru
2
@BogdanAlexandru werfen einen Blick auf den C ++ - Standard. Hier wird die implizite Konvertierung im Detail beschrieben.
Oldrinb
2
Beachten Sie, dass der Standard, obwohl alle Compiler dies zulassen, die Neudefinition von Schlüsselwörtern verbietet (und floatein Schlüsselwort ist).
Avakar
11
#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
   1?std::cout<<0:
   std::cout << a/b-a*c;
}

15 Zeichen.

Andrey Regentov
quelle
wird mehr als eine "0" ausgeben
Bogdan Alexandru
2
Warum würde der ternäre Operator nicht funktionieren?
Andrey Regentov
9
#include <iostream>
main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
#define a 0;1
   std::cout << a/b-a*c;
}

14 Zeichen.

FireFly
quelle
7
#include <iostream>
main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
   return puts("0");
   std::cout << a/b-a*c;
}

17 Zeichen.

Ashrr
quelle
1
Die bisher beste Lösung, da sie im Widerspruch zu allem steht, was mit C ++ zu tun hat.
Fabspro
3
`Puts´ wurde in diesem Bereich nicht deklariert
Shiona
@shiona welchen Compiler benutzt du?
Ashrr
@Ashrr gcc (g ++) 4.5.4
Shiona
1
Denken Sie nicht, dieser Code gibt 0 zurück. Sie können das Leerzeichen jedoch durch ein Ausrufezeichen ersetzen. Wie auch immer, ich bin mir nicht sicher, wann Puts Null ergeben.
Qwertiy
7
#include <iostream>
main()
{
   const int a=1;
   const int b=2;
   const float c=0.5;
std::cout<<0;//\
   std::cout << a/b-a*c;
}

Es sind 17 Zeichen, also passt es einfach.

Marinus
quelle
7

Ich kenne C ++ nicht, aber auf der Grundlage der Frage, konnten Sie nicht einfach eine Zeile eingeben, um einfach 0 auszugeben? Die Frage gibt an, dass die Ausgabe 0 sein soll. Sie gibt nicht an, dass Sie die Ausgabe auf 0 ÄNDERN müssen.

std::cout << 0

(Ich habe keine Ahnung von C ++, vielleicht kann jemand dieses Konzept verwenden)

NRGdallas
quelle
Na ja, die Ausgabe sollte nur 0 sein, ich dachte es wäre offensichtlich, sonst gäbe es doch kein Rätsel, oder?
Bogdan Alexandru
7
@ BogdanAlexandru Sie werden feststellen, dass das Ausnutzen einer schlecht geschriebenen Frage eine übliche Technik zum Lösen dieser Rätsel ist. Wenn Sie verhindern möchten, dass Benutzer diese Verknüpfungen verwenden, analysieren Sie einige Minuten länger Ihre eigene Frage und versuchen Sie, mögliche Unklarheiten zu beseitigen.
Ardnew
3

12 Zeichen, ähnlich der Lösung von Mob

#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
#define a b
   std::cout << a/b-a*c;
}

andere kombinationen funktionieren auch, wie #define a coder#define c 0

Csq
quelle
2

Ich weiß, dass es kein , aber ich scheine diesen Hut heute zu tragen!

#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;

--ein;

   std::cout << a/b-a*c;
}

fünf Zeichen, einschließlich der Newline;

Toby Speight
quelle
2
Dies kompiliert nicht, weil aist const.
Csq
Hoppla, ich hätte es einem Compiler geben sollen! :-(
Toby Speight
0

C ++ was auch immer ...

echo "0"; exit
#include <iostream>
int main() 
{
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

laufen über:

sh mp.cpp
Baby-Kaninchen
quelle
Netter Versuch, verstößt aber gegen die Vorgabe: gültiges C ++.
Konrad Rudolph
0

Eine Variante der Antwort von Herrn Lister, aber etwas weniger offensichtlich.

#include <iostream>
int main() 
{
   const float a=1; //??/
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}
Toby Speight
quelle
-1
#include <iostream>
int main() 
{
int a;if(a)
   const int a=1;
   const int b=2;
   const float c=0.5;
   std::cout << a/b-a*c;
}

Wie wäre es mit diesen 11 Zeichen ...

Abschleppen
quelle
1
Das Problem hierbei ist, dass das int avorher ifnicht initialisiert wird, also akeinen Wert haben könnte.
Frozenkoi
1
Dies ist undefiniert. Sie verwenden einen nicht initialisierten Wert für a.
Konrad Rudolph