Created
June 18, 2012 04:55
-
-
Save KirillTemnov/2946911 to your computer and use it in GitHub Desktop.
Generate examination tickets from questions in .org file
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| #!/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