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 0
s e s resultantes 1
da compactação de bits dessa entrada .
A quantidade de bits ( 0
s e 1
s) 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
0
s e1
s 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
0
ou1
(portanto, umcat
programa vazio para o programa de compactação e descompactação não é possível). - Seu código-fonte pode não apenas conter
0
s e1
s, 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 único0
ou1
, 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 apenas0
s e1
s 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
DecompressionProgramCompressionProgram
substituídaCompressionProgramDecompressionProgram
, 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 ABC
e 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 0
s e 1
s, e ser capaz de descomprimir estes 0
s e 1
s 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')))
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)));}
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.