papydall
Nombre de messages : 7017 Age : 74 Localisation : Moknine (Tunisie) Entre la chaise et le clavier Date d'inscription : 03/03/2012
| Sujet: Codage unaire (plus bas que le binaire langage bas niveau) Dim 8 Mai 2022 - 11:39 | |
| Vous savez coder en langage bas niveau, le binaire pour ne pas le nommer ? Hé bien, figurez-vous qu'il y a plus bas que le bas niveau! C'est le langage unaire. Oui, oui, ça existe. Monsieur Chuck Norris a un clavier qui ne comporte que le chiffre 0 (en plus bien sûr de la touche espace). Avec son unique zéro, Chuck Norris peut envoyer des messages à ceux qui savent les décoder. Le programme suivant vous permet de devenir aussi fort que Chuck Norris en manipulant le langage du plus bas niveau. - Code:
-
rem ============================================================================ rem Chuck Norris Programming Language (CNPL) rem REF : https://www.xarg.org/puzzle/codingame/chuck-norris/ rem ============================================================================ rem Dans ce langage, le "0" est codé "00" et le "1" est codé "0". rem Puis un espace, puis ensuite autant de "0" que le texte contient de "0" rem ou "1" successifs. rem ============================================================================ rem A l’origine c’est un concept inventé par Chuck Norris pour envoyer des rem messages dits unaires. rem On se propose ici, d’écrire un programme qui, à partir d’un texte en entrée, rem affiche le texte codé façon Chuck Norris en sortie. rem ============================================================================ rem Principe d’encodage : rem * Le texte en entrée est constitué de caractères ASCII (7 bits) rem * Le texte encodé en sortie est constitué de blocs de 0 rem * Un bloc est séparé d’un autre bloc par un espace rem * Deux blocs consécutifs servent à produire une série de bits de même rem valeur ( 1 ou 0 uniquement ) : rem ** Premier bloc : il vaut toujours 0 ou 00. rem S’il vaut 0, alors la série contients des 1, sinon elle contient des 0 rem ** Deuxième bloc : le nombre de 0 dans ce bloc correspond au nombre de rem bits dans la série rem ============================================================================ rem Premier exemple rem Prenons un exemple simple avec un texte constitué d’un seul caractère : rem C majuscule. rem C en binaire vaut 1000011 ce qui donne avec la technique de Chuck Norris : rem 0 0 (la première série est composée d’un seul 1) rem 00 0000 (la deuxième série est composée de quatre 0) rem 0 00 (la troisième série est composée de deux 1) rem rem C vaut donc : 0 0 00 0000 0 00 rem ============================================================================ rem Deuxième exemple : rem Nous voulons encoder le texte CC (soit les 14 bits 10000111000011) : rem 0 0 (un seul 1) rem 00 0000 (quatre 0) rem 0 000 (trois 1) rem 00 0000 (quatre 0) rem 0 00 (deux 1) rem rem CC vaut donc : 0 0 00 0000 0 000 00 0000 0 00 rem ============================================================================ dim phrase$ width 0,1400
' phrase$ = "C" : ' <--- 0 0 00 0000 0 00 ' phrase$ = "CC" : ' <--- 0 0 00 0000 0 000 00 0000 0 00 ' phrase$ = "%" : ' <--- 00 0 0 0 00 00 0 0 00 0 0 0 ' phrase$ = "Hello" : ' <--- 0 0 00 00 0 0 00 000 0 00 00 00 0 0 00 0 0 000 00 ' 0 0 00 00 00 0 00 00 0 0 00 00 00 0 00 00 0 0 0000 phrase$ = "Vive Panoramic" print "Codage unaire du texte : " + phrase$ print Binaire2Unaire$(Texte2Binaire$(phrase$))
end rem ============================================================================ FNC Texte2Binaire$(texte$) dim_local decimal,binaire$,i for i = 1 to len(texte$) decimal = asc(mid$(texte$,i,1)) binaire$ = binaire$ + Decimal2Binaire$(decimal) next i result binaire$ END_FNC rem ============================================================================ FNC Binaire2Unaire$(binaire$) dim_local unaire$,caractere$,i,j,k,bloc$ unaire$ = "" i = 0 while i < len(binaire$) bloc$ = "" caractere$ = mid$(binaire$,i+1,1) j = 1 while ((i+j) < len(binaire$)) and (mid$(binaire$,i+j+1,1) = caractere$) j = j + 1 end_while if caractere$ = "0" unaire$ = unaire$ + "00 " else unaire$ = unaire$ + "0 " end_if i = i + j for k = 1 to j : bloc$ = bloc$ + "0" : next k unaire$ = unaire$ + bloc$ + " " end_while unaire$ = rtrim$(unaire$) result unaire$ END_FNC rem ============================================================================ ' Convertir un nombre décimal en un nombre en binaire (7 bits) ' Paramètre : un nombre en décimal ' Le résultat est une chaîne de caractères représentant un nombre en binaire ' sur 7 bits FNC Decimal2Binaire$(dec) dim_local n,tmp$,ret$ n = dec while n > 1 tmp$ = str$(n-2*int(n/2)) + tmp$ n = int(n/2) end_while ret$ = str$(n) + tmp$ while len(ret$) < 7 ret$ = "0" + ret$ end_while result ret$ END_FNC rem ============================================================================
| |
|
Minibug
Nombre de messages : 4570 Age : 58 Localisation : Vienne (86) Date d'inscription : 09/02/2012
| Sujet: Re: Codage unaire (plus bas que le binaire langage bas niveau) Dim 8 Mai 2022 - 11:48 | |
| | |
|