Puzzle de programación de m3ph1st0s 1 (C ++) [cerrado]

26

Este es el primero de una serie de rompecabezas de C ++ para ti. Espero que lo disfrutes.

Entonces, rompecabezas no.1:

Dado el siguiente programa:

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

Inserte algún código en una sola línea nueva en cualquier lugar dentro del programa para que la salida sea 0. La nueva línea contendrá MÁS DE 18 caracteres (incluidos los espacios), y el resto de las líneas permanecerán sin modificaciones. Para ser claros, aquí hay un ejemplo de un nuevo 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;
}

Se insertó una nueva línea con 15 caracteres, por lo que está bien. Sin embargo, no resuelve el problema.

Si esto es demasiado simple para ti, no te preocupes, ¡viene más!

Bogdan Alexandru
fuente
2
¡Estoy muy feliz de que alguien publique una pregunta de C ++ ocasionalmente! Quiero decir, con todos los acertijos en los que una solución de C ++ sería de 20 o 30 líneas, la gente que publica soluciones en J o K o Golfscript se vuelve frustrante después de un tiempo.
Sr. Lister
3
¿El resultado tiene que ser válido, bien definido C ++ o puede usar UB? (Pero como señaló el Sr. Lister, el código original ni siquiera es válido C ++.)
Konrad Rudolph
44
No es válido. main debe devolver int (lea el estándar de c ++)
Bћовић
2
Nos estamos perdiendo el punto aquí. pon un int y un return 0 si te importa, no lo hice.
Bogdan Alexandru
11
@Bogdan: Dafuq? Por un lado, DevC ++ es tan indescriptiblemente antiguo que su salida es irrelevante. Y en segundo lugar, si un compilador determinado en cualquier configuración dada en cualquier momento que apunte a cualquier sistema operativo lo acepte, no lo hace válido en C ++.
DeadMG

Respuestas:

14
#define int float

debería funcionar también y tiene la misma longitud.

Dan
fuente
esto es lo que tenía en mente cuando se me ocurrió la idea
Bogdan Alexandru,
55
#define int floatEn realidad es un comportamiento indefinido. No está permitido dar a las palabras clave un nuevo significado.
fredoverflow
Fred, ¿puedes citar tus fuentes? Los documentos cpp de GCC dicen "Puede definir cualquier identificador válido como una macro, incluso si es una palabra clave C".
Dan
@Dan: El estándar C ++ lo prohíbe.
DeadMG
3
Puede ser UB, pero varios compiladores populares lo admiten de todos modos. He hecho #define int ERRORpara obligarme a usar el equivalente de en int32_tlugar de los tipos incorporados. Cuando llegué int main(), me había olvidado de la macro y me preguntaba por qué diablos mi código no se compilaría.
dan04
33

Podemos deshacernos de a = 1 moviéndolo a otro ámbito:

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

Esto es creo 13 personajes. O mejor aún, obtenga una nueva aque también resulte en 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;
}

Eso son 11 caracteres

frozenkoi
fuente
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 nueva línea, 12 nuevos caracteres

multitud
fuente
Eso es lo que quería enviar ... +1 para ti.
H2CO3
Mi primera idea cuando leí la pregunta)))
Qwertiy
23

Entonces #define a 0, hecho. Vi que fue publicado, como era de esperar.

Sorprendentemente, esto no fue 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

Eso debería hacer, ¿verdad?

sehe
fuente
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

Por cierto, el programa original no se compila bajo MSVC, que se queja de que mainno tiene un tipo de retorno.

Señor lister
fuente
2
int a = 0; // \ también hará el truco
copie el
2
Absolutamente. Pero, ¿se trata de un concurso del tipo "la línea más corta gana"?
Sr. Lister
Pensé que sí, pero no lo es. Buen truco, por cierto
copia el
2
Sí, la solución más corta gana en codegolf SE. ver FAQ
BЈовић
2
@ BЈовић las preguntas frecuentes dicen que la solución más corta gana para las preguntas de código de golf reales Esta pregunta no es claramente una pregunta de código de golf.
kojiro
11

18, incluyendo nueva línea

#define float int
shiona
fuente
No estoy realmente seguro de que esto funcione ... estás declarando c como un flotador e inicializándolo con 0.5
Bogdan Alexandru
55
Que se truncará a cero.
DeadMG
tienes razón, cosa curiosa que nunca he encontrado inicializando un int con valor decimal, pensé que sería un error del compilador, pero solo emite una advertencia
Bogdan Alexandru
2
@BogdanAlexandru echa un vistazo al estándar C ++, detalla específicamente la conversión implícita en juego aquí.
oldrinb
2
Tenga en cuenta que aunque todos los compiladores lo permiten, el estándar prohíbe redefinir palabras clave (y floates una palabra clave).
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
fuente
generará más de un "0"
Bogdan Alexandru
2
¿Por qué el operador ternario no funcionaría?
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 caracteres.

Luciérnaga
fuente
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
fuente
1
La mejor solución hasta ahora, porque se opone a cualquier cosa relacionada con C ++.
fabspro
3
'put' no fue declarado en este ámbito
shiona
@shiona ¿qué compilador estás usando?
Ashrr
@Ashrr gcc (g ++) 4.5.4
shiona
1
No piense, este código devuelve 0. Pero puede reemplazar el espacio mediante un signo de exclamación. De todos modos, no estoy seguro de cuándo pone devuelve cero.
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;
}

Tiene 17 caracteres, así que simplemente encaja.

marinus
fuente
7

No conozco C ++, sin embargo, basándome en la pregunta, ¿no podría simplemente ingresar una línea para simplemente generar 0? la pregunta especifica que la salida debe ser 0, no especifica que debe CAMBIAR la salida a 0.

std::cout << 0

(Tengo 0 pistas en C ++, aunque quizás alguien pueda usar este concepto)

NRGdallas
fuente
Oh, bueno, la salida debería ser solo 0, pensé que era obvio, de lo contrario no habría rompecabezas, ¿verdad?
Bogdan Alexandru
77
@BogdanAlexandru Descubrirás que explotar una pregunta mal escrita es una técnica común para resolver estos acertijos. Si desea evitar que los usuarios tomen estos atajos, dedique unos minutos adicionales a analizar su propia pregunta e intente eliminar cualquier posible ambigüedad.
ardnew
3

12 caracteres, similar a la solución de la mafia

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

otras combinaciones también funcionan, como #define a co#define c 0

Csq
fuente
2

Sé que no es , ¡pero parece que hoy llevo ese sombrero!

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

--una;

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

cinco caracteres, incluida la nueva línea;

Toby Speight
fuente
2
Esto no se compila, porque aes const.
Csq
¡Vaya, debería haberlo dado a un compilador! :-(
Toby Speight
0

c ++ lo que sea ...

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

ejecutar a través de:

sh mp.cpp
conejo bebé
fuente
Buen intento pero viola el requisito: C ++ válido.
Konrad Rudolph el
0

Una variante de la respuesta del señor Lister pero un poco menos obvia.

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

¿Qué tal estos 11 caracteres ...

remolcar
fuente
1
El problema aquí es que el int aantes del ifno se está inicializando, por lo que apodría tener algún valor.
frozenkoi
1
Esto no está definido, está utilizando un valor no inicializado para a.
Konrad Rudolph el