Написать программу, которая задает пользователю вопрос (вопрос полагает однозначный ответ, типа да нет). Проверить правильность вопроса. Дать пользователю несколько подсказок и попыток ответить на вопрос. Если он угадал спросить у него имя, и вывести на экран поздравление, которое есть конкатенацией нескольких строк, дважды использовав его имя.
CppStudio.com
Год рождения Николая Васильевича Гоголя — 1809г.? (да — 1, нет — 0): 0 Подумайте внимательно 🙂 Подсказка: число заканчивается на 09 Год рождения Николая Васильевича Гоголя — 1809г.? (да — 1, нет — 0): 1 Вы правильно ответили на вопрос. Введите Ваше имя (латиницей): Denis Denis ,от всей души поздравляем Вас. Все цветы у Ваших ног, Denis. Эта музыка для Вас.
Данное решение предоставила — Лилия Марьенко, поблагодарим её. Исходный код — ниже:
#include #include using namespace std; int main() < setlocale(LC_ALL, «rus»); int answer = 0;// ответ пользователя char *name = new char[30];//сюда считаем Имя пользователя //набор поздравительных строк char str1[] = » ,от всей души поздравляем Вас. «; char str2[] = » Все цветы у Ваших ног, «; char str3[] = «. nЭта музыка для Вас. aaaaaaaaaaaaa»; char congratulation [200] = <>;//строка в которую скопируем весь текст поздравления //задаем вопрос пользователю cout > answer; while (answer != 1)// пока ответ не равен 1(да) < if(answer == 0) //если нажал 0(нет) выдаем подсказку < cout << «nПодумайте внимательно :)» << endl; cout << «Подсказка: число заканчивается на 09» << endl; cout > answer; > else //если пользователь ввел другое число (не 0 и не 1) < cout << «nНекорректный ввод! » << endl; cout > answer; > > if (answer == 1)//если ответ правильный < cout > name; > cout
Ч.14/15 Python для начинающих: создать вопросник/тест (Building a quiz)
Смотрим результат работы программы, он очень даже необычный.
CppStudio.com
Год рождения Николая Васильевича Гоголя — 1809г.? (да — 1, нет — 0): 0 Подумайте внимательно 🙂 Подсказка: число заканчивается на 09 Год рождения Николая Васильевича Гоголя — 1809г.? (да — 1, нет — 0): 1 Вы правильно ответили на вопрос. Введите Ваше имя (латиницей): Denis Denis ,от всей души поздравляем Вас. Все цветы у Ваших ног, Denis. Эта музыка для Вас.
Вот собственно и он!
Кстати говоря, в комментариях также есть достаточно интересное решение данной задачи, если не верите, посмотрите сами.
Источник: cppstudio.com
# Quiz — Викторина
Quiz — викторина или тест, программа с тестовыми вопросами.
Наш вид компьютерной викторины будет состоять из окна приветствия и нескольких вопросов, по очереди выводимых в окне.
Для выполнения цели: нужно уметь разбивать задачу на шаги и выполнять их в дальнейшем.
Будем придумывать, записывать и выполнять шаги по мере решения.
Как написать любой онлайн тест на максимальный балл или 5 на дистанционке
# Step 1 — Шаг 1: приветствие
Создадим окно приветствия.
Для подключения библиотек tkinter используем рекомендованный формат подключения:
from tkinter import * from tkinter.ttk import *
Создадим пустое окно с названием «My quiz».
Создадим рамку — LabelFrame, с названием «Generate screen» для наглядной визуализации. Далее все элементы будут создаваться в этой рамке:
frm = LabelFrame(text=»Generate screen») frm.pack()
Виджеты первого окна приветствия создадим отдельной функцией с параметром, в котором будет передаваться сам фрейм. В Label добавим текст приветствия: «Welcome to my quiz!n Press start to continue…». Последовательность символов n — означает, что следующий текст будет выводиться с новой строки. Добавив метку — Label и кнопку. Для которых укажем родительский элемент, переданный в функцию параметром el:
def first_screen(el): Label(el, text=’Welcome to my quiz!n Press «Start» to continue. ‘).pack() Button(el, text=»Start», command=lambda e=el: ask_question(e)).pack()
Для вызова функции поле создания окна и фрейма в вызовем функцию командой:
first_screen(frm)
Теперь создадим функцию с параметром, которая будет отображать вопросы с вариантами ответов. Вызываться эта функция будет кнопкой в которой задана команда: command=lambda e=el: ask_question(e). Имя функции будет соответственно: ask_question(el):
def ask_question(el): for widget in el.winfo_children(): widget.destroy() Label(el, text=»Здесь могла быть Ваша реклама! n Или вопрос с вариантами ответов.»).pack()
При вызове этой функции происходит следующее:
- функция принимает аргумент, которым является основной виждет LabelFrame;
- функция for перебирает все вложенные элементы в этот фрейм ранее и удаляет их;
- далее создаем новые элемент метку — Label(text=»Здесь могла быть Ваша реклама! n Или вопрос с вариантами ответов.»)
Результат выполнения, после нажатия кнопки:
# Step 3 — Шаг 3: вопрос с ответами
Предположим первый вопрос с вариантами ответов: Вопрос:
Какие виждеты используют для вывода текста с возможностью его редактирования? Which widgets using to display text with the ability to edit it?
Для сохранения результата наших ответов, после строк импорта создадим переменную с пустым массивом (листом), в котором будем сохранять ответы:
from tkinter import * from tkinter.ttk import * answers = []
Внесем изменения в функцию def ask_question(el): Для вопроса будем использовать виджет метку — Label():
def ask_question(el): for widget in el.winfo_children(): widget.destroy() question = Label(el, text=»Which widgets using to display text with the ability to edit it?»).pack()
А для вариантов ответа используем флажки — Checkbutton(), и у каждого флажка должна быть своя переменная. Выберем для неё тип переменной BooleanVar(), и хранить её будем в массиве answer. Чтобы добавить переменную в массив будем использовать метод .append(…) с параметром задающим тип переменной BooleanVar():
answers.append(BooleanVar()) ch_1 = Checkbutton(el, text=»Canvas», variable=answers[0], onvalue=1, offvalue=0).pack(anchor=W)
Остальные варианты ответа добавьте самостоятельно, используя копировать-вставить (copy-paste). Привязка новых элементов обязательно должна быть к передаваемому фрейм элементу el. Результат выполнения:
# Step 4 — Шаг 4: проверка ответов
Создадим функцию проверки ответов check(), после объявленной переменной answer, которая будет перебирать массив (лист) answer:
answers = [] def check(): for i in answers: print(i.get())
1
2
3
4
5
6
7
В конце функции def ask_question(el): создадим кнопку «Next >>», которая вызывает функцию проверки:
button_next = Button(el, text=»Next >>», command=check).pack()
Пример результата вывода в консоль, который только отражает какие флажки были выбраны:
False True False True False
Для сохранения итоговых баллов создадим переменную points и переменную true_answers в которой будет храниться строка, состоящая из 0 и 1 (пример: 000110, где длинна это количество предлагаемых ответов, а 1 обозначают какие ответы правильные):
answer = [] points = 0 true_answers = «10110»
Для проверки выбранных ответов с правильными изменим check() функцию. Для одновременного перебора двух списков параллельно можно воспользоваться функцией zip():
for t, a in zip(true_answers, answers): print(bool(t), a.get())
Переменная t будет перебирать список true_answers, переменная a — answers. После преобразования bool(int(t)) в булевый тип, пример вывода в консоль:
True False False False True True True True False False
Осталось вписать условие сравнения для подсчета результата. За каждый правильный ответ будем увеличивать баллы на 1 в результате неправильного уменьшать на 1, если вариант ответа не выбран, то баллы не изменяются:
def check(el): global points for t, a in zip(true_answers, answers): if bool(int(t)) and bool(int(t)) == a.get(): points += 1 elif bool(int(t)) != a.get(): points -= 1 print(points) points = 0 # для обнуления результата при пересчете
1
2
3
4
5
6
7
8
9
Пример вывода в консоль:
# Step 5 — Шаг 5: вывод баллов в окно
Для вывода результата в окно продолжим изменять функцию check(), она должна принимать параметр, а именно фрейм в который выводится результат:
def check(el):
А также нужно изменить кнопку «Next >>»:
button_next = Button(el, text=»Next >>», command=lambda e=el: check(e)).pack()
При запуске программы все должно работать как и ранее.
Теперь вместо строки print(points) пишем код очищающий фрейм:
for widget in el.winfo_children(): widget.destroy()
А затем добавляем метку — Label() который выводит, например: «Ваш результат: -4 балла», количество баллов соответствует подсчету после ответа.
# Упражнения
- Добавьте на последней форме кнопку «Try again», которая будет предлагать выполнение программы сначала.
- Создайте переменную типа лист, в которой последовательно хранятся вопрос, ответы и правильная вариация ответов:
q1 = [«Which widgets using to display text with the ability to edit it?», «Canvas», «Listbox», «Entry», «Text», «Label», «10110»]
1
2
3
4
5
6
7
- Измените программу так, чтобы данные для генерации вопросов брались из этой переменной. Желательно использовать срезы и перебор циклом.
- Добавьте переменную с вопросом и ответами, с использованием дополнительного символа перед строкой: «?» — означает вопрос, «+» — означает правильный ответ, «-» — означает неправильный ответ, «10110» — последовательность правильных вариантов вычеркиваем.
q2 = [«?What widgets using for positioning other widgets?», «-Button», «-Radiobutton», «+Frame», «-Text», «+LabelFrame»]
Добавьте этот вопрос в форму, с последующим отображением и подсчетом общего результата.
- Добавьте любой вопрос с ответами, с последующим отображением и подсчетом результатов.
Источник: learn4kid-python.firebaseapp.com
Создание простого разговорного чатбота в python
Как вы думаете, сложно ли написать на Python собственного чатбота, способного поддержать беседу? Оказалось, очень легко, если найти хороший набор данных. Причём это можно сделать даже без нейросетей, хотя немного математической магии всё-таки понадобится.
Идти будем маленькими шагами: сначала вспомним, как загружать данные в Python, затем научимся считать слова, постепенно подключим линейную алгебру и теорвер, и под конец сделаем из получившегося болтательного алгоритма бота для Телеграм.
Этот туториал подойдёт тем, кто уже немножко трогал пальцем Python, но не особо знаком с машинным обучением. Я намеренно не пользовался никакими nlp-шными библиотеками, чтобы показать, что нечто работающее можно собрать и на голом sklearn.
Поиск ответа в диалоговом датасете
Год назад меня попросили показать ребятам, которые прежде не занимались анализом данных, какое-нибудь вдохновляющее приложение машинного обучения, которое можно собрать самостоятельно. Я попробовал собрать вместе с ними бота-болталку, и у нас это действительно получилось за один вечер. Процесс и результат нам понравились, и написал об этом в своем блоге. А теперь подумал, что и Хабру будет интересно.
Итак, начинаем. Наша задача — сделать алгоритм, который на любую фразу будет давать уместный ответ. Например, на «как дела?» отвечать «отлично, а у тебя?». Самый простой способ добиться этого — найти готовую базу вопросов и ответов. Например, взять субтитры из большого количества кинофильмов.
Я, впрочем, поступлю ещё более по-читерски, и возьму данные из соревнования Яндекс.Алгоритм 2018 — это те же диалоги из фильмов, для которых работники Толоки разметили хорошие и неплохие продолжения. Яндекс собирал эти данные, чтобы обучать Алису (статьи о её кишках 1, 2, 3). Собственно, Алисой я и был вдохновлен, когда придумывал этого бота. В таблице от Яндекса даны три последних фразы и ответ на них (reply), но мы будем пользоваться только самой последней из них (context_0).
Имея такую базу диалогов, можно просто искать в ней каждую реплику пользователя, и выдавать готовый ответ на ней (если таких реплик много, выбирать случайно). С «как дела ?» такое отлично получилось, о чём свидетельствует приложенный скриншот. Это, если что, jupyter notebook на Python 3. Если вы хотите повторить такое сами, проще всего установить Анаконду — она включает Python и кучу полезных пакетов для него. Или можно ничего не устанавливать, а запустить блокнот в гугловском облаке.
Проблема дословного поиска в том, что у него низкое покрытие. На фразу «как твои дела ?» в базе из 40 тысяч ответов точного совпадения не нашлось, хотя смысл у неё тот же самый. Поэтому в следующем разделе мы будем дополнять наш код, применяя разную математику, чтобы реализовать приближённый поиск. А перед этим вы можете почитать про библиотеку pandas и разобраться, что же делает каждая из 6 строк вышеприведённого кода.
Векторизация текстов
Теперь говорим о том, как превратить тексты в числовые векторы, чтобы осуществлять по ним приближённый поиск.