Objetivo
Escreva um programa ou função que traduza um número de telefone numérico em texto que facilite a digitação. Quando os dígitos são repetidos, eles devem ser lidos como "duplo n" ou "triplo n".
Exigências
Entrada
Uma sequência de dígitos.
- Suponha que todos os caracteres sejam dígitos de 0 a 9.
- Suponha que a string contenha pelo menos um caractere.
Saída
Palavras, separadas por espaços, de como esses dígitos podem ser lidos em voz alta.
Traduzir dígitos para palavras:
0 "oh"
1 "um"
2 "dois"
3 "três"
4 "quatro"
5 "cinco"
6 "seis"
7 "sete"
8 "oito"
9 "nove"Quando o mesmo dígito for repetido duas vezes seguidas, escreva " número duplo ".
- Quando o mesmo dígito for repetido três vezes seguidas, escreva " número triplo ".
- Quando o mesmo dígito for repetido quatro ou mais vezes, escreva " número duplo " para os dois primeiros dígitos e avalie o restante da string.
- Há exatamente um caractere de espaço entre cada palavra. Um único espaço à esquerda ou à direita é aceitável.
- A saída não diferencia maiúsculas de minúsculas.
Pontuação
Código fonte com o mínimo de bytes.
Casos de teste
input output
-------------------
0123 oh one two three
4554554 four double five four double five four
000 triple oh
00000 double oh triple oh
66667888 double six double six seven triple eight
19999999179 one double nine double nine triple nine one seven nine
code-golf
kolmogorov-complexity
Mão-E-Comida
fonte
fonte
Respostas:
05AB1E ,
5352515049 bytesExperimente online!
Explicação:
fonte
M
também olha dentro de listas ao determinar o número máximo máximo na pilha? Não sabia disso. Parece algo para lembrar. :)Conjunto 8088, IBM PC DOS,
164159156155 bytesBinário:
Crie e teste o executável usando a
xxd -r
partir de cima ou faça o download do PHONE.COM .Listagem desmontada:
TL; DR:
A sequência de entrada é lida da direita para a esquerda para facilitar a localização de um triplo. A saída é enviada para a pilha x86 para simplificar a reversão da ordem de exibição e também facilitar a reorganização das palavras "dupla" e "tripla" para preceder o nome do dígito.
Se o próximo dígito for diferente do último, o nome será procurado na lista de palavras e empurrado para a pilha. Como não existe um conceito formal de uma "matriz indexada de seqüências de comprimento variável" no código da máquina, a lista de palavras é varrida
i
(o índice da palavra) quantas vezes o delimitador ($
) encontra a palavra correspondente. Felizmente, o x86 possui um par de instruções curtas (REPNZ SCASB
que são semelhantes amemchr()
C), que simplificam isso (obrigado CISC !).Se o dígito for o mesmo que o anterior, o contador para a duração de uma "execução" é incrementado e continua em loop para a esquerda na entrada. Depois que a execução termina, o nome do dígito é retirado da pilha, pois ele deve ser colocado após o "duplo" ou "triplo" para cada agrupamento. Se a duração da execução for ímpar (e a duração da execução for
> 1
), o nome do dígito seguido pela string "triple" será empurrado para a pilha e a duração da execução será reduzida em 3. Como a duração da execução agora será regular, a etapa é repetido para "double" até que o comprimento da execução seja 0.Quando a sequência de entrada chega ao fim, a pilha é despejada com cada sequência salva gravada na tela em ordem inversa.
E / S:
Um executável autônomo do PC DOS, entrada da saída da linha de comando para o console.
Faça o download e teste o PHONE.COM .
fonte
repne scasb
émemchr
(oustrchr
se você sabe que haverá um sucesso), nãostrstr
.mov cl, byte[si]
é equivalente amovzx cx, byte [si]
. Gostaria de saber se usando um reg diferente, comoAH
, para a contagem com emdec ah / jnz
vez deloop
salvar qualquer coisa de não ter que pressionar / pop CX. Provavelmente não, e você não tem nenhum registro de 16 bits que permita 1 bytedec
.CH=0
eu vou em fysnet.net/yourhelp.htm , que para qualquer versão razoável do DOS é sempre zerado, o mesmo comBX
. Bom pensamento sobre a extensão zeromov
, embora tecnicamente eu não ache quemovzx
esteja disponível no 808x (mantendo a plataforma de destino um IBM PC 5150 e tudo mais). Eu brinquei com todos os registros da melhor maneira possível para salvar os bytes, mas se você vir algo que provavelmente perdi, por favor me avise!memchr
IMO. O nome da "instrução de string" leva as pessoas a pensarem que trabalham em strings C de comprimento implícito, mas na verdade elas trabalham em strings de comprimento explícito, comostd::string
buffers. Comomemcpy
,memset
(movs / stos),memchr
/memrchr
(repne scas com DF = 0 ou 1) ememcmp
(reppe cmps). O único equivalente em Crepe scas
éstrspn
porque eu não acho que exista umamem
função para isso. Você pode até descreverstosw
oustosd
comowmemset
por exemplo.movzx
custa um byte extra de opcode e, sim, foi introduzido apenas com 386. Era mais fácil digitar para descrever o fato de que você está fazendo uma mesclagem de baixo byte e assumindo que ele é estendido corretamente a zero. Se você conhece CX ou pelo menos CH = 0, então sim para o golfe sempre vámov
para CL. Mas, fora do golfe, as instruções de carregamento de bytes do x86 sãomovzx
emovsx
: evitam dependências falsas ou outras travessuras de registro parcial. Em CPUs modernas com um destino dword, elas são tão rápidas quanto asmov
cargas dword .05AB1E ,
6156535251 bytes-9 bytes graças a @Grimy .
Experimente online ou verifique todos os casos de teste .
Explicação:
Veja esta dica 05AB1E (seção Como usar o dicionário? ) Para entender por que
… ‹¶½¿
é" double triple"
e“Šç€µ‚•„í†ìˆÈŒšï¿Ÿ¯¥Š“
é"oh two three four five six seven eight nine"
.fonte
if(length>=4)
antes de adicionar o restante, mas é claro que não é necessário números inteiros de tamanho1,2,3
, porque;Å2¨3ª£
isso deixará as cordas intactas (apenas envoltas em uma lista que nivelamos após o mapa). Obrigado por perceber! E ansioso para ver sua resposta comÅγ
. Eu realmente tive a sensação de que a primeira parte poderia ser feita muito mais curta de alguma forma.Dg;LàäR
ainda é um byte menorāɨšJõK
e muito mais parecido com o que você tinha originalmente.á
vez deõK
no final. :)á
! Aqui está um 51 e outro . 50 parece possível.QuadR , 137 bytes SBCS
Título com um espaço à esquerda.
Experimente online!
∊
ε nlist (flatten)¯2↑¨
tomar os dois últimos caracteres (preenchimento à esquerda com um espaço) de cada caracteres@
em posições onde(∊∘⎕A)
personagens são membros da maiúscula A lphabet⍵
no resultado da operação abaixo PCRE Substituir ...(.)
qualquer caractere\1
seguido por si mesmo*
zero ou mais vezes, é substituído pelo resultado da seguinte…{…}⍵M
"dfn";⍵
é o M atch do padrão acima('OhOneTwoThreeFourFiveSixSevenEightNine'(
...)⎕A)
aplicar a seguinte função tácita anônimo com a cadeia longa ea maiúscula A lphabet como argumentos de esquerda:∊
associação (de letras na cadeia longa no alfabeto maiúsculo)⊂
partições (com uma nova partição começando sempre que um membro⊣
o argumento esquerdo (ou seja, a cadeia longa)(
...)⎕R
PCRE R EColoque os seguintes padrões com essas palavras:⎕D
os dígitos de 0 a 9,¨
tratar cada um como um padrão separado⍺←
atribuir esta função de substituição a⍺
(para um lphabetise)⋄
então,⊃⍵
o primeiro caractere da partida,
como uma corda⍺
aplicar⍺
a elew←
atribuir isso aw
(por palavra )' '∊
…:
Se o espaço for um membro do mesmo (ou seja, se a partida estiver vazia):⍬
retornar nada (torna-se a string vazia)⋄
outro,1=≢⍵:
se alguém igualar a contagem de caracteres na partida (ou seja, seu comprimento):⍺⍵
alfabetize esse dígito⋄
outro,3=≢⍵:
se três for igual à contagem de caracteres na partida (ou seja, seu comprimento):'Triple',w
prepend "Triple" ao w ord⋄
outro,2↓⍵
cair para dígitos da partida∇
recuar sobre issow,
preceda a palavra'Double',
preceder "Duplo"fonte
JavaScript (ES6),
161 160 152144 144 bytesA saída inclui um único espaço à esquerda.
Experimente online!
ou Veja o código fonte formatado
Quão?
A conversão é processada em três etapas:
"X X"
por"double X"
"double X X"
por"triple X"
Para salvar bytes, usamos a mesma expressão regular para todas as etapas:
que funciona da seguinte maneira:
Na etapa 1, usamos uma função de retorno de chamada que seleciona a palavra correta em uma tabela de pesquisa:
"799999"
→" seven nine nine nine nine nine"
Na etapa 2, substituímos por
"$1 double$2"
:" (seven)( nine)( nine)"
→" seven double nine"
"( nine)( nine) nine"
→" double nine nine"
Na etapa 3, substituímos por
"triple$2"
:" (double)( nine)( nine)"
→" triple nine"
fonte
Linguagem Wolfram (Mathematica) , 115 bytes
Experimente online!
Leva uma lista de dígitos como entrada. A saída inclui um espaço à frente.
fonte
Stax , 56 bytes
Execute e depure
fonte
Python 2 ,
171169168 bytesExperimente online!
-1 byte, graças ao Jitse
fonte
1312
;)['','double ','triple '][n]
a' eellpbiurotd'[-n:0:-2]
de 168 bytes: Experimente online!Perl 5
-p
, 111 bytesExperimente online!
Explicação:
fonte
Scala , 213 bytes
Consegui. De alguma forma, a versão recursiva que eu estava tentando criar era muito mais detalhada do que esta (ainda que recursiva, mas apenas em um caso). A função
f
pega como string de entrada o número de telefone e gera sua fonética com um espaço em branco à direita.Experimente online!
Edit : -8b graças a DrY Wit!
Scala , 215 bytes
E aqui vem a versão líder em espaço em branco, dois bytes a mais por algum motivo (mesmo com refatoração massiva).
Experimente online!
fonte
(o(0)+"").toInt
poro(0)-48
.PHP ,
174169166159 bytesExperimente online!
Para cada dígito no índice a
$i
partir de 0:$i
for igual a 3, imprime'triple '
e adiciona 2 à$i
próxima iteração, com 2 dígitos saltados.$i
for igual ou superior a 2, mas não 3, imprime'double '
e adiciona 1 à$i
próxima iteração, com 1 dígito saltado.$i++
.fonte
Retina 0.8.2 , 105 bytes
Experimente online! Gera um espaço à esquerda. Explicação: Eu tentei originalmente um regex que corresponde automaticamente a 2 ou 3 dígitos, mas a abordagem de @ Arnauld acabou por ser mais golfista. Explicação:
Combine pares de dígitos idênticos e substitua o primeiro por a
=
. Em seguida, repita para que, para um número ímpar, o segundo último dígito também seja substituído por um=
.Espace os dígitos
=
.Manuseie a caixa de três dígitos idênticos.
Substitua todos os caracteres restantes por palavras.
fonte
Geléia , 59 bytes
Experimente online!
Um link monádico que usa uma sequência de caracteres de dígitos como argumento e retorna uma sequência Jelly de palavras separadas por espaço. Quando chamado como um programa completo, gera implicitamente.
fonte
T-SQL 2017, 238 bytes
Adicionadas algumas quebras de linha para torná-lo legível
Experimente online
fonte
C ++, 382 bytes
Não é super inteligente, mas alguém precisava escrever uma versão em C ++. A função recursiva R passa pela string de entrada e conta valores repetidos. Se houver mais de 3 repetições, ele fingirá que houve 2 repetições, depois retrocederá e tentará novamente.
Mais alguns caracteres de origem provavelmente poderiam ser extraídos com
#define
major, mas tenho certeza de que algo melhor poderia extrair mais.e verificação de casos de teste:
fonte
#include <sstream>
? Ou você poderia movê-lo para baixo após a parte do golfe para a função de teste? Eu acho que digitarstd::ostream&s
levaria menos espaço do queusing namespace std;
, a menos que haja outros lugares onde você precisariastd::
.Perl 6 ,
9693 bytesExperimente online!
Este é um bloco de código anônimo que pega um número e retorna uma string com os números em maiúsculas, por exemplo
0123 => oh ONE TWO THREE
com um único espaço à direita.Isso foi excluído por um tempo até eu descobrir como usar capturas em um lookahead, mas deve ser corrigido agora.
fonte
Vermelho , 242 bytes
Experimente online!
fonte
Scala , 253 bytes
Experimente online!
fonte
Oracle SQL, 578 bytes (em formato formatado)
A solução não é concisa de forma alguma, portanto, publique-a de maneira formatada.
Teste no SQL * Plus
O principal truque é que os dígitos são convertidos em palavras usando modelos no formato Oracle, em vez de literais codificados "um" ... "nove".
fonte
union all
porselect regexp_replace(s,case when length(regexp_substr(s, '(.)(\1)+')) = 3 then '^...' else '^(.)\1|^.' end) from r
.JavaScript, 142 bytes
Experimente online!
fonte
(Roblox) Lua 5.1 , 166 bytes
Garantir
s
é um valor de sequência predefinido preenchido apenas com dígitos; essa será a variável a ser modificada. O resultado incluirá um caractere de espaço inicial[\u20]
.fonte
s
que você já tenha as informações. Além disso, você tem um bom primeiro post! Eu recomendaria que você incluísse um link para um site de testes on-line, por exemplo, tio.run/#lua, para que outros possam testar sua solução