LINUX.ORG.RU

Автоматически создавать билеты

 


0

5

Есть база вопросов (задач), из них нужно сформировать билет со списоком вопросов.
Мне вручную надоело создавать эти билеты и решил сделать генератов билетов.

Так как вопросы преполагают наличие формул и рисунков, то решил использовать для этого latex (билеты нужны и в печатном виде).

Мне нужно взять случайным образом вопрос из базы и записать это в билет.

Есть два вопроса: на каком языке лучше сделать генератор билетов и в каком виде это проще сделать?
Прошу поделится с подобным опытом.

★★★★★

На том языке который знаешь. Я бы сделал на python. Можешь присобачить к нему какой-нибудь шаблонизатор, чтоб строки руками не собирать.

Я вот делал генератор резюме таким же макаром. Использовал Django (там вэбморда была, так что оправдано).

gnunixon ★★★
()

Здесь Поможет тебе pdflatex + знание SQL.

Если интересно, могу скинуть open-source книжку по этому поводу.

bookman900 ★★★★★
()
Ответ на: комментарий от bookman900

Знание SQL врядли поможет, как ты предлагаешь туда и формулы и рисунки и вопросы закинуть?

Zodd ★★★★★
() автор топика
Ответ на: комментарий от Zhbert

Язык - который знаешь. Я бы питон взял.

Только низкоуровневые языки знаю Fortran, С, С++. Или лучше с питоном заморочится?

Zodd ★★★★★
() автор топика
Ответ на: комментарий от Zodd

Ну, на нем быстрее будет. А на сях ты это упаришься писать.

Zhbert ★★★★★
()
Ответ на: комментарий от Zodd

Знание SQL врядли поможет, как ты предлагаешь туда и формулы и рисунки и вопросы закинуть?

Делаешь каждый вопрос в Latex. Дальше формируешь базу (м.б. просто набором файлов с общими названиями и нумерацией) этих вопросов с группировкой по темам (иначе у тебя не билеты получатся, а бред, где сложность и разделы спутаны). После этого генерируешь пары\тройки\четвёрки чисел описывающие вопросы в билете и по этим парам формируешь файлик body.tex с примерно следующим содержанием на каждый билет:

%some begin ticket stuff

\begin{enumerate}
\item \input{path_to_question_1_10.tex}
\item \input{path_to_question_2_2.tex}
\end{enumerate}

%some end ticket stuff

SQL для этого особо и не нужен. Если знаешь C++, то бери C++ и не заморачивайся.

Norgat ★★★★★
()
Последнее исправление: Norgat (всего исправлений: 1)
Ответ на: комментарий от Norgat

Спасибо, примерно так и планировал. Думал может bash для этого взять)

Zodd ★★★★★
() автор топика

Думаю, это можно и средствами самого LaTeX реализовать. Сначала положить каждый вопрос в отдельный .tex файл. А потом как здесь.

Davidov ★★★★
()
Ответ на: комментарий от Zodd

IMHO, выучить Python на уровне туториала и написать на нём будет быстрее, чем писать на C++. Но это от человека зависит.

anonymous_coward
()
Ответ на: комментарий от Davidov

Ему простого \rand не хватит. После того, как он получил рандомное число ему нужна будет проверка того, что полученный номер вопроса не использовался ранее и если использовался, то пофиксить его (способ пофиксить в лоб - смещать \rand прибавлением единицы по модулю числа вопросов).

Думаю такое можно и на LaTeX накостылять, но стоит ли оно затрачиваемого времени? Не уверен.

Norgat ★★★★★
()
Ответ на: комментарий от Norgat

Часто разные номера вопросов из разных списков. Тогда проблемы нет.

Но даже если из одного, то существуют уже готовые решения. Но вообще задачка тривиальная, хоть на баше, хоть на питоне, хоть на техе, хоть на плюсах.

Davidov ★★★★
()

Вообще для теха что-то похожее уже есть: probsoln. И на esami можно тоже глянуть.

Сам не пользовался.

Davidov ★★★★
()
Ответ на: комментарий от Davidov

Спасибо, там логика возможно сложнее будет, поэтому лучше сразу возьму язык программирования.

Zodd ★★★★★
() автор топика

Генеришь файлы вопросов в формате латекса.

Или по папками их раскидываешь, или, как тут, в формате тема-номер-вопрос-номер.txt

echo 'Ролль' > theme-1-q-1.txt
echo 'Лагранж' > theme-1-q-2.txt
echo 'Коши' > theme-1-q-3.txt
echo 'Маятник' > theme-2-q-1.txt
echo 'Давление газа' > theme-2-q-2.txt
echo 'Емкость конденсатора' > theme-2-q-3.txt
echo 'x*x+2*x=10' > theme-3-q-1.txt
echo 'sin(x)=1' > theme-3-q-2.txt
echo 'exp(x)-exp(-x)=1' > theme-3-q-3.txt

Креативишь питона

#!/usr/bin/python
# -*- coding: utf-8 -*-
import random


ticket = ''

# 3 -число тем
for theme_num in range(3):
    q_num = random.choice([1, 2, 3]) # число от одного до трех

    # Имя файла текущего вопрос
    fname = 'theme-%d-q-%d.txt' % (theme_num + 1, q_num) # +1, т.к. цикл с нуля

    # Добавляем шапку вопроса
    ticket += 'Вопрос ' + str(theme_num + 1) + '\n'
    # И читаем соответствующий файл
    ticket += open(fname, 'r+').read()
    ticket += '\n'


# Печатаем билет
print(ticket)
# И заодно пишем его в файл
open('ticket.txt', 'w').write(ticket)

Если все лежит в одной папке, то python ticket.py даст такой профит:

Вопрос 1
Ролль

Вопрос 2
Давление газа

Вопрос 3
sin(x)=1

anonymous
()

Применять что-то вроде Python или даже Bash. Я использовал для аналогичных задач Bash. Например я делал скрипт для генерации раздатки из лекций и скрипт для генерации отчёта с графиками из измерений.

DarthVadimius ★★★★
()
Ответ на: комментарий от Zodd

Накатил на питоне прогу, теперь нужно заполнять базу в формате tex (:

Zodd ★★★★★
() автор топика

Если что, в питоне есть random.shuffle(), а в консольке есть shuf.

anonymous
()

Есть готовая библиотека для LaTeX. Питон не нужен :)

psv1967 ★★★★★
()
Ответ на: комментарий от ados

Лэмпорту такую шляпу предложи.

"...but language is not always logical, so lay-tecks is also possible."

anonymous
()
25 сентября 2016 г.
Ответ на: комментарий от gnunixon

Можешь плз поподробнее написать о генераторе резюме? Мне просто надо написать генератор билетов, которые будут отправляться на почту, при регистрации на сайте, так вот вопрос, как это лучше реализовать?

jason9229
()
Ответ на: комментарий от jason9229

Для начала делаешь верстку билета в LaTeX (думаю это уже у тебя готово). Потом выбираешь шаблонизатор для твоего любимого языка программирования (буду предполагать что это Python, так как сам работаю с ним) и делаешь из латеховой верстки шаблон на этом языке.

Далее тебе нужно передать данные в этот шаблон, получить .tex-файл и скомпилировать его. Тут у тебя возникнут несколько проблем. Начнем по порядку:

1. Учти что, допустим, знак процента (%) в LaTeX обозначает начало комментария; обратный слэш - спец. символ, ну и так далее. Короче, перед тем как скормить данные шаблонизатору - обработай.

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

3. Процесс компиляции относительно долог (в зависимости от сложности верстки, это может занимать даже десяток-другой секунд), так что создание билета и его отсылку я бы сделал асинхронной. Попутно, если ожидается что пользователей будет много, я бы выделил для этого дела вообще отдельную тачку.

Итак, теперь по последнему пункту. У меня устроено следующим образом - приложение на django получает команду что надо сгенерить резюме. Оно выдергивает данные из базы, быстренько фигачит из этих данных и шаблона содержимое .tex-файла и передает его, вместе с служебными данными (в твоем случае это должен быть как минимум адрес по которому потом вышлют этот билет), менеджеру заданий. Я выбрал в качестве менеджера заданий RQ (Redis Queue). К этому менеджеру заданий подключены воркеры. Они могут быть как на этой же машине, чего не советую, так и на других машинах. Там уже один из свободных воркеров принимает задание, сохраняет содержимое .tex-файла на диск, запускает через subprocess компилятор LaTeX, и после того как он отработал, делает уже все что нужно с результатом.

Далее все уже зависит от того что ты должен делать после этого. В моем случае надо было показывать прогресс операции, выводить результат на экран, генерить превьюшку и т.д. Для этого я через websocket сообщал клиенту о том что происходит и передавал результат, но думаю что тебе это не нужно.

gnunixon ★★★
()
Последнее исправление: gnunixon (всего исправлений: 1)
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.