Страницы

Поиск по вопросам

суббота, 22 сентября 2018 г.

Примеры программ на Python

Задача про словарь

Суть задачи в том, чтобы из англо-латинского словаря сделать латино-английский.
Примеры тестов
Входные данные

3
apple - malum, pomum, popula
fruit - baca, bacca, popum
punishment - malum, multa
Выходные данные

7
baca - fruit
bacca - fruit
malum - apple, punishment
multa - punishment
pomum - apple
popula - apple
popum - fruit
Входные данные черпаются из input.txt, вывод сбрасывается в output.txt. Входные данные лексикографически отсортированы, и выходные данные тоже требуются отсортированными.
Вначале я покажу своё решение, потом начну объяснять. Итак, моё решение:
f = open('input.txt')
N = f.readline()
d = {}
for line in f:
    words = line.strip().split(' - ')
    en = words[0]
    lat = words[1].split(', ')
    for key in lat:
        if key in d:
            d[key].append(en)
        else:
            d[key] = [en]
f.close()

for key in d:
    d[key].sort()


g = open('output.txt', 'w')
g.write(str(len(d)) + '\n')
for lat in sorted(d):
    g.write(lat + ' - ' + ', '.join(d[lat]) + '\n')

g.close()
А теперь объяснение:
Открываем файл, читаем число N (оно нам не понадобится); создаём пустой словарь.
Отделяем слово от его переводов; из строки с переводами получаем список латинских слов.
Далее смотрим, есть ли латинское слово в нашем словаре. Если есть - дописываем ещё один английский перевод. Если нет - пишем его. После махинаций закрываем файл. Далее нужно все списки переводов отсортировать (требования задачи).
Открываем файл на запись. Первой строкой записываем число получившихся слов. Далее в отсортированном порядке записываем латинские слова, затем их переводы. Закрываем файл.
Задача решена, все тесты пройдены. Несомненно, возможны и другие решения, но это мне показалось наиболее красивым.

Пишем блэкджек

Ну, точнее, не блэкджек, а его мини-вариант под названием очко.
Для реализации нам понадобится колода карт, из которой каждый раз мы будем вынимать по карте и прибавлять к результату.
Далее, сами "карты": шестерка, семерка, восьмерка, девятка, десятка, валет (достоинством 2), дама (3), король (4), и туз (11).
koloda = [6,7,8,9,10,2,3,4,11] * 4
Случайным образом перемешаем карты, используя функцию shuffle из модуля random.
import random
random.shuffle(koloda)
И, собственно, начинаем играть:
print('Поиграем в очко?')
count = 0

while True:
    choice = input('Будете брать карту? y/n\n')
    if choice == 'y':
        current = koloda.pop()
        print('Вам попалась карта достоинством %d' %current)
        count += current
        if count > 21:
            print('Извините, но вы проиграли')
            break
        elif count == 21:
            print('Поздравляю, вы набрали 21!')
            break
        else:
            print('У вас %d очков.' %count)
    elif choice == 'n':
        print('У вас %d очков и вы закончили игру.' %count)
        break

print('До новых встреч!')
Изначально у пользователя 0 очков. Мы его спрашиваем, будет ли он брать карту, на что он должен ответить y или n. Если пользователь ответил n, то мы говорим ему, сколько очков он набрал, и завершаем программу. Если он изъявил желание взять карту (ух, какой нехороший пользователь :)), то мы снимаем ему карту из списка (с помощью метода pop). Мы снимаем последнюю карту, хотя вообще без разницы, какую снимать, ведь они перемешаны.
Прибавляем к числу очков достоинство снятой карты, а дальше смотрим, сколько всего очков у пользователя. Если количество очков больше 21, то извиняйте, пользователь проиграл. Если число очков равно 21, то пользователь выиграл. Если меньше - еще раз спросим пользователя, будет ли он брать карту.
В конце игры прощаемся с пользователем.

Комментариев нет:

Отправить комментарий