O desafio
Escreva um programa que possa receber uma entrada de uma string de linha única contendo qualquer caractere imprimível ASCII e produzir a mesma string codificada no Base85 (usando uma convenção big endian). Você pode assumir que a entrada sempre será ≤ 100 caracteres.
Um guia para a Base85
Quatro octetos são codificados em (geralmente) cinco caracteres Base85.
Caracteres Base85 variar desde
!
au
(ASCII 33-117) ez
(ASCII 122).Para codificar, você executa continuamente a divisão por 85 nos quatro octetos (um número de 32 bits) e adiciona 33 ao restante (após cada divisão) para obter o caractere ASCII para o valor codificado. Por exemplo, a primeira aplicação desse processo produz o caractere mais à direita no bloco codificado.
Se um conjunto de quatro octetos contiver apenas bytes nulos, eles serão codificados como um em
z
vez de!!!!!
.Se o último bloco for menor que quatro octetos, será preenchido com bytes nulos. Após a codificação, o mesmo número de caracteres adicionados como preenchimento é removido do final da saída.
O valor codificado deve ser precedido por
<~
e seguido por~>
.O valor codificado não deve conter espaços em branco (para este desafio).
Exemplos
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~>
O trecho a seguir codificará uma entrada fornecida para Base85.
fonte
Respostas:
CJam,
433935 bytesExperimente on-line no intérprete CJam .
Como funciona
Se a entrada estiver vazia,
N,)
será aplicada à sequência"<~"
. ComoN
inicialmente contém um único caractere, a saída estará correta.Não precisamos lidar com z ou preencher os pedaços codificados com o comprimento 5, pois a entrada conterá apenas caracteres ASCII imprimíveis.
fonte
a program that can take an input of a single-line string containing any ASCII printable characters,...
Python 3, 71 bytes
Eu nunca joguei golfe em Python, então isso provavelmente é sub-ideal.
Obrigado a @ZachGates por jogar fora 3 bytes!
fonte
input().encode()
vez destr.encode(input())
salvar 3 bytes.Python 2,
193162 bytesEste é o meu primeiro código de golfe, então tenho certeza de que há algo errado com minha abordagem. Eu também queria realmente implementar o base85 em vez de apenas chamar a função de biblioteca. :)
fonte
[:4+len(s)/4*4]
e nenhum caractere é removido do final da saída.while
ciclo em um como assim:while b:d=chr(b%85+33)+d;b/=85
. Você também pode remover o espaço entre suaprint
declaração e a sequência. Além disso, remova o espaço entre os argumentos passados paras.unpack
.Oitava,
133131 bytesAgradeço ao @ojdo por sugerir que eu receba a entrada do argv em vez do stdin, economizando 2 bytes.
Ungolfed:
Eu publiquei o código no ideone . A função autônoma não requer uma
end
declaração, mas como o ideone possui a função e o script de chamada no mesmo arquivo, é necessário um separador.Ainda não consegui descobrir como
stdin
trabalhar com ideona. Se alguém souber, ainda estou interessado, por favor, escreva-me um comentário.Saída de amostra do ideone :
fonte
argv()
? A descrição da tarefa não parece exigir a entrada de leiturastdin
.dec2base
no Octave permite bases acima de 36?BASE
deve ser um número entre 2 e 36 ou uma sequência de símbolos . Aqui, a expressão'i':'u'
expande a cadeia de 85 caracteres!"#$%&'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstu
que serve como base.Matlab, 175 bytes
Exemplo:
fonte
PHP, 181 bytes
Versão Online
Expandido
fonte
Festa pura, ~ 738
Primeiro codificador (algo jogado):
Testes:
e decodificador agora:
Copiar este em
enc85.sh
edec85.sh
,chmod +x {enc,dec}85.sh
então:Mas você poderia fazer algum teste mais forte:
Reduzido para 724 caracteres:
fonte