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é
la source
Réponses:
3.1
N'importe lequel de ces changements fera que le programme affichera 20 signes «+». Celui-ci est proche:
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.
Pour les deux derniers, remplacez n'importe quelle lettre pour
x
vous 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
.la source
f
etd
suffixes pour lesint
types (et,d
pour tout type pour cette matière), mais il y a quelques autres que vous avez laissé au large:int n = 20l
,int n = 20U
etint n = 20u
. Je ne crois pas non plus qu'il s'agisse d'uint
un identificateur de type standard en C ou C ++. Quel compilateur utilisez-vous de toute façon?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:
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:
Cela change exactement un caractère - le point-virgule après
int i
en=printf("++++++++++++++++++++");exit(0);
.Troisième solution:
Cela charge l'
stdix.h
en-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.3.2
Maintenant, pour insérer une lettre. Eh bien, c'est simple, remplacez
int main()
parint main(a)
. Ce n'est pas valable selon les normes, mais qui s'en soucie?la source
Puzzle 3.1 Réponses
i--
àn--
(démo: http://ideone.com/l0Y10 )i < n
ài + n
(démo: http://ideone.com/CAqWO )[SPACE]i < n
par-i < n
. (démo: http://ideone.com/s5Z2r )Puzzle 3.2.1
Passez
int n = 20
àint n = 20L
(ajoutez unL
à la fin).Puzzle 3.2.2
Je n'ai pas encore trouvé de réponse ...
la source
3.1
i--
parn--
i<n
à-i<n
3.2.1
à
(Dépendant du compilateur ...)
3.2.2
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.1la source
la source