8 réponses
26 déc. 2022 à 11:25
Bonjour
si ton prof t'a donné cet exercice c'est qu'il juge que le niveau de son cours déjà enseigné le permet.
L'énoncé précise que la première fonction à coder devra construire un dictionnaire à partir d'une liste elle-même issue du fichier texte. C'est écrit comme si cela devrait être une formalité.
Du coup, je dirais que tu devrais commencer par réviser les cours précédents et refaire les exercices de lecture de fichiers textes et de constitution de liste.
Il faudrait commencer par calculer ces décimales. Sais-tu comment?
http://www.gecif.net/articles/mathematiques/pi/pi_decimales.html
Le problème est qu'on ne connait pas à priori ni la composition, ni la longueur des séquences.
Ça serait ridicule de chercher des séqquences de un seul chiffre.
Il y a 100 séquences de deux chiffres, 1000 séquences de trois chiffres, etc.
Si tu as réussi à faire une seule chaîne en enlevant les '\n' avec replace, tu devrais n'avoir que des chiffres.
Il faudra décider de la puissance maximale, donc le nombre de chiffres, pour chaque séquence.
Je donne un exemple avec 3 chiffres:
w = 3 # largeur
for n in range(10**w):
seq =str(10**w + a)[-w:]
compte = decimales_de_pi.count(seq)
Ça, c'est pour une seule séquence de 3 chiffres. Il faut tester toutes les séquences de 3 chiffres.
Il faut surtout tester toutes les séquences de N chiffres, pour N de 2 à une certaine limite.
Avec de longues séquences, on pourrait utiliser l'algorithme de Boyer-Moore, mais c'est plus compliqué à coder.
Je commencerais avec des séquences de 2 ou 3 chiffres, car ça risque d'être long avec des séquences plus longues.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre questionMon code précédent est en effet assez long car on parcourt la chaîne des chiffres plusieurs fois.
J'ai trouvé du code plus rapide avec un dictionnaire. Je parcours la chaîne une seule fois, même si je prend des sous-chaînes comme séquences de chiffres.
Je crée un dictionnaire de toutes les possibilités avec une liste vide associée à chaque clé.
Même si plusieurs clés sont créés inutilement, ça semble plus rapide que de vérifier à chaque séquence si la clé existe, puis modifier sa valeur.
-
from time import perf_counter
from random import choices
n = 130000
# Je génère aléatoirement 130 000 chiffres pour la simulation.
pi = "".join(choices("0123456789", k=n))
p = 5 # Puissance maximale = nombre maximal de chiffres cherchés.
begin = perf_counter()
# Je génère un dictionnaire avec toutes les séquences de 2 à p chiffres.
D = {str(i+10**w)[-w:]: [] for w in range(2, p+1) for i in range(10**w)}
l = len(pi)
# Je cherche toutes les séquences de 2 à p chiffres.
# j'accumule les positions de début de ces séquence.
for i in range(l):
for w in range(2, p+1):
if i <= l-w: D[pi[i:i+w]].append(i)
# Je ne garde que les positions valides.
# La distance doit être au moins la longueur de la séquence.
for k, L in D.items():
s=len(L)
c = 0
if s > 0:
w = len(k)
pv = L[0] # La première position est ttoujours valide
c = 1 # On compte les occurences valides
for i in range(1, s):
if L[i] - pv >= w:
pv = L[i]
c += 1
D[k] = c # Le dictionnaire contiendra les fréquences au lieu des listes de positions.
print(round(perf_counter()-begin, 3), "secondes")
# J'affiche la séquence la plus fréquente.
print(max([(k,v) for k,v in D.items()], key=lambda t: t[1]))
25 déc. 2022 à 10:34
L'énoncé de l'exercice est publié dans une image postée au départ.
Le demandeur a maladroitement résumé cet énoncé.
Il faudrait sans doute regarder les fonctions relatives aux fichiers telles que open() et read() et replace() pour faire sauter les fin de ligne ('\n').
Je pense que c'est mieux de travailler avec une chaîne plutôt qu'une liste.
@Whismeril: es-tu un modérateur? Je pensais que les images n'étaient pas tolérées pour décrire les énoncés ou donner le code ou les erreurs.
Ceci dit, le fait d'utiliser une liste plutôt qu'une chaîne ne devrait rien changer à l'algorithme lui-même.
Non je ne suis plus modérateur. J'ai "démissionné" ce n'est pas fait pour moi. Je suis "juste" contributeur.
Par contre, j'ai répondu en envoyant le lien vers les règles du forum quand il s'agit d'un exercice.
C'est toi qui ensuite t'es lancé dans des supputations hors sujet, et qui continue bien qu.yg_be (qui est contributeur aussi) t'ai averti.
L'énoncé décrit précisément les étapes que leodmca doit suivre, les longueurs des séquences et le code à appliquer pour le calcul des fréquences d'occurence.
Manifestement il coince dès la lecture du fichier, c'est donc qu'il n'a pas compris ou suffisamment travaillé ses cours précédents.
Il doit donc commencer par les réviser.
26 déc. 2022 à 22:53
Pierre, les images ne sont pas interdites. Celui qui veut se faire aider est invité à communiquer au mieux. Nous demandons fréquemment d'utiliser du texte plutôt que des images, de façon à pouvoir réutiliser le texte pour tester, pour faire des recherches, ou pour rédiger des réponses.
Celui qui ne fait pas cet effort sera, souvent, moins bien aidé.