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!


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.


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


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


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?


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.


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

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


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


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)


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


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;


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

Buen intento pero viola el requisito: C ++ válido.
Konrad Rudolph el


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


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.