Je serais ravi de prendre un certain nombre et de savoir combien de syllabes il y a, lorsqu'il est parlé en anglais.
Limitons cela à des entiers positifs inférieurs à mille.
Je suis britannique, nous allons donc suivre la colonne des centaines avec un «et» quand il y aura des chiffres non nuls après.
Le défi
- Écrivez un code qui acceptera un entier positif inférieur à 1000 et affichera le nombre de syllabes dans les mots qui représentent ce nombre en anglais britannique.
- Il N'A PAS besoin de générer les mots pour représenter les nombres, seulement le nombre de syllabes qu'ils contiennent.
- C'est du golf de code, essayez d'y parvenir dans le moins d'octets.
- Utilisez n'importe quelle langue que vous aimez.
- Les failles standard sont interdites.
Cas de test
| 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
la source
la source
Réponses:
Python 2 ,
84837467 octetsMerci à @xnor d'avoir joué à
916 octets!Essayez-le en ligne!
Python 2 , 79 octets
Simple, mais plus long.
Essayez-le en ligne!
la source
-10
à~9
et en basculant autour du dernier bit en+(0<n%100!=12)-(n%100!=11)
, mais c'est toujours plus long que votre nouvelle solution.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
pourrait en fait aider avec une approche que j'essayais également pour ma réponse Jelly.Perl 5
-p
, 53 octetsEssayez-le en ligne!
Comment
la source
JavaScript (ES6), 89 octets
Essayez-le en ligne!
la source
Python 2 ,
112108 octetsEssayez-le en ligne!
-4 octets, merci à Shaggy
la source
[2]*7
partie échouera17
, car cela devrait être 3 au lieu de 2 (sev-en-teen
).JavaScript,
8684 octetsUn port modifié de la solution Python de TFeld .
Essayez-le en ligne
2 octets économisés grâce à Arnauld
la source
Langue Wolfram
101115 octetsExplication
(remplacement
StringSplit
des
)IntegerName
rend le nombre en anglais américain (c'est-à-dire sans "et" inclus dans les nombres supérieurs à 100)777-> "seven hundred seventy-seven
.StringSplit[IntegerName@#,"-"]
supprime tous les tirets du rendu.StringSplit/@
divise le rendu en mots.Join@@
laisse une simple liste de mots, sans liste intégrée (dans le cas où un trait d'union est apparu).WordData[#,"Hyphenation"]
décompose un seul mot en ses syllabes.Join@@
laisse une simple liste de syllabes dans tous les mots.Length
compte les syllabes+Boole[#>100&&#~Mod~100!=0]
ajoute1
au nombre de syllabes pour les nombres supérieurs à 100 (en raison des «et» supplémentaires utilisés dans le rendu anglais britannique), à l'exclusion des multiples entiers de 100.la source
Java 11,
105102 octetsContient des charges de caractères non imprimables.
-3 octets merci @ OlivierGrégoire .
Essayez-le en ligne.
Explication:
la source
.split("7",-1)
à.split("7",9)
et-6+(n>99?4:0)
à-(n>99?2:6)
.-(n>99?2:6)
, mais c'est tellement évident maintenant que vous l'avez souligné. Et-1
à9
cause de la taille d'entrée limitée à laquelle je n'aurais pas pensé, alors merci!05AB1E ,
3431 octetsEssayez-le en ligne ou vérifiez tous
[1,999]
les cas de test .Explication:
Avec tous les contrôles mentionnés, il en résultera 1 pour truey et 0 pour falsey.
la source
I
(entrée) au lieu deX
(entrée mod 100) lors de la vérification si elle est supérieure à 20 pour le +1 dety
.>
(vérifier si l'entrée est supérieure à 100) a été remplacé par@
(vérifier si l'entrée est supérieure ou égale à 100). Peut-être que j'aurais dû vérifier moi-même plus de cas de test avant de poster .. Désolé à ce sujet ..Fusain ,
3931 octetsEssayez-le en ligne! Le lien est vers la version détaillée du code. Explication:
Calculez les ajustements du nombre de syllabes et sortez le résultat sous forme de chaîne.
Commencez par changer chaque chiffre non nul en 1 puis décodez-le en base 2. Cela donne la bonne réponse pour la plupart des entrées.
Ajoutez 1 pour chacun
7
.Prenez la chaîne littérale
10000000001021111111
et ajoutez 80 zéros, puis indexez cycliquement par l'entrée et soustrayez ce chiffre.la source
Gelée ,
282523 octetsEssayez-le en ligne!
Comment ça fonctionne
la source
PHP ,
190158145141137 octetsEssayez-le en ligne!
Un portage de la solution de Kevin Cruijssen (malheureusement il n'a pas la même brièveté en PHP :))
-
3245 merci à Shaggy!-3 merci à Kevin Crujissen!
la source
>99
et à la>19
place de>=100
et>=20
.05AB1E , 24 octets
Réponse de gelée du port de Dennis
Essayez-le en ligne! ou comme suite de tests
Explication
la source
05AB1E , 26 octets
Réponse de Port of @Neil Charcoal , alors assurez-vous de lui aussi voter positivement si vous aimez cette réponse!
Essayez-le en ligne ou vérifiez tous les cas de test .
Un entier compressé
•Ž¢Γ}Þ±6u•
peut également être•8JA•b2TÌǝ
pour le même nombre d'octets.Explication:
Voir cette réponse 05AB1E de mes (section Comment compresser les grands entiers? ) Pour comprendre pourquoi
•Ž¢Γ}Þ±6u•
est10000000001021111111
.la source