Projet en ISN

Fermé
Lyx - 28 déc. 2013 à 18:06
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 - 29 déc. 2013 à 22:30
Bonjour,
Je suis en terminale S, spécialité ISN, et je galère un peu sur un projet.
Il faut savoir que nous n'avons vraiment pas beaucoup de connaissances.
Ce que les gens expérimentés appellent 'la base', on ne le comprend même pas.

Le sujet est:

Ecrivez un programme qui permette à un humain de découvrir un nombre de 4 chiffres choisis entre 1 et 8.


L'ordinateur choisit d'abord un nombre composé de chiffres entre 1 et 8 (p. ex. 3265). L'utilisateur entrera ensuite des nombres (p. ex. 3822) et l'ordinateur donnera le nombre de chiffres bien et mal placés. Dans notre exemple l'ordinateur répondra 1 bien placé(s) 1 mal placé(s) (le chiffre 3 est bien placé et le chiffre 2 est mal placé).


J'ai commencé à faire quelque chose, pour l'instant ça ne répond absolument pas au sujet, mais au mois, ça me permet de commencer...

from random import*
Ordi=[randint(1111,8888)] #Nombre au hasard choisi par l'ordi
print("Quel est la suite de nombres choisi par l'ordinateur?")
Util=[int(input())] #Nombre choisi par l'utilisateur
print(Ordi)
while Ordi!=Util:
Util=[int(input("Entrez un autre nombre"))]
if Ordi==Util:
print("Gagné!")

J'aimerais de l'aide, des pistes, des explications... tout ce qui pourrait m'aider à avancer mon programme.
Merci d'avance! :)

3 réponses

Bonsoir,

En effet ça ne répond pas au problème, pour faire simple on a:

-> Un nombre décidé par l'ordinateur
-> Un nombre décidé par l'utilisateur
-> Un nombre résultant des deux précédents et indiquant les chiffres qui correspondent

Si on prend un exemple, on aurait ceci

ordi : 2548
utilisateur: 1568
resultat: _5_8

Pour assigner une valeur il n'y a pas beaucoup de choix, celui que je propose est le type list. Sachant qu'on ne peut rien assigner à un entier ou à une chaîne de caractères, il nous reste la liste ou la chaine vide à concaténer.

Voici le déroulement par l'interpréteur.

>>> ordi = '2548'
>>> utilisateur = '1568'
>>> result = []
>>> for ind, n in enumerate(utilisateur):
... if n == ordi[ind]:
... result.append(n)
... else:
... result.append('_')
...
>>> result
['_', '5', '_', '8']
>>> ''.join(result)
'_5_8'

Autre solution avec la chaine vide à concaténer

>>> ordi = '2548'
>>> utilisateur = '1568'
>>> result = ''
>>> for ind, n in enumerate(utilisateur):
... if n == ordi[ind]:
... result += n
... else:
... result += '_'
...
>>> result
'_5_8'

À vous de placer cela sous forme de code permettant de rendre les choses fonctionnelles à tout les coups (Contrôle longueur de l'entier, etc...).

Bonne continuation.
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 130
Modifié par heyquem le 29/12/2013 à 21:45
fred,

Tu pars du principe que pour ordi = 2548 et utilisateur = 1568 ,
le résultat doit être: _5_8

Mais d'après ce que dit Lyx dans sa question, il faut plutôt que le résultat donne la quantité de chifres bien placés et la quantité de chifres mal placés.
Ce qui, soit dit en passant, passe sous silence le fait qu'il peut y avoir aussi des chiffres présents dans le nombre 'utilisateur' mais pas dans le nombre 'ordinateur', mais leur quantité est facile à déduire des deux précédentes.

Ainsi, pour reprendre l'exemple de Lyx:
    ordinateur  = 3265
utilisateur = 3822
le résultat doit être
    1 bien placé (le 3)
2 mal placés (les 2)
1 non présent (le 8)
Cette sorte de résultat préserve l'intérêt, déjà tout relatif du jeu, en ne donnant pas trop de renseignements.
Nota bene: on pourrait aussi considérer qu'il n'y a qu'un 2 qui est mal placé et que le second n'est pas présent dans le nombre 'ordinateur'.

Par exemple si
    ordinateur  = 3628
utilisateur = 3278
le résultat devra être
    2 bien placés (le 3 et le 8)
1 mal placé (le 2)
1 non présent (le 7)

Mais ce serait le même résultat pour
     ordinateur  = 3628
utilisateur = 7623


Pourtant dans le premier cas,
ton résultat dira
3 _ _ 8
,
et dans le deuxième cas
ce sera
_ 6 2 _


On voit bien que c'est plus facile de continuer après tes résultats qu'avec ceux voulus par Lyx.
0
heyquem Messages postés 759 Date d'inscription mercredi 17 juin 2009 Statut Membre Dernière intervention 29 décembre 2013 130
Modifié par heyquem le 29/12/2013 à 22:39
Lyx,

- En écrivant
Ordi=[randint(1111,8888)]
tu places le nombre aléatoire dans une liste, ce n'est pas nécessaire.

- D'après la façon dont tu écris
print()
avec des parenthèses, tu utilises Python 3.
En Python 3,
input()
enregistre l'ntrée sous forme de chaîne, tout le temps.
Si tu fais
int(input())
tu transforms cette chaîne en entier, ce qui n'est pas astucieux puisque tu vas devoir examiner les chiffres en tant que caractères.

- Je te signale en outre que 1 est un chifre, 2 est un chiffre, ....il n'y a que 10 chiffres,
et que les nombres sont formés de 1 ou plusieurs chifres
Ecrire "suite de nombres" porte donc à confusion

J'organiserais l'algorithme de la façon suivante, personnellement:

from random import *

Ordi=str(randint(1111,8888)) #Nombre au hasard choisi par l'ordi

Util=input("Quelle est la suite de chiffres "
"choisie par l'ordinateur ?\n\n"
"Entrez un nombre à 4 chiffres : ")
#Nombre choisi par l'utilisateur
print(Ordi)

while Ordi!=Util:
Util=raw_input("Entrer un nouveau nombre de 4 chiffres : ")
for i in (0,1,2,3):
if Ordi[i]==Util[i]:
# code à compléter

print("Gagné!")
0