Puzzle de programación de m3ph1st0s 3 (C): "Error fácil" [cerrado]


11

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


¿Asumo que cambiar un personaje incluye cambiar cualquier espacio a caracteres que no sean espacios? Si es así, creo que he encontrado las 3 soluciones para la parte 1.
mellamokb

oh ... lo siento ... Tenía en mente negarlo explícitamente pero lo olvidé. Lo editaré ahora. Gracias por preguntar.
Bogdan Alexandru

Oh Dios. Debido a que no puedo encontrar ninguna respuesta para la parte 3.2.2 para mis 3 soluciones actuales ... Supongo que eso significa que debo buscar una más :)
mellamokb

sí :) buena suerte en eso
Bogdan Alexandru

1
@ardnew: No creo que el OP haya cambiado una vez la intención original de la pregunta. Estoy de acuerdo en que hay mejores formas de solucionar la pregunta que agregar un montón de Edit al final ... pero sigue siendo la misma pregunta, con algunas cosas aclaradas.
mellamokb

Respuestas:


8

3.1

for( i = 0;-i < n; i-- )
for( i = 0; i < n; n-- )
for( i = 0; i + n; i-- )

Cualquiera de estos cambios hará que el programa muestre 20 '+' signos. Este está cerca:

for( i = 0;~i < n; i-- )

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.

int n = 20L;
int n = 20f;
int n = 20d;
uint n = 20;

for( i = 0L; ... )
for( i = 0f; ... )
for( i = 0d; ... )

iprintf("+");
printf("+x");
printf("x+");

Para los dos últimos, sustituya cualquier letra para xdarle 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.

int n = 20L;
int n = 20.001;
int n = 20.999;
int n = 20 + 0x100000000L;

Sí, tienes exactamente las mismas respuestas que yo (no las publiqué antes porque no tenía todo respondido). Creo que la respuesta a 3.2.2 se encuentra en la tercera solución a 3.1 que ninguno de nosotros ha encontrado (y obedece la regla de no permitir que se cambie el espacio).
mellamokb

En 3.2.1, no estoy seguro sobre el fy dsufijos para los inttipos (así, dpara cualquier tipo para el caso), pero hay algunos otros que has dejado fuera: int n = 20l, int n = 20U, y int n = 20u. Además, no creo que uintsea ​​un identificador de tipo estándar en C o C ++. ¿Qué compilador usas para estos de todos modos?
ardnew

Has hecho un buen trabajo aquí, ¡pero no lo has completado! En primer lugar, la solución ~ i sigue siendo buena. El requisito era generar 20 signos "+", por lo que 21 sigue siendo una buena solución (la única solución incorrecta es la salida infinita). ¡Esto significa que ahora ha encontrado 4 soluciones! Y lo curioso es que todavía tengo uno :) Sobre el 3.2.2, es malo, ya que específicamente tuve que cambiar el VALOR de n, no hacer algunos trucos para que sea 20 :)
Bogdan Alexandru

1
y también, las soluciones -i y ~ i cambian espacios, así que las consideraré soluciones "parciales". la tercera solución completa debe cambiar un carácter no espacial como se especifica en el texto del cuestionario
Bogdan Alexandru

1
No entendiste el problema. Dije que la modificación producirá el mismo resultado que el programa modificado correspondiente. es decir, tengo los programas corregidos C1, C2, C3. Después de la inserción de caracteres tengo P1, P2, P3. El requisito es: P1 tiene la misma salida que C1, P2 tiene la misma salida que C2, P3 tiene la misma salida que C3. NO es P1, P2, P3 con la misma salida
Bogdan Alexandru

2

3.1

Otro rompecabezas más. Pero las soluciones normales son aburridas, ¿qué pasa con algo especial?

Solución uno:

#include <stdio.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i++ )
      printf("+");
   return 0;
}

Decidí cambiar sólo un carácter, es decir, -. No -se cambiaron otros caracteres que no sean .

Solución dos:

#include <stdio.h>
int main() {
   int i=printf("++++++++++++++++++++");exit(0);
   int n = 20;
   for( i = 0; i < n; i-- )
      printf("+");
   return 0;
}

Esto cambia exactamente un carácter - el punto y coma después int ien =printf("++++++++++++++++++++");exit(0);.

Solución tres:

#include <stdix.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i-- )
      printf("+");
   return 0;
}

Esto carga el stdix.hencabezado del sistema. En la ruta de inclusión del sistema, inserte el siguiente archivo, llamado stdix.h. Tiene que contener los siguientes contenidos.

static inline void printf(const char *string) {
    int i;
    for(i = 0; i < 20; i--)
        putchar('+');
    exit(0);
}

3.2

Ahora para insertar una letra. Bueno, eso es simple, reemplazar int main()con int main(a). Esto no es válido según los estándares, pero ¿a quién le importa?



0

3.1

  1. Cambiar i--an--
  2. i<n a -i<n
  3. (Desafortunadamente, respuesta no válida porque no estaba verificando con el compilador antes de ver otras respuestas)

3.2.1

int n = 20 

a

uint n = 20

(Depende del compilador ...)

3.2.2

int n =-20L;

for(i = -1; i%n; i--)

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


0
#include <stdio.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i++  )
      printf("+");
        printf("\n");
   return 0;
}

1
Asegúrese de agregar el idioma del programa y el recuento de caracteres en su respuesta.
Timtech

1
@Timtech ¿por qué los personajes cuentan? esto no es código-golf
orgulloso Haskeller

1
@Timtech también ¿por qué incluir el idioma? Este es un desafío específico del idioma.
orgulloso Haskeller
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.