Skip to content

Instantly share code, notes, and snippets.

@KirillTemnov
Created June 18, 2012 04:55
Show Gist options
  • Select an option

  • Save KirillTemnov/2946911 to your computer and use it in GitHub Desktop.

Select an option

Save KirillTemnov/2946911 to your computer and use it in GitHub Desktop.
Generate examination tickets from questions in .org file
#!/usr/bin/env python
# -*- coding: utf-8 -*-
"""
Скрипт для генерации вопросов из файла .org
"""
USAGE = """
usage:
%s file.org
""" % __file__
import sys
import random
class TicketsGenerator:
def __init__(self, filename):
self.settings = {}
self.read_file_questions(filename)
def __parse_int(self, val, default):
try:
return int(val)
except :
return default
def __read_option(self, option_str):
if option_str.startswith('TRESHOLD:'):
self.settings['treshold'] = self.__parse_int(option_str[9:], 3)
elif option_str.startswith('QUESTIONS_PER_TICKET:'):
self.settings['q_per_ticket'] = self.__parse_int(option_str[21:], 3)
elif option_str.startswith('TICKETS_TOTAL:'):
self.settings['tickets_total'] = self.__parse_int(option_str[14:], 25)
# add format here
def read_file_questions(self, filename):
"""
Считать вопросы из файла
"""
f = open(filename)
self.questions = []
for l in f.readlines():
l = l.strip()
if l.startswith('* '):
self.questions.append(l[1:].strip())
elif l.startswith('#+Q_'):
self.__read_option(l[4:])
return self.questions
def is_good_distanse(self, q1, q2):
"""
Проверить расстояние между вопросами.
questions - список вопросов,
q1, q2 - вопросы,
treshold - минимальное расстояние.
"""
if q1 == q2:
return False
i1 = self.questions.index(q1)
i2 = self.questions.index(q2)
return not abs(i1-i2) < self.treshold
def is_good_question(self, ticket, q):
"""
Можно ли добавлять этот вопрос в билет.
ticket - билет
q - вопрос для потенциального добавления в билет
questions - список вопросов
"""
for tq in ticket:
if not self.is_good_distanse(tq, q):
return False
return True
def create_tickets(self):
"""
Создать билеты.
questions - список вопросов,
q_per_ticket - количество вопросов в билете
tickets_total - количество билетов
"""
tickets = []
while len(tickets) < self.tickets_total:
ticket = [random.choice(self.questions)]
for i in range(self.q_per_ticket-1):
q = random.choice(self.questions)
while q in ticket and not self.is_good_question(ticket, q):
q = random.choice(self.questions)
ticket.append(q)
if not ticket in tickets:
tickets.append(ticket)
return tickets
@property
def treshold(self):
return self.settings.get('treshold', 3)
@property
def q_per_ticket(self):
return self.settings.get('q_per_ticket', 3)
@property
def tickets_total(self):
return self.settings.get('tickets_total', 25)
@property
def format(self):
return 'text' # only text format supported
if __name__ == '__main__':
if len(sys.argv) == 1:
print USAGE
exit()
tg = TicketsGenerator(sys.argv[1])
tickets = tg.create_tickets()
i = 1
for t in tickets:
print 'Билет %s \n%s' % (i, '-'*80)
i += 1
for q in t:
print q + '\n'
print '-'*80 + '\n\n'
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment