Adoraria pegar um número e saber quantas sílabas existem nele, quando faladas em inglês.
Vamos limitar isso a números inteiros positivos que são menores que mil.
Como sou britânico, seguiremos a coluna das centenas com um 'e' quando houver dígitos diferentes de zero depois dele.
O desafio
- Escreva um código que aceite um número inteiro positivo menor que 1000 e dê o número de sílabas nas palavras que representam esse número no inglês britânico.
- NÃO precisa gerar as palavras para representar os números, apenas o número de sílabas que elas contêm.
- É código de golfe, tente conseguir isso no menor número de bytes.
- Use qualquer idioma que você quiser.
- As brechas padrão são proibidas.
Casos de teste
| N | In words | Syllables |
| 1 | one | 1 |
| 2 | two | 1 |
| 3 | three | 1 |
| 4 | four | 1 |
| 5 | five | 1 |
| 6 | six | 1 |
| 7 | sev-en | 2 |
| 8 | eight | 1 |
| 9 | nine | 1 |
| 10 | ten | 1 |
| 11 | el-ev-en | 3 |
| 12 | twelve | 1 |
| 13 | thir-teen | 2 |
| 14 | four-teen | 2 |
| 17 | se-ven-teen | 3 |
| 20 | twen-ty | 2 |
| 21 | twen-ty one | 3 |
| 42 | four-ty two | 3 |
| 73 | sev-en-ty three | 4 |
| 77 | sev-en-ty sev-en | 5 |
| 100 | one hund-red | 3 |
| 110 | one hund-red and ten | 5 |
| 111 | one hund-red and el-ev-en | 7 |
| 555 | five hund-red and fif-ty five | 7 |
| 700 | sev-en hund-red | 4 |
| 770 | sev-en hund-red and sev-en-ty | 8 |
| 777 | sev-en hund-red and sev-en-ty sev-en | 10 |
| 999 | nine hund-red and nine-ty nine | 7 |
code-golf
natural-language
AJFaraday
fonte
fonte
Respostas:
Python 2 ,
84837467 bytesGraças a @xnor por jogar fora
916 bytes!Experimente online!
Python 2 , 79 bytes
Simples, mas mais longo.
Experimente online!
fonte
-10
para~9
e comutação em torno da última pouco para+(0<n%100!=12)-(n%100!=11)
, mas que ainda é mais do que a sua nova solução.lambda n:4*(n>99)+`n`.count('7')+cmp(n/10%10,1)-n%~9/9-min(n%100,13)%12/~9
min(n%100,13)%12/~9
poderia realmente ajudar com uma abordagem que eu estava tentando também para a minha resposta de geléia.Perl 5
-p
, 53 bytesExperimente online!
Quão
fonte
JavaScript (ES6), 89 bytes
Experimente online!
fonte
Python 2 ,
112108 bytesExperimente online!
-4 bytes, graças a Shaggy
fonte
[2]*7
parte falhará17
, pois deve ser 3 em vez de 2 (sev-en-teen
).JavaScript,
8684 bytesUma porta aprimorada da solução Python do TFeld .
Experimente online
2 bytes economizados graças ao Arnauld
fonte
Wolfram Language
101115 BytesExplicação
(substituindo
StringSplit
pors
)IntegerName
renderiza o número no inglês americano (ou seja, sem "e" incluído em números maiores que 100.)777-> "seven hundred seventy-seven
.StringSplit[IntegerName@#,"-"]
remove quaisquer hífens na renderização.StringSplit/@
divide a renderização em palavras.Join@@
deixa uma lista simples de palavras, sem lista incorporada (no caso em que um hífen apareceu).WordData[#,"Hyphenation"]
divide uma única palavra em suas sílabas.Join@@
deixa uma lista simples de sílabas em todas as palavras.Length
conta as sílabas+Boole[#>100&&#~Mod~100!=0]
adiciona1
à contagem de sílabas os números maiores que 100 (devido ao adicional "e" empregado na renderização em inglês britânico), excluindo múltiplos integrais de 100.fonte
Java 11,
105102 bytesContém grande quantidade de caracteres não imprimíveis.
-3 bytes obrigado @ OlivierGrégoire .
Experimente online.
Explicação:
fonte
.split("7",-1)
para.split("7",9)
e-6+(n>99?4:0)
para-(n>99?2:6)
.-(n>99?2:6)
, mas agora é tão óbvio que você apontou. E-1
a9
função da entrada de tamanho limitado, eu não teria pensado, por isso obrigado!05AB1E ,
3431 bytesExperimente online ou verifique todos
[1,999]
os casos de teste .Explicação:
Com todas as verificações mencionadas, resultará em 1 para verdade e 0 para falsey.
fonte
I
(entrada) em vez deX
(entrada mod 100) ao verificar se é maior que 20 para o +1 dety
.>
(Verifique se a entrada é maior que 100) foi substituída por@
(verifique se a entrada é maior ou igual a 100). Talvez eu deveria ter verificado mais alguns casos me testar com mais cuidado antes de postar .. Desculpe por isso ..Carvão ,
3931 bytesExperimente online! Link é a versão detalhada do código. Explicação:
Calcule ajustes no número de sílabas e produza o resultado como uma sequência.
Comece alterando cada dígito diferente de zero para 1 e decodificando como base 2. Isso fornece a resposta correta para a maioria das entradas.
Adicione 1 para cada um
7
.Pegue a string literal
10000000001021111111
e acrescente 80 zeros, depois indexe ciclicamente pela entrada e subtraia esse dígito.fonte
Gelatina ,
282523 bytesExperimente online!
Como funciona
fonte
PHP ,
190158145141137 bytesExperimente online!
Uma porta da solução de Kevin Cruijssen (infelizmente não tem a mesma brevidade no PHP :))
-
3245 graças a Shaggy!-3 graças a Kevin Crujissen!
fonte
>99
e ao>19
invés de>=100
e>=20
.05AB1E , 24 bytes
Resposta da geléia do Porto de Dennis
Experimente online! ou como um conjunto de testes
Explicação
fonte
05AB1E , 26 bytes
Porto de @Neil resposta de carvão , por isso certifique-se de upvote-lo bem se você gosta deste resposta!
Experimente online ou verifique todos os casos de teste .
Número inteiro compactado
•Ž¢Γ}Þ±6u•
pode ser alternativamente•8JA•b2TÌǝ
para a mesma contagem de bytes.Explicação:
Veja este 05AB1E resposta meu (seção Como comprimir grandes inteiros? ) Para entender por que
•Ž¢Γ}Þ±6u•
é10000000001021111111
.fonte