Представьте себе ролик для игры в кости, на котором вы хотите напечатать результат с хорошей грамматикой.
'You rolled a 18'
- пример плохой грамматики. 'You rolled an 18'
- пример хорошей грамматики. 'You rolled an 5'
было бы плохой грамматикой. Я мог бы определить функцию, которая делает кучу операторов if
но это не кажется Pythonic.
#ideally something like this
print(f'You rolled {a-or-an} {someint}')
Всего 3 ответа
def getDiceRollString(someint):
a_or_an = "an" if someint in (11, 18) or str(someint)[0] == Ǝ' else "a"
return "You rolled %s %d" % (a_or_an, someint)
Вы можете попробовать это:
for i in [1, 5, 8, 11, 15, 18, 28, 81, 88, 800]:
print(getDiceRollString(i))
#You rolled a 1
#You rolled a 5
#You rolled an 8
#You rolled an 11
#You rolled a 15
#You rolled an 18
#You rolled a 28
#You rolled an 81
#You rolled an 88
#You rolled an 800
Вот моя неоптимизированная идея. Отключение других ответов и переход на английский, затем изменение статьи (a / an) на основе первой буквы, если это гласная. За исключением « o
в one
потому что слово « one
самом деле звучит как « won
где в качестве первого звука звучит согласная w
.
Во всяком случае, вот моя идея.
from random import randint
import inflect # python -m pip install inflect
p = inflect.engine()
numlist = [1,7,8,10,11,12,11000000]
#for i in range(0, 10):
for i in numlist:
article = 'a'
num = i #randint(0, 10000000000)
numword = p.number_to_words(num)
if numword[:1] in 'aeiu':
article = 'an'
print("You rolled ", article, " ", num, " (", numword, ")", sep='')
Если вы используете num2word
(устанавливается с помощью pip install num2word
)
import num2word
a-or-an ='an' if numtoword.to_card(someint)[0] == 'e' else 'a'
К сожалению, потому что он основан на звуках, а звуки основаны на словах, я не думаю, что есть способ сделать это, исследуя целые числа, поэтому решение не очень питонное.
Также не стесняйтесь опровергнуть это (как я не знаю)
Предыдущий был опровергнут в комментариях ниже 11
, теперь это должно быть исправлено.