Le défi
Écrivez un programme qui peut prendre une entrée d'une chaîne d'une seule ligne contenant tous les caractères imprimables ASCII et produire la même chaîne codée en Base85 (en utilisant une convention big-endian). Vous pouvez supposer que l'entrée sera toujours ≤ 100 caractères.
Un guide de Base85
Quatre octets sont codés en (généralement) cinq caractères Base85.
Les caractères Base85 vont de
!
àu
(ASCII 33 - 117) etz
(ASCII 122).Pour encoder, vous effectuez en continu la division par 85 sur les quatre octets (un nombre de 32 bits) et ajoutez 33 au reste (après chaque division) pour obtenir le caractère ASCII pour la valeur encodée. Par exemple, la première application de ce processus produit le caractère le plus à droite dans le bloc codé.
Si un ensemble de quatre octets ne contient que des octets nuls, ils sont codés en tant que
z
au lieu de!!!!!
.Si le dernier bloc est plus court que quatre octets, il est complété par des octets nuls. Après l'encodage, le même nombre de caractères ajoutés en tant que remplissage est supprimé à la fin de la sortie.
La valeur codée doit être précédée
<~
et suivie de~>
.La valeur codée ne doit contenir aucun espace (pour ce défi).
Exemples
In: easy
Out: <~ARTY*~>
In: test
Out: <~FCfN8~>
In: code golf
Out: <~@rGmh+D5V/Ac~>
In: Programming Puzzles
Out: <~:i^JeEa`g%Bl7Q+:j%)1Ch7Y~>
L'extrait suivant codera une entrée donnée pour Base85.
la source
Réponses:
CJam,
433935 octetsEssayez-le en ligne dans l' interpréteur CJam .
Comment ça fonctionne
Si l'entrée était vide,
N,)
s'appliquera à la chaîne"<~"
. Puisqu'ilN
contient initialement un seul caractère, la sortie sera correcte.Nous n'avons pas besoin de traiter z ou de remplir les morceaux encodés à la longueur 5, car l'entrée ne contiendra que des caractères ASCII imprimables.
la source
a program that can take an input of a single-line string containing any ASCII printable characters,...
Python 3, 71 octets
Je n'ai jamais joué au golf en Python, donc c'est probablement sous-optimal.
Merci à @ZachGates d'avoir joué au golf sur 3 octets!
la source
input().encode()
au lieu destr.encode(input())
pour enregistrer 3 octets.Python 2,
193162 octetsCeci est mon premier golf de code, donc je suis sûr qu'il y a un problème avec mon approche. Je voulais également implémenter réellement base85 plutôt que d'appeler simplement la fonction de bibliothèque. :)
la source
[:4+len(s)/4*4]
et aucun caractère n'est supprimé à la fin de la sortie.while
boucle en un comme comme celui - ci:while b:d=chr(b%85+33)+d;b/=85
. Vous pouvez également supprimer l'espace entre votreprint
instruction et la chaîne. En outre, supprimez l'espace entre les arguments passés às.unpack
.Octave,
133131 octetsMerci à @ojdo d'avoir suggéré de prendre des entrées depuis argv plutôt que stdin, ce qui m'a fait économiser 2 octets.
Non golfé:
J'ai posté le code sur ideone . La fonction autonome ne nécessite ni
end
instruction, mais parce que ideone a la fonction et le script appelant dans le même fichier, elle nécessite un séparateur.Je n'ai toujours pas réussi à comprendre comment
stdin
travailler sur l'idéone. Si quelqu'un le sait, je suis toujours intéressé, alors n'hésitez pas à me laisser un commentaire.Exemple de sortie de ideone :
la source
argv()
? La description de la tâche ne semble pas nécessiter de lecture d'entréestdin
.dec2base
qu'Octave permet des bases supérieures à 36?BASE
doit être un nombre entre 2 et 36, ou une chaîne de symboles . Ici, l'expression'i':'u'
développe la chaîne de 85 caractères!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstu
qui sert de base.Matlab, 175 octets
Exemple:
la source
PHP, 181 octets
Version en ligne
Étendu
la source
Pure bash, ~ 738
Encodeur en premier (quelque chose de golfé):
Tests:
et décodeur maintenant:
Copiez ceci dans
enc85.sh
etdec85.sh
,chmod +x {enc,dec}85.sh
puis:Mais vous pourriez faire un test plus fort:
Réduit à 724 caractères:
la source