El reto
Escriba un programa que pueda tomar una entrada de una cadena de una sola línea que contenga caracteres imprimibles ASCII y generar la misma cadena codificada en Base85 (usando una convención big-endian). Puede suponer que la entrada siempre será ≤ 100 caracteres.
Una guía para Base85
Cuatro octetos están codificados en (generalmente) cinco caracteres Base85.
Base85 caracteres van desde
!
au
(ASCII 33 - 117) yz
(ASCII 122).Para codificar, realiza continuamente la división por 85 en los cuatro octetos (un número de 32 bits) y agrega 33 al resto (después de cada división) para obtener el carácter ASCII para el valor codificado. Por ejemplo, la primera aplicación de este proceso produce el carácter más a la derecha en el bloque codificado.
Si un conjunto de cuatro octetos contiene solo bytes nulos, se codifican como en
z
lugar de!!!!!
.Si el último bloque es más corto que cuatro octetos, se rellena con bytes nulos. Después de la codificación, el mismo número de caracteres que se agregaron como relleno se eliminan del final de la salida.
El valor codificado debe ir precedido
<~
y seguido de~>
.El valor codificado no debe contener espacios en blanco (para este desafío).
Ejemplos
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~>
El siguiente fragmento codificará una entrada dada a Base85.
fuente
Respuestas:
CJam,
433935 bytesPruébelo en línea en el intérprete de CJam .
Cómo funciona
Si la entrada estaba vacía,
N,)
se aplicará a la cadena"<~"
. ComoN
inicialmente tiene un solo carácter, la salida será correcta.No tenemos que lidiar con z o rellenar los fragmentos codificados a la longitud 5, ya que la entrada contendrá solo caracteres ASCII imprimibles.
fuente
a program that can take an input of a single-line string containing any ASCII printable characters,...
Python 3, 71 bytes
Nunca he jugado golf en Python, por lo que esto probablemente sea subóptimo.
¡Gracias a @ZachGates por jugar golf en 3 bytes!
fuente
input().encode()
lugar destr.encode(input())
guardar 3 bytes.Python 2,
193162 bytesEste es mi primer código de golf, así que estoy seguro de que hay algo mal con mi enfoque. También quería implementar realmente base85 en lugar de simplemente llamar a la función de biblioteca. :)
fuente
[:4+len(s)/4*4]
y no se eliminarán caracteres del final de la salida.while
bucle en una como la siguiente:while b:d=chr(b%85+33)+d;b/=85
. También puede eliminar el espacio entre suprint
declaración y la cadena. Además, elimine el espacio entre los argumentos pasados as.unpack
.Octava,
133131 bytesGracias a @ojdo por sugerir que tome datos de argv en lugar de stdin, ahorrándome 2 bytes.
Sin golf:
He publicado el código en ideone . La función independiente no requiere una
end
declaración, pero debido a que ideone tiene la función y el script de llamada en el mismo archivo, requiere un separador.Todavía no he sido capaz de descubrir cómo
stdin
trabajar en ideone. Si alguien sabe, todavía estoy interesado, así que por favor envíeme un comentario.Salida de muestra de ideone :
fuente
argv()
? La descripción de la tarea no parece requerir lectura de entradastdin
.dec2base
en Octave permite bases por encima de 36?BASE
debe ser un número entre 2 y 36, o una cadena de símbolos . Aquí, la expresión'i':'u'
expande la cadena de 85 caracteres!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstu
que sirve como base.Matlab, 175 bytes
Ejemplo:
fuente
PHP, 181 bytes
Versión en línea
Expandido
fuente
Golpe puro, ~ 738
Codificador primero (algo golfizado):
Pruebas:
y decodificador ahora:
Copia esto en
enc85.sh
ydec85.sh
,chmod +x {enc,dec}85.sh
y, a continuación:Pero podrías hacer una prueba más fuerte:
Reducido a 724 caracteres:
fuente