Всем привет! Время неумолимо движется вперёд и остаётся все меньше времени до окончания регистрации участников в конкурсе, посвящённого дню рождения канала, поэтому пришло время задуматься о том, каким образом мы будем выбирать победителя. Сам алгоритм будет реализован на языке Python. Почему он? Потому, что данный язык отлично подходит для реализации небольших алгоритмов и не перегружен лишним синтаксисом.
Итак, вопрос о том, каким образом мы реализуем алгоритм выбора победителя, решён, поэтому можем перейти к самому алгоритму.
Алгоритм
Суть проста. Список всех участников, кто прошёл регистрацию, будет иметь вид .XLSX файла, где каждый участник занимает определённую строку. С помощью языка Python, мы откроем и прочитаем данный файл, определим общее количество участников, а затем алгоритм на основании библиотеки Random будет убирать по одному участнику, пока их количество не уменьшится до одного. Этот везунчик и станет нашим победителем. Вопросы?
Шаг 1. Работа с XLSX файлом.
Одна из самых замечательных черт языка Python, заключается в том, что для него написано огромное количество библиотек на все случаи жизни. Работа с .XLSX файлами не является исключением. Чтобы открыть и прочитать данный файл, мы воспользуемся библиотекой XLRD. Данная библиотека позволяет без каких-либо усилий прочесть любой EXCEL файл.
Давайте сначала установим её, выполнив следующую операцию в терминале:
sudo pip install xlrd
Теперь пришло время создать файл в формате .py, который и будет содержать в себе алгоритм для выбора победителя. Начнём его заполнять кодом, отвечающим за чтение EXCEL файла, а точнее первой вкладки, и работу со списком участников:
import xlrd
rb = xlrd.open_workbook('/home/nowadays/Desktop/GAME.xlsx')
sheet = rb.sheet_by_index(0)
first_col = sheet.col_values(0)
Шаг 2. Случайности не случайны.
Теперь пришел черёд заняться частью, где мы случайным образом будем выбирать участника из списка и удалять его, пока длинна списка не станет равной единице.
import random
while (len(first_col) != 1):
gamer = random.choice(first_col)
first_col.remove(gamer)
Шаг 3. Показать победителя и не получить UnicodeEncodeError: ‘ascii’ codec can’t encode characters in position 0-6: ordinal not in range(128)
Так как имена участников могут содержать не только латинские символы, то нужно дополнительно подготовиться. Для этого нужно добавить всего лишь данную команду encode(‘utf8’), которая вернёт кодированную версию строки.
print "The winner is %s" % first_col[0].encode('utf8')
Шаг 4. Итоговая версия программы.
Теперь предлагаю, совместить все части алгоритма в одном файле:
# -*- coding: cp1251 -*-
import xlrd
import random
import time
if __name__ == '__main__':
rb = xlrd.open_workbook('/home/nowadays/Desktop/GAME.xlsx', encoding_override="cp1251")
sheet = rb.sheet_by_index(0)
first_col = sheet.col_values(0)
print "Total players involved : %s" % len(first_col)
while (len(first_col) != 1):
time.sleep(5)
gamer = random.choice(first_col)
first_col.remove(gamer)
print "The winner is %s" % first_col[0].encode('utf8')
Кроме того, сам алгоритм будет опубликован в Github:
https://github.com/n0w4d4ys/nowadays-game.git
Итог.
За небольшие 15 минут, мы смогли подготовить простой и легко читаемый код, который завтра определит победителя в нашем конкурсе. И да, регистрация ещё открыта.
Чтобы принять участие:
- Вы должны быть обязательно подписаны на наш канал в в Яндекс Дзен и/или вступить в нашу группу в Facebook.
- Заполнить форму участника. Данные вопросы позволят нам связаться с вами в случае вашего выигрыша.
Всем спасибо и отличного дня!