Le puzzle de programmation 3 (C) de m3ph1st0s: «Easy bug» [fermé]

11

Ceci est le 3ème de ma série de puzzles C / C ++; au cas où vous auriez raté les 2 premiers, ils sont ici: (1) puzzle de programmation 1 de m3ph1st0s (C ++) (2) puzzle de programmation 2 de m3ph1st0s (C ++): "Call hard!"

Je dois dire que mes puzzles sont 100% originaux. Sinon, je le dirai toujours dans le texte. Mon 3ème puzzle se compose de 2 parties comme suit:

Puzzle 3.1

Cette partie (3.1) n'est pas un puzzle original, elle est collectée sur une page Internet que j'ai lue il y a un moment. Je l'utilise ici comme point de départ et comme échauffement pour vous. Résolvez celui-ci, puis passez à la 2e partie.

Quelqu'un a essayé d'imprimer le signe "+" 20 fois et est venu avec le programme suivant:

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

Le fait qu'il n'ait pas eu le résultat escompté est évident - le programme ne se termine jamais. Répare le! Facile? Maintenant, corrigez le programme en changeant UN SEUL CARACTÈRE - caractère non-espace bien sûr! Pour ce défi, il existe 3 solutions. Trouvez-les tous les 3. Juste pour être clair: le programme doit produire 20 signes "+" et doit se terminer rapidement. Avant de me critiquer sur ce que signifie "rapide", je dirai que cela signifie tout au plus quelques secondes (ce qui est d'ailleurs trop mais juste pour que ce soit clair).

Puzzle 3.2

MODIFIÉ Il m'a été signalé plus tôt que la solution du puzzle 3.2.2 pouvait dépendre du compilateur. Afin d'éliminer toute discussion possible sur le sujet, je modifierai l'idée et l'améliorerai sur un prochain puzzle lorsque je prendrai des précautions supplémentaires pour ne pas générer de controverse. Cependant, afin de continuer ce puzzle, je ferai une petite modification pour 3.2.2 (la solution sera plus facile mais plus propre).

Quand j'ai vu le puzzle pour la première fois, je l'ai trouvé assez génial. J'ai réussi à le résoudre mais pas immédiatement car cela nécessite une attention particulière. Si vous êtes ici, cela signifie que vous aussi, vous l'avez résolu. Si vous l'avez fait en écrivant un programme pour remplacer tous les caractères possibles par toutes les valeurs possibles et tester chaque solution, vous êtes perdu. Mec qui travaille dur cependant. Maintenant avoir corrigé le programme qui écrit 20 signes "+":

3.2.1: Insérez une seule lettre et rien de plus dans le code pour que le résultat soit valide et renvoie la même chose dans les 3 programmes corrigés. Inutile de dire que la lettre doit être avant l'enveloppe} de main (je dis cela parce que je ne veux pas entendre les gens qui viennent de mettre une lettre après le programme et en quelque sorte leur compilateur était très sympathique).

MODIFIÉ (voir ci-dessous) - Pour ces dernières questions, considérez que le compteur i commence à -1 au lieu de 0.

3.2.1.5: Répéter tous les problèmes précédents à condition que la sortie soit au moins 19 signes "+" (mais toujours une sortie finie). Changer les espaces est autorisé. Maintenant, vous avez peut-être trouvé plus de solutions que dans le premier cas. Certains d'entre eux conviendront certainement à la question 3.2.2.

3.2.2: Choisissez une autre valeur pour initialiser la variable n afin que la sortie résultante reste la même pour au moins un programme corrigé dans 3.2.1.5 (pas nécessairement pour tous).

LAST EDIT1 : changer le programme pour qu'il affiche 21 signes "+" est toujours une bonne solution, car le texte original ne disait pas "exactement" 20 signes. Cependant, la sortie infinie est interdite. Évidemment, cela ne signifie pas que nous allons tous commencer à produire des centaines de signes "+" car ce n'est pas interdit. Mais éliminer une belle sortie 21 ne serait pas dans l'esprit de cette compétition.

LAST EDIT2 : considérant LAST EDIT1 et acceptant le changement d'espace, il semble que nous ayons maintenant 5 solutions possibles, dont quatre ont déjà été indiquées dans les réponses. Le dernier défi n'a cependant pas été touché et je dois le préciser une fois de plus: n doit recevoir une autre valeur , les solutions qui attribuent 20 à n par quelques astuces ne le feront pas (comme n = 20L). Je préfère également voir la 3ème solution qui ne change pas les espaces.

LAST EDIT3 : J'ai édité les dernières questions, veuillez lire!

Le défi consiste à résoudre les deux parties du puzzle. Le premier à le faire gagne.

J'espère que tout est clair, sinon veuillez poster des questions et je modifierai le plus rapidement possible. À votre santé. texte souligné

Bogdan Alexandru
la source
Je suppose que la modification d'un caractère comprend la modification des espaces en caractères non-espace? Si c'est le cas, je pense avoir trouvé les 3 solutions pour la partie 1.
mellamokb
oh..désolé..J'ai pensé à le nier explicitement mais j'ai oublié. Je vais éditer maintenant. Merci d'avoir demandé.
Bogdan Alexandru
Oh super. Parce que je ne trouve aucune réponse pour la partie 3.2.2 pour mes 3 solutions actuelles ... Je suppose que cela signifie que je dois en chercher une de plus :)
mellamokb
oui :) bonne chance à ce sujet
Bogdan Alexandru
1
@ardnew: Je ne pense pas que le PO ait changé une fois l'intention originale de la question. Je suis d 'accord qu'il existe de meilleures façons de résoudre la question que de repulper un tas de Edit à la fin ... mais c'est toujours au cœur de la même question, avec certaines choses clarifiées.
mellamokb

Réponses:

8

3.1

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

N'importe lequel de ces changements fera que le programme affichera 20 signes «+». Celui-ci est proche:

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

Il affiche 21 signes «+».

3.2.1

J'ai trouvé au moins 112 façons de résoudre ce problème en insérant une lettre. Tous ne peuvent pas fonctionner sur tous les compilateurs.

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+");

Pour les deux derniers, remplacez n'importe quelle lettre pour xvous donner 104 solutions possibles. L'utilisation de l'une des deux dernières lignes modifiera la sortie, mais la sortie sera toujours la même pour les 3 programmes corrigés.

3.2.2

Tout ce que j'ai trouvé, ce sont des choses qui reviennent au numéro 20 lors de l'affectation int.

int n = 20L;
int n = 20.001;
int n = 20.999;
int n = 20 + 0x100000000L;
foule
la source
Oui, vous avez exactement les mêmes réponses que moi (je ne les ai pas publiées avant parce que je n'ai pas tout répondu). Je pense que la réponse au 3.2.2 réside dans la troisième solution au 3.1 que ni l'un ni l'autre n'a trouvée (et obéit à la règle de ne pas permettre que l'espace soit changé).
mellamokb
Sur 3.2.1, je ne suis pas sûr de la fet dsuffixes pour les inttypes (et, dpour tout type pour cette matière), mais il y a quelques autres que vous avez laissé au large: int n = 20l, int n = 20Uet int n = 20u. Je ne crois pas non plus qu'il s'agisse d' uintun identificateur de type standard en C ou C ++. Quel compilateur utilisez-vous de toute façon?
ardnew
Vous avez fait un très bon travail ici, mais pas terminé! Tout d'abord, la solution ~ i est toujours bonne! L'exigence était de produire 20 signes "+", donc 21 est toujours une bonne solution (la seule mauvaise solution est une sortie infinie). Cela signifie que vous avez maintenant trouvé 4 solutions! Et le plus drôle, c'est que j'en ai encore un :) A propos du 3.2.2, c'est mauvais car j'avais spécifiquement besoin de changer la VALEUR de n, de ne pas faire quelques trucs pour en faire 20 :)
Bogdan Alexandru
1
et aussi, les solutions -i et ~ i changent d'espaces donc je les considérerai comme des solutions "partielles". la 3ème solution complète doit changer un caractère non-espace comme spécifié dans le texte du quiz
Bogdan Alexandru
1
vous n'avez pas compris le problème. J'ai dit que la modification produira la même sortie que le programme modifié correspondant. c'est-à-dire que j'ai les programmes corrigés C1, C2, C3. après l'insertion du caractère, j'ai P1, P2, P3. l'exigence est: P1 a la même sortie que C1, P2 a la même sortie que C2, P3 a la même sortie que C3. Ce n'est PAS P1, P2, P3 ayant la même sortie
Bogdan Alexandru
2

3.1

Encore un autre casse-tête. Mais les solutions normales sont ennuyeuses, qu'en est-il de quelque chose de spécial?

Première solution:

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

J'ai décidé de changer UN SEUL PERSONNAGE, c'est-à-dire -. Aucun caractère autre que ceux qui -ont été modifiés.

Deuxième solution:

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

Cela change exactement un caractère - le point-virgule après int ien =printf("++++++++++++++++++++");exit(0);.

Troisième solution:

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

Cela charge l' stdix.hen-tête du système. Dans le chemin d'accès système, insérez le fichier suivant, appelé stdix.h. Il doit contenir le contenu suivant.

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

3.2

Maintenant, pour insérer une lettre. Eh bien, c'est simple, remplacez int main()par int main(a). Ce n'est pas valable selon les normes, mais qui s'en soucie?

Konrad Borowski
la source
0

Puzzle 3.1 Réponses

  1. Passez i--à n--(démo: http://ideone.com/l0Y10 )
  2. Passez i < nà i + n(démo: http://ideone.com/CAqWO )
  3. Remplacez [SPACE]i < npar -i < n. (démo: http://ideone.com/s5Z2r )

Puzzle 3.2.1

Passez int n = 20à int n = 20L(ajoutez un Là la fin).

Puzzle 3.2.2

Je n'ai pas encore trouvé de réponse ...

mellamokb
la source
bonne solution standard pour 3.1 et 3.2.1.
Bogdan Alexandru
0

3.1

  1. Remplacer i--parn--
  2. i<n à -i<n
  3. (Réponse malheureusement invalide car je ne vérifiais pas avec le compilateur avant de voir d'autres réponses)

3.2.1

int n = 20 

à

uint n = 20

(Dépendant du compilateur ...)

3.2.2

int n =-20L;

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

imprime 19 + signes, comme avec int n = 20L;. Cependant, je ne l'aurais pas trouvé si je n'avais pas vu d'autres réponses au 3.2.1

Pingouin dissident
la source
0
#include <stdio.h>
int main() {
   int i;
   int n = 20;
   for( i = 0; i < n; i++  )
      printf("+");
        printf("\n");
   return 0;
}
AGRAWAL DE CHINMAY
la source
1
Assurez-vous d'ajouter la langue du programme et le nombre de caractères dans votre réponse.
Timtech
1
@Timtech pourquoi le nombre de personnages? ce n'est pas du golf de code
fier haskeller
1
@Timtech aussi pourquoi inclure la langue? il s'agit d'un défi spécifique à la langue.
fier haskeller