Me encantaría tomar un número y saber cuántas sílabas contiene cuando se habla en inglés.
Limitemos esto a enteros positivos que son menos de mil.
Soy británico, así que vamos a seguir la columna de las centenas con un 'y' cuando haya dígitos distintos de cero después.
El reto
- Escriba un código que acepte un número entero positivo inferior a 1000 y genere el número de sílabas en las palabras que representan ese número en inglés británico.
- NO necesita generar las palabras para representar los números, solo el número de sílabas que contienen.
- Es un código de golf, intente lograr esto en la menor cantidad de bytes.
- Usa el idioma que quieras.
- Las lagunas estándar están prohibidas.
Casos de prueba
| 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
fuente
fuente
Respuestas:
Python 2 ,
84837467 bytes¡Gracias a @xnor por jugar
916 bytes!Pruébalo en línea!
Python 2 , 79 bytes
Directo, pero más largo.
Pruébalo en línea!
fuente
-10
a~9
y cambiar todo el último bit a+(0<n%100!=12)-(n%100!=11)
, pero eso es todavía más largo que su nueva solución.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
en realidad podría ayudar con un enfoque que estaba tratando de obtener mi respuesta de Jelly también.Perl 5
-p
, 53 bytesPruébalo en línea!
Cómo
fuente
JavaScript (ES6), 89 bytes
Pruébalo en línea!
fuente
Python 2 ,
112108 bytesPruébalo en línea!
-4 bytes, gracias a Shaggy
fuente
[2]*7
parte fallará17
, ya que debería ser 3 en lugar de 2 (sev-en-teen
).JavaScript
8684 bytesUn puerto ajustado de la solución Python de TFeld .
Pruébalo en línea
2 bytes guardados gracias a Arnauld
fuente
Wolfram Language
101115 BytesExplicación
(sustituyendo
StringSplit
pors
)IntegerName
representa el número en inglés americano (es decir, sin "y" incluido en números mayores que 100.) Ej777-> "seven hundred seventy-seven
.StringSplit[IntegerName@#,"-"]
elimina cualquier guión en el renderizado.StringSplit/@
divide la representación en palabras.Join@@
deja una lista simple de palabras, sin lista incrustada (en el caso de que aparezca un guión).WordData[#,"Hyphenation"]
divide una sola palabra en sus sílabas.Join@@
deja una lista simple de sílabas en todas las palabras.Length
cuenta las sílabas+Boole[#>100&&#~Mod~100!=0]
se suma1
al recuento de sílabas para aquellos números mayores que 100 (debido a los "y" adicionales empleados en la representación en inglés británico), excluyendo los múltiplos integrales de 100.fuente
Java 11,
105102 bytesContiene montones de caracteres no imprimibles.
-3 bytes gracias @ OlivierGrégoire .
Pruébalo en línea.
Explicación:
fuente
.split("7",-1)
a.split("7",9)
, y-6+(n>99?4:0)
a-(n>99?2:6)
.-(n>99?2:6)
, pero es tan obvio ahora que lo has señalado. Y-1
a9
causa de la entrada de tamaño limitado yo no habría pensado, así que gracias!05AB1E ,
3431 bytesPruébelo en línea o verifique todos
[1,999]
los casos de prueba .Explicación:
Con todas las verificaciones mencionadas, resultará en 1 para veracidad y 0 para falsey.
fuente
I
(input) en lugar deX
(input mod 100) al verificar si es mayor que 20 para el +1 dety
.>
(verifique si la entrada es mayor que 100) se ha reemplazado por@
(verifique si la entrada es mayor o igual a 100). Tal vez debería haber revisado algunos casos de prueba más cuidadosamente antes de publicar ... Lo siento por eso ...Carbón ,
3931 bytesPruébalo en línea! El enlace es a la versión detallada del código. Explicación:
Calcule los ajustes en el número de sílabas y envíe el resultado como una cadena.
Comience cambiando cada dígito que no sea cero a 1 y luego decodifique como base 2. Esto proporciona la respuesta correcta para la mayoría de las entradas.
Agregue 1 para cada uno
7
.Tome la cadena literal
10000000001021111111
y agregue 80 ceros, luego indexe cíclicamente por la entrada y reste ese dígito.fuente
Gelatina ,
282523 bytesPruébalo en línea!
Cómo funciona
fuente
PHP ,
190158145141137 bytesPruébalo en línea!
Un puerto de la solución de Kevin Cruijssen (desafortunadamente no tiene la misma brevedad en PHP :))
-
3245 gracias a Shaggy!-3 gracias a Kevin Crujissen!
fuente
>99
y en>19
lugar de>=100
y>=20
.05AB1E , 24 bytes
Respuesta de jalea del puerto de Dennis
Pruébalo en línea! o como un conjunto de pruebas
Explicación
fuente
05AB1E , 26 bytes
Respuesta de Port of @Neil 's Charcoal , ¡así que asegúrate de votarlo también si te gusta esta respuesta!
Pruébelo en línea o verifique todos los casos de prueba .
El número entero comprimido
•Ž¢Γ}Þ±6u•
puede ser alternativamente•8JA•b2TÌǝ
para el mismo número de bytes.Explicación:
Ver este 05AB1E respuesta mío (sección Cómo comprimir grandes números enteros? ) Para entender por qué
•Ž¢Γ}Þ±6u•
es10000000001021111111
.fuente