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 !!


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.


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


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


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?


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.


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

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


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.


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.


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.


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)


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


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;


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

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

-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 ...


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

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.