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.