Objetivo
A idéia é fornecer o código necessário para mapear um número inteiro de 32 bits de / para uma palavra pronunciável de no máximo 9 caracteres. Isso pode ser útil, por exemplo, para facilitar a lembrança de um número de série ou digitar um formulário.
É necessário o método para traduzir um número inteiro para a palavra correspondente e para converter novamente uma palavra para o número inteiro correspondente.
Regras
Deve haver um mapeamento individual entre números inteiros e palavras, e todo o conjunto de números inteiros de 32 bits (ou, de outra forma, qualquer número inteiro de 0 a 4294967295) deve ser mapeado. Embora, obviamente, nem todas as palavras sejam significativas, e a inserção de palavras que não são mapeadas para um número inteiro pode ter um comportamento não especificado.
Você é livre para decidir exatamente qual conjunto de palavras "pronunciáveis" é significativo e como o mapeamento é feito, mas as palavras devem pelo menos seguir estas regras:
- Somente as 26 letras básicas (A ... Z) devem ser usadas como caracteres. Acentos, revestimento, etc ... não devem ser usados para estender as combinações possíveis.
- Máximo de 9 caracteres por palavra.
- duas consoantes (BCDFGHJKLMNPQRSTVWXZ - 20 possibilidades) não devem ser colocadas próximas uma da outra (elas devem estar rodeadas de vogais).
- duas vogais (AEIOUY - 6 possibilidades) não devem ser colocadas próximas uma da outra (elas devem estar cercadas por consoantes).
Nota: o esquema mais simples no qual todas as palavras são construídas como CVCVCVCVC
( C
sendo uma consoante e V
uma vogal) fornece combinações 4147200000 e um número inteiro de 32 bits possui 4294967296 valores possíveis, portanto, não é suficiente. Você precisa expandir o número de combinações, permitindo palavras mais curtas ou permitindo VCVCVCVCV
combinações também.
Aplicam-se outras regras padrão e as brechas padrão são proibidas.
Entradas saídas
Para cada envio, dois códigos devem ser fornecidos:
- Um que recebe um número inteiro como argumento / entrada e retorna / imprime a palavra correspondente
- Uma que pega uma palavra como argumento / entrada e retorna / imprime o número inteiro correspondente
Como alternativa, você pode optar por enviar um único trecho de código que lida com as duas operações:
- Quando um número inteiro é fornecido como entrada, ele gera a palavra correspondente
- Quando recebe uma string como entrada, gera o número inteiro correspondente
Condição vencedora
Este é um código-golfe , a resposta que possui o menor número de bytes (ao somar os dois trechos de código, para soluções que optam por trechos separados) ganha.
Respostas:
JavaScript (ES6), 205 bytes
O ponto de corte entre CVCVCVCVC e VCVCVCVCV é 4e9, portanto, começa a dar errado em 5244160000 (entrada numérica) ou
zesuwurib
(entrada de sequência).fonte
PHP, 353 bytes
Codificação + decodificação
is_numeric($argn)
contém o booleano. É verdade se a entrada for um número inteiro.PHP, 190 bytes (codificação) + 195 bytes (decodificação) = 385 bytes
Codificação
5391360000 = 26 * 120 ** 4 combinações estão disponíveis
Codificação de versão online sem E_NOTICE
Expandido
Entrada => Saída
Se você precisar sempre de um resultado de 9 bytes, substitua
while($a)
porwhile(strlen($r)<9)
+ 10 bytesDecodificação
Expandido
Entrada => Saída
Decodificação de versão online sem E_NOTICE
Verificação Adicional
Se precisarmos verificar se uma string é válida.
Adicione
$x.=$b?:0;
no final do loop de decodificação + 10 bytesSubstitua
echo$s;
porecho!preg_match('#([01])\1$#',$x)?$s:_;
+ 32 bytesfonte
R, 165 bytes
Codificação e decodificação em uma função.
Essa função usa o método de força bruta para criar todos os valores possíveis e, em seguida, simplesmente retornar o índice quando receber uma entrada de string e retornar a string quando receber uma entrada inteira. Como conseqüência, é muito lento e usa 16 GB ou mais de memória!
4.354.560.000 valores são possíveis. Isso abrange todas as seqüências de caracteres do formulário CVCVCVCV (C), com o último C sendo opcional.
fonte