Quebra-cabeça de programação 1 de m3ph1st0s (C ++) [fechado]


26

Este é o primeiro de uma série de quebra-cabeças em C ++ para você. Espero que você goste.

Então, o quebra-cabeça no.1:

Dado o seguinte programa:

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

Insira algum código em uma única nova linha em qualquer lugar do programa para que a saída seja 0. A nova linha conterá no máximo 18 caracteres (incluindo espaços) e o restante das linhas permanecerá inalterado. Para ficar claro, aqui está um exemplo de um novo código válido:

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

Uma nova linha com 15 caracteres foi inserida, então está tudo bem. No entanto, isso não resolve o problema.

Se isso é muito simples para você, não se preocupe, mais está chegando !!


2
Estou muito feliz que alguém poste uma pergunta em C ++ ocasionalmente! Quero dizer, com todos os quebra-cabeças em que uma solução C ++ seria de 20 ou 30 linhas, as pessoas que postam soluções em J ou K ou Golfscript ficam frustradas depois de um tempo.
Mr Lister

3
O resultado precisa ser C ++ válido e bem definido, ou ele pode usar UB? (Mas como o Sr. Lister observou, o código original não é ainda válida C ++.)
Konrad Rudolph

4
não é válido. int main deve retornar (leia o padrão C ++)
BЈовић

2
estamos perdendo o objetivo aqui. coloque um int e um retorno 0 se você se importa, eu não fiz.
Bogdan Alexandru

11
@Bogdan: Dafuq? Por um lado, o DevC ++ é tão indizivelmente antigo que sua saída é irrelevante. E segundo, se um compilador em uma determinada configuração, a qualquer momento, visando um sistema operacional, aceita ou não, ele não o torna válido em C ++.
DeadMG

Respostas:


14
#define int float

deve funcionar bem e tem o mesmo comprimento.


é isso que eu tinha em mente quando vim pela primeira vez com a idéia
Bogdan Alexandru

5
#define int floaté realmente um comportamento indefinido. Você não tem permissão para dar um novo significado às palavras-chave.
Fredoverflow 28/09/12

Fred, você pode citar suas fontes? Os documentos do GCC cpp dizem "Você pode definir qualquer identificador válido como uma macro, mesmo que seja uma palavra-chave C."
Dan

@ Dan: O padrão C ++ proíbe.
DeadMG

3
Pode ser UB, mas vários compiladores populares o suportam de qualquer maneira. Eu fiz #define int ERRORpara me forçar a usar o equivalente em int32_tvez de tipos internos. No momento em que cheguei int main(), já havia esquecido a macro e me perguntado por que diabos meu código não seria compilado.
precisa saber é o seguinte

33

Podemos nos livrar de a = 1 movendo-o para outro escopo:

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

Acho que são 13 caracteres. Ou melhor ainda, obtenha um novo aque também resulte em 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;
}

São 11 caracteres


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 nova linha, 12 novos caracteres


Era isso que eu queria enviar ... +1 para você.
H2CO3

Minha primeira idéia quando li a pergunta)))
Qwertiy

23

Então #define a 0, Feito. Vi que foi publicado - sem surpresa.

Surpreendentemente, isso não foi publicado:

#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 caracteres

Isso deve fazer, certo?


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

A propósito, o programa original não é compilado no MSVC, que reclama que mainnão tem um tipo de retorno.


2
int a = 0; // \ também fará o truque
copie

2
Absolutamente. Mas esse é o tipo de concurso "a linha mais curta ganha"?
Sr. Lister

Eu pensei que sim, mas não é. Bom truque, a propósito
copie

2
Sim, a solução mais curta vence no codegolf SE. ver
perguntas mais

2
@ Bem, o FAQ diz que a solução mais curta vence para perguntas reais sobre golfe com código. Esta questão não é claramente uma questão de código-golfe.
Kojiro # 29/12

11

18, incluindo nova linha

#define float int

Estou realmente não tenho certeza isso funciona ... ur c declarando como uma bóia e inicializando-lo com 0,5
Bogdan Alexandru

5
O qual será truncado para zero.
DeadMG

Você está certo, coisa engraçada Eu nunca se deparar inicializar um int com valor decimal, eu pensei que seria compilador erro, mas ele só emite um aviso
Bogdan Alexandru

2
O @BogdanAlexandru estuda o padrão C ++, detalhando especificamente a conversão implícita em jogo aqui.
oldrinb

2
Observe que, embora todos os compiladores permitam isso, o padrão proíbe a redefinição de palavras-chave (e floaté uma palavra-chave).
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 caracteres.


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


1
A melhor solução ainda, porque ela se opõe a qualquer coisa relacionada ao C ++.
Fabspro

3
`put 'não foi declarado neste escopo
shiona 30/09/12

@ shiona qual compilador você está usando?
Ashrr

@Ashrr gcc (g ++) 4.5.4
shiona

1
Não pense, esse código retorna 0. Mas você pode substituir o espaço via ponto de exclamação. Enfim, não sei ao certo quando o put devolve zero.
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;
}

São 17 caracteres, então cabe.


7

Eu não sei C ++, no entanto, com base na pergunta, você não pode simplesmente inserir uma linha para simplesmente gerar 0? a pergunta especifica que a saída deve ser 0, não especifica que você deve alterar a saída para 0.

std::cout << 0

(Eu tenho 0 pista sobre C ++, talvez alguém possa usar esse conceito)


Oh, bem, a saída deve ser apenas 0, eu pensei que era óbvio, caso contrário não haveria quebra-cabeça, seria?
Bogdan Alexandru

7
@BogdanAlexandru Você descobrirá que explorar uma pergunta mal escrita é uma técnica comum para resolver esses quebra-cabeças. Se você deseja impedir que os usuários tomem esses atalhos, gaste alguns minutos extras analisando sua própria pergunta e tente remover qualquer ambiguidade em potencial.
ardnew

3

12 caracteres, semelhante à solução da 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;
}

outras combinações também funcionam, como #define a cou#define c 0


2

Eu sei que não é , mas eu pareço estar usando esse chapéu hoje!

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

--uma;

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

cinco caracteres, incluindo a nova linha;


2
Isso não compila, porque aé const.
CSQ

Opa, eu deveria ter dado a um compilador! :-(
Toby Speight

0

c ++ seja qual for ...

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

executar através de:

sh mp.cpp

Boa tentativa, mas viola o requisito: C ++ válido.
Konrad Rudolph


-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 tal esses 11 caracteres ...


1
O problema aqui é que o int aantes do ifnão está sendo inicializado, portanto, apode ter algum valor.
Frozenkoi 01/10/12

1
Isso é indefinido, você está usando um valor não inicializado para a.
Konrad Rudolph

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.