Conceito
Lembrar números pode ser difícil. Lembrar uma palavra pode ser mais fácil. Para memorizar grandes números, criei uma maneira de pronunciá-los de maneira semelhante ao leetspeak.
Regras
Cada dígito é substituído primeiro pela sua letra correspondente:
0 => O
1 => I
2 => R
3 => E
4 => A
5 => S
6 => G
7 => T
8 => B
9 => P
Após a substituição, duas coisas adicionais são feitas para melhorar a pronúncia:
Entre duas consoantes, a
U
é adicionado.Entre duas vogais, a
N
é adicionado.
Exemplos / casos de teste
512431 => SIRANENI
834677081 => BENAGUTUTOBI
3141592 => ENINANISUPUR
1234567890 => IRENASUGUTUBUPO
6164817 => GIGABIT
O que é impossível
- Letras e números misturados na mesma palavra
- Duas consoantes sucessivas ou duas vogais sucessivas
- Letras que não estão na lista acima
- Outros personagens
Regras
O objetivo deste código-golfe é criar um tradutor bidirecional para esse conceito.
- Seu programa deve primeiro entender por si mesmo se é tradução de letra para número ou número para letra.
- Ele deve verificar se a entrada é formada corretamente.
- Se tudo estiver correto, exiba a tradução.
- Senão, exiba uma mensagem de erro, nada, retorne um valor falsey ou trava o programa.
Detalhes
- O número / string de entrada pode ser inserido no formato que você desejar (stdin, argumento, ...)
- Isso é código-golfe , então a resposta mais curta vence.
- As brechas padrão são proibidas.
GIGATESTER
serGIGATESUTER
?AB23
;AEI
;BB
;Z
;ACE
;giga
;!@#$
;-123
; etc. Além disso, com base nas regras de validação, podemos converter6164735732 => GIGATESTER
, masGIGATESTER
resultará em um valor falso, devido aST
(regra de duas consoantes sucessivas). Da maneira como seu desafio está configurado atualmente, a parte principal do desafio é a validação, em vez da conversão. Estou bem com isso, mas a validação deve ser definida um pouco melhor nesse caso.Respostas:
JavaScript (ES6), 130 bytes
Recebe entrada como uma string nas duas formas de conversão. Retorna a tradução como uma sequência ou
false
no caso de uma entrada inválida.Demo
Mostrar snippet de código
fonte
Japt ,
6159928584 bytesRecebe a entrada como uma sequência de caracteres para ambas as operações e retorna uma sequência de caracteres para
false
entradas inválidas ou inválidas. Assume que as entradas numéricas sempre conterão vários dígitos, adicione 1 byte substituindoUÉ
porUn<space>
se isso não for válido. Retornafalse
para o caso de teste,GIGATESTER
mas, de acordo com as regras, essa entrada deve ser inválida.Experimente: Números -> Letras ou Letras -> Números
24 bytes salvos, obrigado a obarakon , que também me convenceu a retomar isso depois que o abandonei anteriormente. Eu gostaria que ele não tivesse!332625 bytes (!) Sacrificados implementando uma correção rápida (isto é, ainda não foi totalmente aproveitada) para verificar a validade da entrada.Explicação
(Ainda a ser atualizado para a versão mais recente)
fonte
AEI
Python 3 , 147 bytes
Experimente online!
fonte
Java (OpenJDK 8) ,
416410399382376370 bytes-2 bytes graças a @Cyoce
-17 mais bytes graças a uma ideia de @Cyoce
-6 bytes graças a @KevinCruijssen
Experimente online!
Ugh, a substituição de java é tão detalhada.
Função que pega uma string e retorna a string traduzida do número -> letra ou vice-versa. Falha na entrada inválida (você pode ver isso no exemplo tio, em que ele gera os valores corretos para os 10 primeiros casos de teste e trava com um erro de divisão por zero, que é exibido na exibição de depuração)
Ungolfed (o primeiro e o último termo do loop for são extraídos para facilitar a leitura)
A regex para correspondência dos números é simples, mas aqui está a regex para correspondência das letras com os números
fonte
(s)->
if
instrução são atribuições (que retornam um valor), tente substituir oif
...else if
...else
pelo operador condicional?:
, precedendo-o porObject _=
para torná-lo uma instrução válida. Não tenho certeza se isso realmente ajudaria a contagem de bytes, mas acho que sim.t
, porque você a usa apenas uma vez. Entãot.charAt(i)+""
se torna"OIREASGTBP".charAt(i)+""
( -4 bytes ). E você pode colocar a última linha dentro do loop for após ai<9;
declaração dentro do loop for. Assim, torna-sefor(;i<9;s=b?s.replace(v,c):s.replace(c,v)){
( -1 byte ). Ah, e você também pode colocar os=b?...
que vem logo após oint i=-1;
loop for:for(s=b?...;i<9;...
( -1 byte ).PHP;
129 127 267 259228 bytesExecute como pipe
-nR
ou experimente online .demolir
fonte
Java 8,
312308304301294290 bytes-4 bytes (308 → 304) para uma correção de bug (não ocorre frequentemente que a contagem de bytes diminui quando eu corrigo um bug no meu código ..: D)
EDIT: usa uma abordagem diferente da da resposta Java @ PunPun1000, primeiro criando a String de retorno em um loop for sobre os caracteres e, em seguida, usa uma regex mais abstrata para validá-la no ternário de retorno (a entrada tem todos os dígitos, ou as vogais e consoantes fornecidas são alternadas (portanto, sem vogais nem consoantes adjacentes).
Explicação:
Experimente aqui.
A regex de validação:
fonte
05AB1E , 76 bytes
Experimente online!
Retorna o valor falso
0
para entrada inválida.fonte
Bater ,
241 238235 bytesExperimente online!
Menos golfe:
fonte
PHP, 268 bytes
Experimente online!
fonte
Perl, 127 bytes
126 bytes + linha de comando de 1 byte
Uso:
Deve seguir todas as regras do desafio - pode aceitar letras ou números e cometerá um erro (divisão por zero) se a validação falhar
fonte
NO
eUS
.Ruby , 205 + 1 = 206 bytes
Usa o
-p
sinalizador para +1 byte. Agora, com um sistema exaustivo de validação de entrada.Experimente online!
fonte
Python 3, 741 bytes
Experimente online!
Há muito espaço para melhorias, eu sei.
fonte
sed, 123 bytes
Explicação
Primeiro, envolvemos dígitos com
_
(para vogais) ou=
(para consoantes).Se não fizemos nenhuma substituição, estamos convertendo letras em dígitos, portanto é uma substituição simples e exclua
U
eN
. Então saia.Caso contrário, passamos a rotular
a
, onde lidamos com vogais consecutivas e depois consoantes consecutivas. Transforme os dígitos em letras e exclua os caracteres do marcador que introduzimos na primeira etapa.fonte
Python3, 246 bytes
explicação:
dicttupla de , além do elemento atualditadoé uma tabela verdade baseada em dois elementos, sendo vogal ou nãofonte
JavaScript (ES6), 120
Uma função que recebe entrada como uma string. Retorna a string traduzida corretamente se a entrada for válida, caso contrário, false ou se a função travar.
Menos golfe
Teste
fonte