Puzzle de programmation 1 de m3ph1st0s (C ++) [fermé]

26

Ceci est le premier d'une série de puzzles C ++ pour vous. J'espère que vous apprécierez.

Alors, puzzle n ° 1:

Étant donné le programme suivant:

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

Insérez du code sur une seule nouvelle ligne n'importe où dans le programme afin que la sortie soit 0. La nouvelle ligne contiendra AU PLUS 18 caractères (espaces compris) et le reste des lignes ne sera pas modifié. Pour être clair, voici un exemple d'un nouveau code valide:

#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;
}

Une nouvelle ligne avec 15 caractères a été insérée, donc ça va. Cependant, cela ne résout pas le problème.

Si c'est trop simple pour vous, ne vous inquiétez pas, d'autres arrivent !!

Bogdan Alexandru
la source
2
Je suis très heureux que quelqu'un poste occasionnellement une question C ++! Je veux dire, avec toutes les énigmes où une solution C ++ serait de 20 ou 30 lignes, alors les gens qui affichent des solutions en J ou K ou Golfscript deviennent frustrants après un certain temps.
M. Lister
3
Le résultat doit-il être C ++ valide et bien défini ou peut-il utiliser UB? (Mais comme l'a noté M. Lister, le code d'origine n'est même pas valide en C ++.)
Konrad Rudolph
4
ce n'est pas valable. main doit retourner int (lire la norme c ++)
BЈовић
2
il nous manque le point ici. mettre un int et un retour 0 si cela vous dérange, je ne l'ai pas fait.
Bogdan Alexandru, le
11
@Bogdan: Dafuq? D'une part, DevC ++ est si indiciblement ancien, sa sortie n'est pas pertinente. Et deuxièmement, si un compilateur donné dans une configuration donnée à tout moment et ciblant un système d'exploitation l'accepte, cela ne le rend pas valide en C ++.
DeadMG

Réponses:

14
#define int float

devrait également fonctionner et est de la même longueur.

Dan
la source
c'est ce que j'avais en tête lorsque j'ai eu l'idée pour la première fois
Bogdan Alexandru
5
#define int floatest en fait un comportement indéfini. Vous n'êtes pas autorisé à donner un nouveau sens aux mots clés.
fredoverflow
Fred, pouvez-vous citer vos sources? Les documents GCC cpp disent "Vous pouvez définir tout identifiant valide comme une macro, même s'il s'agit d'un mot clé C."
Dan
@Dan: La norme C ++ l'interdit.
DeadMG
3
Il peut s'agir d'UB, mais plusieurs compilateurs populaires le prennent quand même en charge. J'ai fait #define int ERRORpour me forcer à utiliser l'équivalent de int32_tau lieu des types intégrés. Au moment où je me suis rendu int main(), j'avais oublié la macro et je me demandais pourquoi diable mon code ne compilerait pas.
dan04
33

Nous pouvons nous débarrasser de a = 1 en le déplaçant dans une autre portée:

#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;
}

C'est je pense 13 caractères. Ou mieux encore, obtenez un nouveau aqui se traduit également par 0:

#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;
}

C'est 11 caractères

surgelé
la source
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 nouvelle ligne, 12 nouveaux caractères

foule
la source
C'est ce que je voulais soumettre ... +1 pour vous.
H2CO3
Ma première idée en lisant la question)))
Qwertiy
23

Alors #define a 0, c'est fait. J'ai vu que cela avait été publié - sans surprise.

Étonnamment, cela n'a pas été publié:

#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 caractères

Cela devrait faire, non?

sehe
la source
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 caractères.

Par ailleurs, le programme d'origine ne compile pas sous MSVC, qui se plaint de mainne pas avoir de type de retour.

Mr Lister
la source
2
int a = 0; // \ fera également l'affaire
copie le
2
Absolument. Mais s'agit-il d'un concours de type "ligne la plus courte gagne"?
M. Lister
Je le pensais, mais ce n'est pas le cas. Bon truc en passant
copie le
2
Oui, la solution la plus courte l'emporte sur codegolf SE. voir faq
BЈовић
2
@ BЈовић la FAQ indique que la solution la plus courte l'emporte pour les questions de code-golf réelles. Cette question n'est pas clairement une question de code-golf.
kojiro
11

18, y compris la nouvelle ligne

#define float int
shiona
la source
Je ne suis pas vraiment sûr que cela fonctionne ... ur déclarer c comme un flottant et l'initialiser avec 0,5
Bogdan Alexandru
5
Ce qui tronquera à zéro.
DeadMG
vous avez raison, chose drôle, je n'ai jamais rencontré d'initialisation d'un int avec une valeur décimale, je pensais que ce serait une erreur de compilation, mais cela ne fait qu'émettre un avertissement
Bogdan Alexandru
2
@BogdanAlexandru jette un œil au standard C ++, il détaille spécifiquement la conversion implicite en jeu ici.
oldrinb
2
Notez que bien que tous les compilateurs le permettent, la norme interdit la redéfinition des mots clés (et floatest un mot clé).
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 caractères.

Andrey Regentov
la source
produira plus d'un "0"
Bogdan Alexandru
2
pourquoi l'opérateur ternaire ne fonctionnerait pas?
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 caractères.

Luciole
la source
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 caractères.

Ashrr
la source
1
La meilleure solution pour l'instant, car elle va à l'encontre de tout ce qui concerne le C ++.
fabspro
3
`met´ n'a pas été déclaré dans cette portée
shiona
@shiona quel compilateur utilisez-vous?
Ashrr
@Ashrr gcc (g ++) 4.5.4
shiona
1
Ne pensez pas, ce code renvoie 0. Mais vous pouvez remplacer l'espace via un point d'exclamation. Quoi qu'il en soit, je ne sais pas quand le put renvoie zéro.
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;
}

C'est 17 caractères donc ça va juste.

marinus
la source
7

Je ne connais pas le C ++, mais sur la base de la question, ne pourriez-vous pas simplement entrer une ligne pour simplement sortir 0? la question spécifie que la sortie doit être 0, elle ne spécifie pas que vous devez CHANGER la sortie à 0.

std::cout << 0

(J'ai 0 indice sur C ++, peut-être que quelqu'un peut utiliser ce concept cependant)

NRGdallas
la source
Eh bien, la sortie devrait être juste 0, je pensais que c'était évident, sinon il n'y aurait pas de casse-tête, n'est-ce pas?
Bogdan Alexandru
7
@BogdanAlexandru Vous constaterez que l'exploitation d'une question mal écrite est une technique courante pour résoudre ces énigmes. Si vous souhaitez empêcher les utilisateurs de prendre ces raccourcis, passez quelques minutes supplémentaires à analyser votre propre question et essayez de lever toute ambiguïté potentielle.
ardnew
3

12 caractères, similaire à la solution de 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;
}

d'autres combinaisons fonctionnent également, comme #define a cou#define c 0

Csq
la source
2

Je sais que ce n'est pas , mais il semble que je porte ce chapeau aujourd'hui!

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

--une;

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

cinq caractères, y compris la nouvelle ligne;

Toby Speight
la source
2
Cela ne compile pas, car il l' aest const.
Csq
Oups, j'aurais dû le donner à un compilateur! :-(
Toby Speight
0

c ++ quoi que ...

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;
}

courir via:

sh mp.cpp
bébé-lapin
la source
Bien essayé mais viole l'exigence: C ++ valide.
Konrad Rudolph du
0

Une variante de la réponse de M. Lister mais un peu moins évidente.

#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
la source
-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;
}

Que diriez-vous de ces 11 caractères ...

remorquer
la source
1
Le problème ici est que l' int aavant avant ifn'est pas initialisé, il apourrait donc avoir n'importe quelle valeur.
freezkoi
1
Ceci n'est pas défini, vous utilisez une valeur non initialisée pour a.
Konrad Rudolph