Comprimir para impressionar


8

Inspirado pelo desafio "Unique is Cheap" de @Laikoni , onde a pontuação se baseia no próprio desafio, bem como na resposta JavaScript (ES6) da @ETHproductions para o desafio "Palindrome Compression" , onde ele usa um visual bem legal método de compressão para a bandeira do palíndromo, indicação em maiúsculas / minúsculas e letras.

Desafio:

Você criará dois programas / função: um programa / função de compactação e um programa / função de descompactação.

Comprimir programa / função:

Dado os caracteres usados ​​no seu próprio código-fonte (o código-fonte de compactação e descompactação combinados) como apenas uma entrada possível, use qualquer tipo de método de compactação de bits de sua escolha e produza os 0s e s resultantes 1da compactação de bits dessa entrada .

A quantidade de bits ( 0s e 1s) outputted deve ser tão curto quanto possível, e esse valor será o resultado de sua resposta .

A idéia é ter um bom equilíbrio entre os diferentes tipos de caracteres usados ​​no seu próprio código-fonte, o tamanho dos seus programas / funções e o tipo de compactação de bits que você usou. Ou, para citar @RobertFraser em este comentário :

Este é um ótimo exemplo dos fundamentos da engenharia. Fazer uma descrição do problema, pensar em diferentes maneiras de resolvê-lo e fazer trocas entre requisitos (por exemplo, quantos bits dedicar a vários estilos), etc.

Regras do desafio:

  • O programa / função do compressor e descompressor deve estar na mesma linguagem de programação.
  • Você deve fornecer um programa / função de compactação e descompactação, e a quantidade de 0s e 1s que seu programa de compactação gera para ambos os programas / funções combinados (concattados) como entrada será sua pontuação.
  • A compactação deve - obviamente - funcionar para todos os caracteres usados ​​no código-fonte do programa / função de compactação e descompactação, em qualquer ordem ou quantidade. (Pode ter um comportamento indefinido para qualquer caractere que não esteja no seu código-fonte.)
  • O tipo de entrada não precisa necessariamente ser uma string. Também pode ser uma lista / matriz / fluxo de caracteres e pode ser como argumento do programa, STDIN, etc. Sua chamada.
    O mesmo se aplica à saída. Pode ser retornado de uma função ou impresso em STDOUT. Pode ser uma única string, número inteiro, etc.
  • Seu programa de compactação deve gerar pelo menos um 0ou 1(portanto, um catprograma vazio para o programa de compactação e descompactação não é possível).
  • Seu código-fonte pode não apenas conter 0s e 1s, excluindo não-ops (para evitar linguagens de programação que imprimem seu próprio código-fonte por padrão, onde os programas de compactação e descompactação podem ser um único 0ou 1, e a parte de não-ops é para evitar esse comportamento com um comentário não utilizado, desculpe as linguagens de programação baseadas em binário que usam apenas 0s e 1s como código-fonte).
  • Embora você precise dar suporte a uma entrada de 0 ou mais do pool de caracteres usado em seus programas / funções, você não precisa dar suporte a uma entrada vazia. Portanto, você pode assumir que cada entrada terá pelo menos 1 caractere.
  • Uma entrada possível pode ser maior que os tamanhos de compactação e descompactação combinados.
  • Se, por qualquer motivo, seu método de compactação for dependente da ordem e tiver uma saída menor quando sua entrada for DecompressionProgramCompressionProgramsubstituída CompressionProgramDecompressionProgram, você poderá escolher qualquer ordem de concatinação de seus programas / funções para sua pontuação.

Exemplo:

Digamos que o programa de compactação seja ABCe o programa de descompactação seja 123aBc. Para qualquer entrada que contém zero ou mais da personagem-piscina 123ABCab, ele deve ser capaz de comprimir corretamente esses caracteres para 0s e 1s, e ser capaz de descomprimir estes 0s e 1s de volta para os caracteres corretos. Algumas entradas de exemplo válidas para esses dois programas podem ser: ABC123aBc(é claro); A; 1Ca; 22222b1121221b; etc.

Regras gerais:

  • As regras padrão se aplicam à sua resposta, para que você possa usar STDIN / STDOUT, funções / método com os parâmetros adequados, programas completos. Sua chamada.
  • As brechas padrão são proibidas.
  • Se possível, adicione um link com um teste para o seu código.
  • Além disso, adicione uma explicação, se necessário.

Exemplo de resposta:

Java 8, pontuação 1440 bits, 180 (87 + 93) bytes

Aqui está uma implementação muito ruim no Java 8, em que cada caractere é simplesmente impresso como String binária de 8 bits.

Função de compressão:

Entrada fornecida como java.util.stream.IntStream.

s->s.forEach(c->System.out.print("".format("%8s",Long.toString(c,2)).replace(' ','0')))

Experimente online.

Função de descompressão:

Entrada fornecida como String.

s->{for(Integer i=0;i<s.length();System.out.printf("%c",i.parseInt(s.substring(i,i+=8),2)));}

Experimente online.


Este não é um teste quine, então posso ler meu código fonte?
Weijun Zhou

@WeijunZhou Depende do que você usa, mas provavelmente o permito na maioria dos casos. Eu acho que você quer ler o seu código-fonte e depois mapeá-lo facilmente com uma tabela de pesquisa, ou algo assim?
21718 Kevin Kevin Kurtzssen

Sim, algo semelhante está em minha mente.
Weijun Zhou

1
Eu posso ter perdido alguma coisa, mas aqui está uma possível brecha nas regras: compressor-> if input==compr_code+decompr_code then return 0 else return binary charcodes of input, descompressor-> if input==0 then return compr_code+decompr_code else convert binary codes to characters and return them. Pontuação final: 1 (menor possível). Os programas não serão triviais para escrever, mas com alguns truques do Quines eles certamente são factíveis.
Leo

@ Leo Hmm, você está realmente certo de que as regras atuais permitem tal resposta (sem querer, é claro). No entanto, não sei como corrigi-lo. Eu poderia afirmar que você deve fornecer o mapeamento usado para cada caractere individual, que deve corresponder / ser o mesmo para a entrada do compressor + descompressor, bem como qualquer configuração aleatória desses caracteres. Mas, nesse caso, posso limitar as possíveis respostas que desejam compactar pares de caracteres ou o que quer que eles apresentem. Todas as sugestões sobre uma regra para fechar essa lacuna, mas ainda deixam alguma flexibilidade para a criatividade ..?
Kevin Cruijssen

Respostas:



2

Java (OpenJDK 9) , pontuação 702 bits, 88 (42 + 46) bytes

Compressor, 42 bytes

$->new java.math.BigInteger($).toString(2)

Experimente online!

Descompressor, 46 bytes

$->new java.math.BigInteger($,2).toByteArray()

Experimente online!


Desculpe, eu estou jogando o byte baixo custo ( hum , para Java, quero dizer), em vez da compressão dura: S
Olivier Grégoire

Nem sabia que era possível colocar algum Stringno BigIntegerconstrutor .. Imaginei que daria um NumberFormatException ou algo assim .. Eu sabia sobre o .toString(2). Bom golfe da minha resposta exemplo, eu acho. ;)
Kevin Cruijssen

@KevinCruijssen De fato, atualmente, é mais um exemplo do que qualquer outra coisa. 703 bits significa 88 bytes. Eu não podia nada compressa em menos de 88 bytes até agora, mas eu ainda estou tentando ;-)
Olivier Grégoire

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.