#python
Закрыт. Этот вопрос не по теме. Ответы на него в данный момент не принимаются. Хотите улучшить этот вопрос? Переформулируйте вопрос, чтобы он соответствовал тематике «Stack Overflow на русском». Закрыт 12 месяцев назад. задача №3517 ,про коров в исполнители питон, помогите решить. Вот условие : Для данного числа n<100 закончите фразу “На лугу пасется...” одним из возможных продолжений: “n коров”, “n корова”, “n коровы”, правильно склоняя слово “корова”. Программа должна вывести введенное число n и одно из слов: korov, korova или korovy. Между числом и словом должен стоять ровно один пробел.
Ответы
Ответ 1
Python 3 1-й вариант: n = int(input()) if n >= 11 and n <= 14: print(n, 'korov') else: temp = n % 10 if temp == 0 or (temp >= 5 and temp <= 9): print(n, 'korov') if temp == 1: print(n, 'korova') if temp >=2 and temp <=4: print(n, 'korovy') 2-й вариант: n = int(input()) if n in range(11, 15): print(n, 'korov') else: temp = n % 10 if temp in list(range(5,10))+[0]: print(n, 'korov') if temp == 1: print(n, 'korova') if temp in range(2,5): print(n, 'korovy')Ответ 2
Вариант решения используя только условную конструкцию if и арифметические\логические операции. n = int(input()) if n % 10 == 1 and n != 11: print(n, 'korova') elif 2 <= n % 10 <= 4 and n // 10 != 1: print(n, 'korovy') else: print(n, 'korov')Ответ 3
Можно использовать gettext модуль, чтобы выбрать правильную форму множественного числа для текущего языка: #!/usr/bin/env python3 from gettext import translation t = translation('messages', 'locale', fallback=True) for n in [0, 1, 2, 5, 10, 11, 21, 22, 111]: print(t.ngettext("there is %d cow", "there are %d cows", n) % n) Если запустить без перевода, то вывод: $ python cows.py there are 0 cows there is 1 cow there are 2 cows there are 5 cows there are 10 cows there are 11 cows there are 21 cows there are 22 cows there are 111 cows Чтобы получить нужный вывод, необходимо добавить перевод, к примеру, с помощью babel модуля (pip install babel): $ pybabel extract -o messages.pot . extracting messages from cows.py writing PO template file to messages.pot $ pybabel init -i messages.pot -d locale -l ru creating catalog locale/ru/LC_MESSAGES/messages.po based on messages.pot После добавления перевода в message.po: msgstr[0] "На лугу пасётся %d корова" msgstr[1] "На лугу пасётся %d коровы" msgstr[2] "На лугу пасётся %d коров" Чтобы сделать перевод доступным, необходимо собрать messages.mo: $ pybabel compile -d locale compiling catalog locale/ru/LC_MESSAGES/messages.po to locale/ru/LC_MESSAGES/messages.mo Можно запустить с русским языком: $ LANGUAGE=ru python cows.py На лугу пасётся 0 коров На лугу пасётся 1 корова На лугу пасётся 2 коровы На лугу пасётся 5 коров На лугу пасётся 10 коров На лугу пасётся 11 коров На лугу пасётся 21 корова На лугу пасётся 22 коровы На лугу пасётся 111 коров Это работает, потому что в ru/LC_MESSAGES/messages.po автоматически добавлено: "Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2)\n" При изменении текста, который нужно перевести в cows.py, следует обновить каталоги: $ pybabel update -i messages.pot -d locale updating catalog locale/ru/LC_MESSAGES/messages.po based on messages.pot И заново переводы собрать: $ pybabel compile -d locale compiling catalog locale/ru/LC_MESSAGES/messages.po to locale/ru/LC_MESSAGES/messages.mo Чтобы добавить новый язык, к примеру французский: $ pybabel init -i messages.pot -d locale -l fr creating catalog locale/fr/LC_MESSAGES/messages.po based on messages.pot Добавить сам перевод для единственного и множественного числа: msgstr[0] "Sur la prairie de pâture %d vache" msgstr[1] "Sur la prairie de pâture %d vaches" (для примера, фразы из Яндекс.Переводчика взяты) Обновить .mo файлы: $ pybabel compile -d locale compiling catalog locale/fr/LC_MESSAGES/messages.po to locale/fr/LC_MESSAGES/messages.mo compiling catalog locale/ru/LC_MESSAGES/messages.po to locale/ru/LC_MESSAGES/messages.mo После этого можно запусить на французском: $ LANGUAGE=fr python cows.py Sur la prairie de pâture 0 vache Sur la prairie de pâture 1 vache Sur la prairie de pâture 2 vaches Sur la prairie de pâture 5 vaches Sur la prairie de pâture 10 vaches Sur la prairie de pâture 11 vaches Sur la prairie de pâture 21 vaches Sur la prairie de pâture 22 vaches Sur la prairie de pâture 111 vachesОтвет 4
n = int(input()) base = 'korov' suffix = '' if (n % 10 == 1) and n != 11: suffix = u'a' elif n % 10 in ([2, 3, 4]) and n not in range(10, 21): suffix = u'y' print(str(n), "{}{}".format(base, suffix))Ответ 5
Для любителей "однострочников", вариант без ветвлений if: print 'korov' + {n % 10 == 1 and n != 11: 'a', n % 10 in [2, 3, 4] and n not in range(10, 15): 'y'}.setdefault(1, '') #44 #korovy
Комментариев нет:
Отправить комментарий