Chuck Norris ASCII

afficher un message codé façon Chuck Norris.

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à tous amis zesteurs,

Je suis en train de m'améliorer en algorithmique avec Codingame, et je suis bloqué sur le puzzle easy de Chuck Norris, où j'ai un résultat qui ne correspond pas au résultat voulu et je ne comprend pas pourquoi :(

Voici le problème : Le message en entrée est constitué de caractères ASCII (7 bits) Le message encodé en sortie est constitué de blocs de 0 Un bloc est séparé d'un autre bloc par un espace Deux blocs consécutifs servent à produire une série de bits de même valeur (que des 1 ou que des 0) : - Premier bloc : il vaut toujours 0 ou 00. S'il vaut 0 la série contient des 1, sinon elle contient des 0 - Deuxième bloc : le nombre de 0 dans ce bloc correspond au nombre de bits dans la série

Prenons un exemple simple avec un message constitué d'un seul caractère : C majuscule. C en binaire vaut 1000011 ce qui donne avec la technique de Chuck Norris :

0 0 (la première série composée d'un seul 1) 00 0000 (la deuxième série composée de quatre 0) 0 00 (la troisième série composée de deux 1) C vaut donc : 0 0 00 0000 0 00

Bon le code est surement horrible et pas optimisé, mais je ne vois pas pourquoi il n'est pas fonctionnel.

Si quelqu'un pouvait m'éclairer ce serait sympa :)

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import sys
import math

message = input()
mesage_fini = ""

new_message = ""

nbr_1 = 0
nbr_0 = 0

' '.join(format(ord(x), 'b') for x in message)

message.replace(" ","")

message=str(message)

for i in (0, len(message)-1):
    if message[i] == 1:
        for j in range (i, len(message)-1):
            if message[j] == 1:
                nbr_1 = nbr_1 + 1 
            else:
                j=len(message)+2
        new_message = new_message + " 0 " + "0"*nbr_1
        nbr_1 = 0
    else:
        for k in range (i, len(message)-1):
            if message[k] == 0 :
                nbr_0 = nbr_0 + 1 
            else:
                j=len(message)+2
        new_message = new_message + " 00 " + "0"*nbr_0
        nbr_0 = 0

print(new_message)

Édité par Dr@zielux

+0 -0

Cette réponse a aidé l'auteur du sujet

Bonsoir,

La première chose qui me saute aux yeux est la ligne 18. Souhaites-tu vraiment itérer sur l'ensemble de deux éléments constitué de 0 et len(message) - 1 ?

En regardant plus profondément, je pense que tu n'as pas tout compris du Python. Tes lignes 12 et 14 n'ont aucun effet, puisque tu ne sauvegardes pas leur résultat. De plus, pourquoi faire un join sur ' ' si ta volonté est ensuite de supprimer cette espace ?

Ta ligne 16 est elle aussi inutile, message étant déjà une chaîne de caractères.

Tes comparaisons ligne 19, 21 ou 29 ne pourront jamais être vraies, puisque message[i] (ou j, k) ne pourra valoir que '0' ou '1' (si tu corriges les remarques précédentes, actuellement il peut aussi valoir ' '), mais jamais 0 ou 1 (attention aux types !).

Pour tes range, tu utilises toujours len(...) - 1 comme borne maximale, pourquoi exclure systématiquement le dernier caractère ? Pourquoi d'ailleurs utiliser des range plutôt qu'un simple for character in message ?

Enfin, je ne pense pas que ton algorithme puisse fonctionner, tes boucles imbriquées sont étranges (la boucle extérieure ne tient pas compte des boucles intérieures, donc tu vas traiter plusieurs fois les caractères).

Édité par entwanne

Auteur du sujet

Salut entwanne, merci pour ta réponse. Je savais que c'était mauvais mais pas à ce point.

Pour la ligne 18 j'avais mal compris, je considérais qu'on avait n éléments et comme le premier était à l'indice 0 je finissais a ,-1, mais i commence également a 0 du coup j'ai juste fais n'importe quoi.

Pour les lignes 12 et 14 j'ai un peu honte, je suis allé chercher sur la documentation, j'ai juste cherché à comprendre les lignes et j'en ai oublié de remettre ma variable.

Effectivement j'ai du mal avec les types, le fait qu'ils ne soient pas indiqués et que j'ai passez de rigueur ça me fait faire des erreurs débiles comme ça ^^

Du coup je vais tout reprendre en faisant bien attention et tester mon algorithme sur papier, j'étais sur qu'il allait fonctionner :-°

Édité par Dr@zielux

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte