Este es el tercero de mi serie de rompecabezas C / C ++; en caso de que te hayas perdido los primeros 2 están aquí: (1) rompecabezas de programación de m3ph1st0s 1 (C ++) (2) rompecabezas de programación de m3ph1st0s 2 (C ++): "¡Llama duro!"
Debo decir que mis rompecabezas son 100% originales. Si no, siempre lo diré en el texto. Mi tercer rompecabezas tiene 2 partes de la siguiente manera:
Puzzle 3.1
Esta parte (3.1) no es un rompecabezas original mío, está recopilada de alguna página de Internet que he leído hace un tiempo. Lo uso aquí como punto de partida y un calentamiento para ti. Resuelve este y luego pasa a la segunda parte.
Alguien intentó imprimir el signo "+" 20 veces y se le ocurrió el siguiente programa:
#include <stdio.h>
int main() {
int i;
int n = 20;
for( i = 0; i < n; i-- )
printf("+");
return 0;
}
El hecho de que no tuvo el resultado esperado es obvio: el programa nunca termina. ¡Arreglalo! ¿Fácil? Ahora arregle el programa cambiando SÓLO UN CARÁCTER - ¡un personaje que no sea espacial, por supuesto! Para este desafío hay 3 soluciones. Encuentra los 3 de ellos. Solo para dejarlo claro: el programa debe generar 20 signos "+" y debe terminar rápidamente. Antes de criticarme por lo que significa "rápido", diré que significa como máximo un par de segundos (que por cierto es demasiado, pero solo para que quede claro como el cristal).
Puzzle 3.2
EDITADO Se me señaló anteriormente que la solución para el rompecabezas 3.2.2 podría depender del compilador. Para eliminar cualquier posible discusión sobre el tema, modificaré la idea y la mejoraré en el próximo acertijo cuando tenga mucho cuidado de no generar controversia. Sin embargo, para mantener este rompecabezas, haré una pequeña modificación para 3.2.2 (la solución será más fácil pero más limpia).
Cuando vi el rompecabezas por primera vez, lo encontré increíble. Logré resolverlo, pero no de inmediato, ya que requiere una atención cuidadosa. Si estás aquí significa que tú también lo resolviste. Si lo hizo escribiendo un programa para reemplazar todos los caracteres posibles con todos los valores posibles y probar cada solución, está perdido. Trabajador duro sin embargo. Ahora que ha corregido el programa que escribe 20 signos "+":
3.2.1: Inserte una sola letra y nada más en el código para que el resultado sea válido y genere lo mismo en los 3 programas corregidos. No hace falta decir que la carta debe estar antes del adjunto} de main (lo digo porque no quiero escuchar a las personas que simplemente pusieron una carta después del programa y de alguna manera su compilador fue muy amigable).
EDITADO (ver más abajo): para estas preguntas finales, considere que el contador i comienza desde -1 en lugar de 0.
3.2.1.5: Repita todos los problemas anteriores con la condición de que la salida tenga al menos 19 signos "+" (pero aún una salida finita). Se permite cambiar espacios. Ahora puede haber encontrado más soluciones que en el primer caso. Algunos de estos encajarán definitivamente para la pregunta 3.2.2.
3.2.2: Elija otro valor para inicializar la variable n para que la salida resultante permanezca igual para al menos uno de los programas corregidos en 3.2.1.5 (no necesariamente para todos ellos).
ÚLTIMA EDICIÓN1 : cambiar el programa para que muestre 21 signos "+" sigue siendo una buena solución, ya que el texto original no decía 20 signos "exactamente". Sin embargo, la salida infinita está prohibida. Obviamente, esto no significa que todos comencemos a generar cientos de signos "+", ya que no está prohibido. Pero eliminar una hermosa salida 21 no estaría en el espíritu de esta competencia.
LAST EDIT2 : considerando LAST EDIT1 y aceptando el cambio de espacio , parece que ahora tenemos 5 posibles soluciones, cuatro de las cuales ya se han señalado en las respuestas. Sin embargo, el último desafío no se ha tocado y debo dejarlo claro una vez más: a n se le debe asignar otro valor , las soluciones que asignan 20 an por algunos trucos no lo harán (como n = 20L). También prefiero ver la tercera solución que no cambia espacios.
ÚLTIMA EDICIÓN3 : ¡He editado las últimas preguntas, por favor lea!
El desafío es resolver ambas partes del rompecabezas. El primero en hacerlo gana.
Espero que todo esté claro, si no, publique cualquier pregunta y la editaré lo más rápido posible. Salud. texto enfatizado
fuente
Respuestas:
3.1
Cualquiera de estos cambios hará que el programa muestre 20 '+' signos. Este está cerca:
Produce 21 '+' signos.
3.2.1
Encontré al menos 112 formas de resolver este problema insertando una letra. No todos ellos pueden funcionar en todos los compiladores.
Para los dos últimos, sustituya cualquier letra para
x
darle 104 posibles soluciones. El uso de cualquiera de las dos últimas líneas cambiará la salida, pero la salida seguirá siendo la misma para los 3 programas corregidos.3.2.2
Todo lo que se me ocurre son algunas cosas que se devuelven al número 20 en la asignación
int
.fuente
f
yd
sufijos para losint
tipos (así,d
para cualquier tipo para el caso), pero hay algunos otros que has dejado fuera:int n = 20l
,int n = 20U
, yint n = 20u
. Además, no creo queuint
sea un identificador de tipo estándar en C o C ++. ¿Qué compilador usas para estos de todos modos?3.1
Otro rompecabezas más. Pero las soluciones normales son aburridas, ¿qué pasa con algo especial?
Solución uno:
Decidí cambiar sólo un carácter, es decir,
-
. No-
se cambiaron otros caracteres que no sean .Solución dos:
Esto cambia exactamente un carácter - el punto y coma después
int i
en=printf("++++++++++++++++++++");exit(0);
.Solución tres:
Esto carga el
stdix.h
encabezado del sistema. En la ruta de inclusión del sistema, inserte el siguiente archivo, llamado stdix.h. Tiene que contener los siguientes contenidos.3.2
Ahora para insertar una letra. Bueno, eso es simple, reemplazar
int main()
conint main(a)
. Esto no es válido según los estándares, pero ¿a quién le importa?fuente
Puzzle 3.1 Respuestas
i--
an--
(demo: http://ideone.com/l0Y10 )i < n
ai + n
(demo: http://ideone.com/CAqWO )[SPACE]i < n
a-i < n
. (demo: http://ideone.com/s5Z2r )Puzzle 3.2.1
Cambie
int n = 20
aint n = 20L
(agregue unL
al final).Puzzle 3.2.2
Todavía no he encontrado una respuesta ...
fuente
3.1
i--
an--
i<n
a-i<n
3.2.1
a
(Depende del compilador ...)
3.2.2
imprime 19 signos +, igual que con
int n = 20L;
. Sin embargo, no se me habría ocurrido si no hubiera visto otras respuestas a 3.2.1fuente
fuente