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é