Blog — by Andrii Dykhlin

Проста програма для жеребкування

Дитинство приносить свої фантазії. В своєму я багато папірців зіпсував, проводячи "жеребкування" для вигаданих команд та збірних. Йшли роки та десь в 2014 руки дійшли до написання скрипта, який зумів автоматизувати цей процес за допомогою персонального комп'ютера. І нехай він не враховує "країну", до якої належить та чи інша команда (я навіть питав про це поштою відділ підтримки мови, але допомогти не змогли), проте базові принципи посіву працюють.

Отже, цей код в базовому вигляді виглядає так:

Код:

#!/usr/local/bin/python3

# coding=utf-8
import random
potA = []
potB = []
potC = []
potD = []
s = 0
l = [potA,potB,potC,potD]
gr_c = input ("What is the amount of groups? ")
try: gr_c = int(gr_c)
except ValueError: print("Not a digit, try again"); exit()
while gr_c < 2: 
    print("Wrong amount of groups");
    gr_c = int(input ("What is the amount of groups? "))
for item in l:
    s += 1
    for i in range (gr_c):
        inp = input ("Input %i team for the %i pot: " % (i+1,s))
        while inp=="": print("Blank input! Try again, please?"); inp = input ("Input %i team for the %i pot: " % (i+1,s))
        if inp != '': item.append(inp)
    random.shuffle (potA); random.shuffle (potB); random.shuffle (potC); random.shuffle (potD)
while potD:
    for counter in range (gr_c):
        pop_a = potA.pop(); random.shuffle (potA)
        pop_b = potB.pop(); random.shuffle (potB)
        pop_c = potC.pop(); random.shuffle (potC)
        pop_d = potD.pop(); random.shuffle (potD)
        print("Group", str(counter+1) + ":", str(pop_a), str(pop_b), str(pop_c), str(pop_d))
    print("")
input("Press <Enter> to exit the app\n")

Розберемо його за рядками.

Код:

#!/usr/local/bin/python3

# coding=utf-8
import random

Першими двома рядками, взагалі, можна знехтувати. Перший пише про те, що виконувати скрипт буде python3, якщо зробити файл виконуваним. Другий вказує на кодування, і ця фішка більш притаманна для Python 2, підтримка якого незабаром припиниться. Наступним рядком ми імпортуємо модуль random (хоча можемо імпортувати тільки необхідні нам методи цього модулю у вигляді коду:

Код:

import random # імпорт всього модулю. Виклик функції буде у вигляді random.randint()

from random import randint # імпорт окремої функції randint. Виклик буде просто randint()
from random import * # імпорт всіх функцій модулю. Відрізняється від простого import тим, що не потрібно писати ім'я модулю для виклику. Це не завжди добре, бо можуть бути конфлікти з вбудованими функціями мови
from random import randint as r # імпорт окремої функції randint. Виклик в такому разі буде таким: r()

Звичайно, що random - це просто приклад, для всіх модулів процедура імпортування однакова.

Код:

potA = []

potB = []
potC = []
potD = []
s = 0
l = [potA,potB,potC,potD]

Цей шматок коду задає змінні нашої програми. Для чого вони потрібні - трошки нижче.

Код:

gr_c = input ("What is the amount of groups? ")

try: gr_c = int(gr_c)
except ValueError: print("Not a digit, try again"); exit()
while gr_c < 2: 
    print("Wrong amount of groups");
    gr_c = int(input ("What is the amount of groups? "))

Тут ми задаємо кількість груп для жеребкування. Це створить необхідні та достатні умови для жеребкування. Якщо введено неправильну кількість груп (менше двох, або ж введене число не є цілим (або взагалі не є числом) - програма просить повторити процедуру.

Код:

for item in l:

    s += 1
    for i in range (gr_c):
        inp = input ("Input %i team for the %i pot: " % (i+1,s))
        while inp=="": print("Blank input! Try again, please?"); inp = input ("Input %i team for the %i pot: " % (i+1,s))
        if inp != '': item.append(inp)
    random.shuffle (potA); random.shuffle (potB); random.shuffle (potC); random.shuffle (potD)

Цей шматок відповідає за додавання команд у кошики. Всього кошиків 4, адже скрипт розрахований на групи з 4 учасниками. Якщо введено "порожню" команду - повторити. В даному випадку пробіл не буде порожнім рядком. В кожен кошик буде додано ту кількість команд, скільки груп користувач ввів раніше.

Останній рядок ліпше записати не одним (згідно PEP8 - порадам по оформленню коду), проте так він виглядає трошки краще. Цей рядок перемішує команди, які користувач вводив до цього в кожному з кошиків.

Код:

while potD:

    for counter in range (gr_c):
        pop_a = potA.pop(); random.shuffle (potA)
        pop_b = potB.pop(); random.shuffle (potB)
        pop_c = potC.pop(); random.shuffle (potC)
        pop_d = potD.pop(); random.shuffle (potD)
        print("Group", str(counter+1) + ":", str(pop_a), str(pop_b), str(pop_c), str(pop_d))
    print("")
input("Press <Enter> to exit the app\n")

Цей шматок коду відповідає безпосередньо за "витягування кульок". Ми витягуємо кулі спочатку з першого кошику (potA.pop()), знову перемішуємо елементи між собою та витягуємо наступну команду. pop() викидає останній елемент списку та виводить його на екран.

Коли ми закінчили з першим кошиком - ми переходимо до наступного і так до того моменту, поки команд вже не лишиться в останньому кошику.

Раніше програма записувала у файл та виводила на екран одне й те саме, проте від цього функціоналу я вирішив відмовитись, адже з часом на диску буде забагато файлів, якщо їх не чистити.

Також за рік чи два після основного коду було написано 2 невеликих скрипти, які роблять майже те саме, проте тільки для стадії плей-офф.

Так, наприклад, може виглядати код для сіяного жеребкування:

Код:

#!/usr/local/bin/python3

import random
potA = []; potB = []
s = 0
l = [potA,potB]
gr_c = input ("Яка кількість пар? ")
try: gr_c = int(gr_c)
except ValueError: print("Ви ввели не число, і що нам з вами робити, га?"); exit()
while gr_c < 2:
    print("Невірна кількість пар");
    gr_c = int(input ("Яка кількість пар? "))
for item in l:
    s += 1
    for i in range (1, gr_c+1):
        inp = input ("Введіть команду %i для кошика %i: " % (i,s)) 
        while inp=="": print("Ви нічого не написали, назва має ж бути, га?"); inp = input ("Введіть команду %i для кошика %i: " % (i,s))
        if inp != '': item.append(inp)
    random.shuffle (potA); random.shuffle (potB)
while potB:
    for counter in range (1,gr_c+1):
        pop_a = potA.pop(); random.shuffle (potA)
        pop_b = potB.pop(); random.shuffle (potB)
        print(str(counter) + " пара: " + str(pop_a) + " - " + str(pop_b))
print("")
input("А тепер натисніть <Enter> щоб покинути це страшне місце\n")

А так - для несіяного:

Код:

#!/usr/local/bin/python3

import random
l = []
try: gr_c = int(input("Яка кількість учасників? "))
except ValueError: print("Ви ввели не число, і що нам з вами робити, га?"); exit()
while gr_c < 2 or gr_c % 2 != 0: 
    print("Невірна кількість учасників");
    gr_c = int(input("Яка кількість учасників? "))
for i in range (1, gr_c+1):
    inp = input ("Введіть учасника %i: " % (i))
    while inp=="": print("Ви нічого не написали, назва має ж бути, га?"); inp = input("Введіть учасника %i: " % (i))
    if inp != '': l.append(inp)
    random.shuffle (l)
print()
while l:
    pop1 = l.pop(); pop2 = l.pop()
    random.shuffle (l)
    print(str(pop1) + " - " + str(pop2))
print()
input("А тепер натисніть <Enter> щоб покинути це страшне місце\n")



  1. Коментарі (2):

  2. avatar
    Lordie · Сайт · 02.06.17
  3. avatar
    Andrii Dykhlin · Сайт · 02.06.17
    Lordie написав(ла):
    Крутяцько! Читати далі...
    Читати далі...

Прокоментуйте!