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

Bogdan Alexandru
fonte
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.

Dan
fonte
é 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

frozenkoi
fonte
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

multidão
fonte
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?

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

Mr Lister
fonte
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
shiona
fonte
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
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 caracteres.

Andrey Regentov
fonte
produzirá mais do que um "0"
Bogdan Alexandru
2
por que o operador ternário não funcionaria?
Andrey Regentov 11/11/12
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.

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

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

marinus
fonte
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)

NRGdallas
fonte
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

Csq
fonte
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;

Toby Speight
fonte
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
coelho bebê
fonte
Boa tentativa, mas viola o requisito: C ++ válido.
Konrad Rudolph
0

Uma variante da resposta do Sr. Lister, mas um pouco menos óbvia.

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

rebocar
fonte
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