Desafio
Sua tarefa é codificar um número inteiro como uma sequência de caracteres ASCII e decodificá-la com êxito depois que a sequência for aleatoriamente embaralhada.
Você escreverá dois programas / funções , que serão chamados de codificador e decodificador .
Codificador
- Entrada: um número inteiro no intervalo .
- Saída: uma sequência de caracteres ASCII (não necessariamente imprimíveis).
Decodificador
- Entrada: uma permutação aleatória da string .
- Saída: o número inteiro .
Pontuação
Seja o comprimento máximo de em todos os valores possíveis de . Se o codificador agir de forma não determinística (o que é permitido, veja abaixo), então será o comprimento máximo de que pode ocorrer (possivelmente ).
Seja o comprimento do codificador em bytes e o comprimento do decodificador em bytes.
Então sua pontuação é .
A vitória é atribuída à finalização com a menor pontuação .
Prazo
Há um limite de tempo um tanto arbitrário de 1 minuto no tempo de execução do codificador e do decodificador para uma única caixa de teste (ou seja, um valor único de ).
O objetivo é evitar soluções que considerem a codificação forçada, enumerando todas as seqüências com determinadas propriedades. Se sua solução fizer algo mais inteligente que isso, provavelmente se ajustará à restrição de tempo e será considerada válida. Da mesma forma, se funcionar no TIO para alguns valores selecionados aleatoriamente de , será considerado válido. Caso contrário, testarei na minha máquina, mas observe que, se sua solução for pura força bruta, ela quase certamente falhará.
Regras
- O codificador e o decodificador devem ser escritos no mesmo idioma .
- O decodificador deve emitir o número inteiro correto para todas as permutações possíveis da string retornada pelo codificador .
- O codificador e o decodificador não têm permissão para compartilhar informações de nenhuma maneira (por exemplo, por meio de variáveis ou arquivos globais).
- A saída do codificador não precisa ser determinística (ou seja, a mesma entrada pode produzir cadeias de saída diferentes se o codificador for executado várias vezes), mas o decodificador sempre deve adivinhar o número inteiro correto .
- O codificador e o decodificador podem pegar e retornar o número inteiro de qualquer maneira conveniente (por exemplo, se é bom que a entrada seja
14
,"14"
ou[1,4]
). - O codificador pode saída a cadeia quer por imprimindo -o no
stdout
ou por devolver uma cadeia, uma lista / matriz de caracteres ou uma lista / matriz de inteiros no intervalo ; note que o decodificador receberá como entrada uma permutação de retornada pelo codificador , portanto, deve aceitar a string no mesmo formato que . - As brechas padrão são proibidas.
- Se possível, explique como seu código funciona e por que a pontuação reivindicada está correta.
Exemplo
Suponha que .
- O codificador recebe
14
como entrada. Pode sair"qwerty"
.- O decodificador recebe uma permutação de
"qwerty"
como entrada, por exemplo"tweyqr"
. Ele deve gerar14
(em qualquer formato conveniente).
O codificador também poderia ter retornado [113,119,101,114,116,121]
; nesse caso, o decodificador teria recebido (por exemplo) [116,119,101,121,113,114]
.
Observe que a string retornada pelo codificador também pode incluir caracteres ASCII não imprimíveis (mas sempre no intervalo [0x00, ..., 0x7F]
).