pavki/hr_qa_sbs_best_bad huggingface dataset:
Вопрос: Какой клиент выбрать для работы с 100 почтовыми ящиками?

Лучший ответ: Я бы просто настроил перенаправление на один ящик и сделал фильтры, что бы потом разобратсья что с какого ящика пришло.

Худший ответ: Почтовых клиентов вообще-то не так уж и много. TB, Outlook, TheМышь и почтовый клиент Зимбры - из тех, что я знаю, не считая тех, что не работают на винде.
Проблема у Вас не в клиенте. Любой клиент будет впадать в ступор, когда начинает одновременно ломиться по сотне учеток. Заведите еще одну-две-десять учеток и перенаправьте туда почту так, чтобы она группировалась на них, а с них уже забирайте.
Вопрос: Как решить «Установка не удалась: Не удалось создать директорию» при попытке установить плагин wordpress?

Лучший ответ: там проще всё - в конфигурационный файл( wp-config  ) запишите вот это define(‘FS_METHOD’, ‘direct’);

Худший ответ: php работает от другого пользователя
права 755
5 - это это в двоичной кодировке 101 r-x (исполнение и чтение), прав на запись нету
и бэкапить как бы нужно на другой сервер, а не туда где сайт установлен
Вопрос: Не оформляют на работе что делать?

Лучший ответ: Устроился на работу, не оформляют трудовой договорВы не устроились на работу.Вот как договор оформят, так устроитесь.Как быть?Да как угодно. Если хотите устроиться на работу так устраивайтесь.

Худший ответ: При возникновении спорных ситуаций между работником и работодателем, сотрудник вправе обратиться в суд за защитой своих прав. Для этого потребуются документы, подтверждающие наличие между сторонами трудовых отношений, а у вас их нет! Вам будет полезно почесть эту статью secretarus.ru/groups/group/68/blog/1544 , тогда все поймете сами.
Вопрос: Каким образом осуществить внутренний баланс пользователей?

Лучший ответ: В виде журнала транзакций (приход/расход) отдельной таблицей и дополнительного поля "баланс" в основной таблице. Дополнительное поле менять триггером AFTER INSERT из таблицы транзакций.
Периодические списания выполнять отдельным скриптом, запускаемым из cron.

Худший ответ: Тебе ведь все равно понадобится статистика - куда ушли чьи деньги, чтобы пользователям отвечать. Таблицей приходорасходной - как в бухгалтерии. Каждый день планировщик (cron) считает сколько снять с каждого, записывает в эту таблицу и, по желанию, обновляет баланс.
Можно и в момент отдачи страницы делать сумму всех операций и изначальной цифры, но со временем количество операций будет таким большим, чтобы будет вызывать серьезную проблему.
Вопрос: Как в словаре найти индекс, имея знaчение типа float?

Лучший ответ: можно и ничего не надо обходить, -  причем все равно, строка это или что-то иное. Главное, чтобы ключ был неизменяемым объектом. 
Например, у вас два объекта в словаре (или более - все равно), тогда искомый ищется так:
obj = {"abc" : "37.6215879462381080",  "def" : "234.456"}
for (k, v) in obj.items():
	if k== 'abc':  # или if v == "37.6215879462381080": print(k) если надо так
		print(v)
ответ 37.6215879462381080
следите за отступами - они тут не отображаются.
С Новым Годом друзья!

Худший ответ: можно и ничего не надо обходить, -  причем все равно, строка это или что-то иное. Главное, чтобы ключ был неизменяемым объектом. 
Например, у вас два объекта в словаре (или более - все равно), тогда искомый ищется так:
obj = {"abc" : "37.6215879462381080",  "def" : "234.456"}
for (k, v) in obj.items():
	if k== 'abc':  # или if v == "37.6215879462381080": print(k) если надо так
		print(v)
ответ 37.6215879462381080
следите за отступами - они тут не отображаются.
С Новым Годом друзья!
Вопрос: JSON тип данные в MySQL, в чем минус?

Лучший ответ: По большому счету это денормализация базы.
Денормализацию стоит применять когда Вы 100% понимаете что делаете, получая в каких-то конкретных условиях ускорение каких-то конкретных запросов, взамен теряя в гибкости при дальнейшей разработке и в производительности во всех остальных местах.
Попробую расписать на Вашем примере (хранить категории поста в свойстве поста в json) чтобы было понятней:
Тут все отлично пока Вам просто нужно выводить категории у поста.
Как только нужно искать по категории - начинаются проблемы, какой нибудь JSON_CONTAINS - будет дико медленным на нормальном объеме данных (ведь ему нужно выполниться для каждой строки таблицы, а индексов то и нет).
Решение - заводить еще одну денормализованное свойство для категорий - в котором хранить id постов.
Но дальше всплывают новые задачи которые в нормализованной базе решаются за 5 секунд, а в денормализованной - нужно опять же кодить:
- поиск по нескольким категориям сразу
- расчет количества постов у категорий
- итд итп.
К чему это я все?
К тому что используйте 3 НФ, и только когда упретесь в реальную производительность базы - начинайте думать про денормализацию.

Худший ответ: Разница в скорости и в возможностях выборки. Почитайте как работают базы данных, как строятся индексы и что вообще значит слова реляционная.
Вопрос: Что значит параметр keep alive timeout у клиента pppoe?

Лучший ответ: Ну вот работает PPoE тоннель  поверх интернета, и вдруг раз и связь прервалась.
Возникает вопрос - тоннель сразу разрывать, или удерживать какое-то время, в надежде что связь наладится.
Вот этот параметр как раз определяет сколько будет поддерживаться активным тоннель в случае падения связи.
Если у вас он 60 секунд - то при падении связи на 30секунд, PPoE не оборвется.

Худший ответ: после того как пакеты по туннелю перестанут ходить, MikroTik будет слать keepalive пакеты в туннель и если в течении указанных секунд не будет подтверждения, туннель будет считаться мёртвым.
Вопрос: Vue вместо jquery на примере кинозала?

Лучший ответ: минут пять, на коленке:snippet

Худший ответ: Я бы на вашем месте посмотрел, как сделано на кассире:
1. Выбрал мероприятие
2. Выбрал зал (часть зала - партер, балкон)
3. Аджаксом подгружается xml - весом 1Мб (это примерно на 1500 кресел) 
4. Элементами polygon рисуется схема зала.
ХЗ, как тут ВУЕ сильно лучше ДЖИКВЕРИ
Вопрос: Можно ли при помощи php определить пользователя windows?

Лучший ответ: Только через юзерагента
$_SERVER["HTTP_USER_AGENT"]
Например мой имеет 
Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/51.0.2704.106 Safari/537.36
Где написано что я под  Windows NT 10.0; Win64; x64

Худший ответ: Локальный юзер<?php echo getenv("username"); ?>
Удаленный... никак. :)
Вопрос: Чем фильтровать HTTPS трафик с ключевыми словами?

Лучший ответ: Буква "S" в HTTPS - это "secure". Трафик зашифрован.
Но так как вы админ, возможно вы сможете внедрить свои сертификаты, устроить MITM, настроить DPI и перехватить трафик.
Не забудьте перед этим уточнить, насколько это вообще законно.

Худший ответ: Обратите внимание на сервис skydns 
Позволяет соблюсти 139-ФЗ и 436-ФЗ
Вопрос: Как прокачать новенький системный блок, не потеряв гарантии производителя?

Лучший ответ: Собирать с нуля проще, дешевле и лучше (в плане получаемых результатов), чем кустарно апгрейдить вещь, изначально не предназначенную для агрейда.
Вообще, фирменные системники - это специфический продукт, предназначенный не для тех кто серьезно разбирается в  железе, а для тех, кто любит чтобы кто-то подумал за них (читай - взял бы на себя ответственность за выбор), и такие люди готовы платить (фактически доплачивать) за это. Например, менеджеры среднего звена, на чью голову свалилась необходимость закупать оборудование (компы) боятся допустить какую-то ошибку в выборе комплектации и желают прикрыться крутым брендом: "Я же выбрал Asus, а не кучу разных noname, все правильно сделал".

Худший ответ: Ну где будете покупать там сразу же купите апгрейда и скажите чтобы вставили
Вопрос: Как сверстать такие линии?

Лучший ответ: Я бы верстал просто через ::before и ::after, вместо свойства контент вставьте символьный код этих черточек и стрелочек. Коды и как их вставлять посмотрите здесь.

Худший ответ: Я бы верстал просто через ::before и ::after, вместо свойства контент вставьте символьный код этих черточек и стрелочек. Коды и как их вставлять посмотрите здесь.
Вопрос: Почему почему код срабатывает хотя должен работать только по клику?

Лучший ответ: function imgResize(a) {
  a.classList.toggle('imgresized');
}
var z = document.querySelectorAll('.imgresize-wrapper');
for(x = 0; x < z.length; x++) {
  z[x].addEventListener('click', imgResize.bind(null, z[x])));
}
Потому, что событию клик передаётся не исполняемая функция, а уже результат её исполнения. Можно решить либо через замыкание, либо как я указал выше.

Худший ответ: Потому что в addEventListener передается не функция-обработчик, а ее результат. Нужно изменить такfor(x = 0; x < z.length; x++) {
  z[x].addEventListener('click', imgResize.bind(null, z[x]));
}
Вопрос: Доступ к железу, минуя API под Windows — возможно или нет?

Лучший ответ: Да легко. Открываете отверткой крышку системника/ноута - и вуаля, доступ к железу без winAPI. 
Короче неясно сформулировали.

Худший ответ: Можно. Из C#, через System.Management-классы. Работает медленно.
https://stackoverflow.com/a/340611
https://stackoverflow.com/questions/6944779/determ...
https://stackoverflow.com/questions/5992099/c-shar...
Вопрос: Как наложить цветный полупрозрачний фон на блок, у которого уже есть фон-картинка, при наведении на родительский блок?

Лучший ответ: Почитайте про ::before и ::after у элементов - это то что вам нужно.Пример.

Худший ответ: Псевдоэлементы, либо filter, + помните что можно 2 фона задать)
Вопрос: Как запретить ввод отрицательных чисел?

Лучший ответ: @input="onInput($event, product)"methods: {
  onInput(e, product) {
    product.quantity = Math.max(0, parseInt(e.target.value) || 0);
  },
},
илиwatch: {
  products: {
    deep: true,
    handler() {
      this.products.forEach(n => n.quantity = Math.max(0, parseInt(n.quantity) || 0));
    },
  },
},

Худший ответ: Вычисляемые свойства и слежение
Вопрос: Как найти в тексте все слова с двумя гласными, с помощью регулярного выражения?

Лучший ответ: #!/usr/bin/perl

use strict;
use warnings;
use utf8;
use open qw/:std :utf8/;

my $text = "Как найти слова с двумя гласными?";
my @words = split /\s+/, $text;
my ($count, @result, $tmp_word);
for my $word (@words) {
    $tmp_word = $word;
    $count = ($word =~ s/[уеёыаоэяию]//g);
    push @result, $tmp_word if $count == 2;
}

for (@result) {
    print $_, "\n";
}

Худший ответ: С двумя определенными гласными, или содержащие 2 гласные?Regex101 - отличный инструмент для тестирования, вставьте там свой текст и экспериментируйте.
Вопрос: Где находить идеи для веб проекта?

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

Худший ответ: проблема не в идее. Проблема в мотивации. Ее явно недостаточно. Цели абстрактны, поэтому уже на этом этапе на самом деле уже "все погибло".  Есть хорошая мудрость описывающая ситуацию - тот кто хочет что то сделать - делает, тот кто (на самом деле) не хочет - ищет причину чтобы не делать. 
Возможен и второй вариант - на самом деле есть желание написать что то свое чтобы польстить своему самолюбию. 
В общем я не вижу желания заработать. Как в еще одной поговорке - когда кричат "не хочу жить", то в 99% случаев забывают в конце добавить "так". И только 1% на самом деле чего то хочет/не хочет.
Вопрос: Photoshop проблемы. Почему замерзает?

Лучший ответ: АртемЪ 4Гб памяти? И фотошоп? Может у вас еще система с фотошопом на HDD стоит?
Устанавливал и работал с Adobe CS6 на нетбук (!), с разрешением 1024х600 (!), 1-ядерным intel atom (!!) и 2гб ОЗУ (!!!).
Creative Cloud конечно попрожорливей, но 4гб пока еще достаточно для какой-никакой но работы.

Худший ответ: сталкивался с таким, решение - пробежать по всем менюшкам до начала работы, через месяц само устаканилось.
Вопрос: Каким образом можно получить доступ к исходному коду сайта?

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

Худший ответ: При всём желании никто не сможет увидеть Ваши конструкции на PHP, если нет прямого доступа к файлам на сервере.
PHP - это серверный язык, скрипт выполняется на сервере, а в браузере Вы видите уже результат работы скрипта.
Есть совсем экзотический и нереальный вариант - на сервере по каким-то причинам отключено выполнение PHP скриптов (глобально. или в какой-то папке), тогда Ваш скрипт выведется как есть - со всеми конструкциями и названиями переменных.
Вопрос: View/Create/Update — это ли не ViewEdit? (через kartik DetailView) Как бы Вы это реализовали в одном Action (+Events)?

Лучший ответ: 1) actionGovnoKod
3) А зачем Вам yii и ООП? Просто 1 файл php и там все. Это же классно. Предлагаю еще дополнить комментариями на русском языке и вместо модели прямо из этого супер файла лазить в базу через mysqlli.

Худший ответ: Слышали о таком - Single Responsibility? Один метод класса должен отвечать за одно действие! Это один из принципов SOLID в ООП. Сам Yii этому следует и рекомендует следовать своим пользователям. А вот то, что вы пытаетесь сделать, называется - "говнокод".
https://ru.wikipedia.org/wiki/SOLID_(объектно-орие...
Вопрос: Почему зависает send_email?

Лучший ответ: EMAIL_USE_TLS = True замените на EMAIL_USE_SSL = True
Плюс порт не правильно стоит : 
Исходящая почта
адрес почтового сервера — smtp.yandex.ru;
защита соединения — SSL;
порт — 465.587 замените на 465

Худший ответ: Добавьте в свой конфиг settings.py переменную:DEFAULT_FROM_EMAIL = 'ваш email'
и в запустите следующую команду:python manage.py sendtestemail <email получателя>
Если у вас верный конфиг - получите отправленное с вашего сервера тестовое письмо.
Вопрос: Как рендерить react компонент с html?

Лучший ответ: Неправильный подход к разработке. Варианты, как это сделать правильно:
1. Данные забираются Ajax запросом по API
2. Если хотите отдавать данные со страницей, можно записать в любой тег в атрибут data-state или в тег скрипт, в ключ window.__data
3. Можно написать  node сервер с SSR и делать рендер на стороне сервера.

Худший ответ: Какой примерно код должен быть в скрипте для NodeJS для выполнения серверного рендеринкга SPA на React?
Посмотрите мой ответ плиз, я описал пример серверного рендеринга Реакт-приложения на Ноде (там Redux, для Mobx схема почти такая же, с мелкими отличиями). Для пхп, уверен, тоже есть решения, если вам принципиально использовать на сервере именно пхп (но я бы посоветовал закапывать этого динозавра и посмотреть в сторону Ноде).
Вопрос: Какой SSD поставить в MBP MD101?

Лучший ответ: В модели 12 года заработает любой SSD (по крайне мере я не встречал не совместимости на этом маке, в отличии от более старых моделей 9-10 года), ограничение по скорости это скорость шины Sata 3. Причем порт привода, тоже шина Sata 3. Поэтому без разницы куда ставить SSD. Но HDD лучше оставить  на штатном месте, потому как этот порт оборудован системой отключения при сильной тряске или вибрации.

Худший ответ: Спросите на тематических форумах, поддерживает ли эту модель ssd macbook. Я с где-то читал, что не на всех kinston'ах заводятся. В идеале было ssd от samsung взять, с ними вроде бы работает нормально, но тоже советую уточнить.
Вопрос: Как обезопасить серверную?

Лучший ответ: Кондиционер с контролем влажности и водяное охлаждение серверных компонентов.

Худший ответ: Что значит "обезопасить обдув серверов"? У вас сервера в опасности или обдув?
И кто такой Селикагель?
Вопрос: Парсинг сайта после выполнения js?

Лучший ответ: Тяжеловесная библиотека, которая выполняет js-код, и отдает данные с уже отобранным JavaScript-ом
phantomjs.org
Однако, в твоём случае в этом нет необходимости. Достаточно на вкладке network отследить куда отправляются запросы для получения данных, и парсить уже эту страницу

Худший ответ: Вы можете получить всю страницу в текущем виде(уже всю загруженную и обработанную) с помощью команды document.documentElement.innerHTML и дальше делать с ним всё что необходимо.
Вопрос: Почему eslint ругается no-unused-vars?

Лучший ответ: Eslint смотрит пофайлово, в этом модуле вызова нет, вот он и ругается. В офф. Доке(eslint.org/docs/rules/no-unused-vars) написано что с этим делать. Ну и вообще чем вас Array.forEach не устроил?

Худший ответ: Собственно решение, если кто столкнулся:rules: [
            {
                test: /\.js$/,
                loader: 'babel-loader',
                exclude: /(node_modules|bower_components)/,
            },
            {
                test: /\.js$/,
                loader: 'eslint-loader',
                include: [
                    path.resolve(__dirname, "src"),
                ],
            },
        ]
Меняем местами babel и eslint загрузчики в webpack.config.js
Вопрос: Зачем в public API используют public key и secret?

Лучший ответ: Для ответа на этот вопрос необходимо понять, что такое ассиметричное шифрование.
Краткое объяснение. Ассиметричное шифрование используется для безопасной передачи данных в заведомо небезопасной среде. Используя именно алгоритмы симметричного шифрования, оба участника должны договориться заранее о том, какой ключ использовать, что является потенциально небезопасным, потому что этот ключ можно перехватить и осуществлять атаку типа MITM либо прослушивая, либо подделывая пакеты.
Чаще всего используется алгоритм Диффи-Хэлмана, как наиболее простой. Важно! В чистом виде реализация этого алгоритма уязвима к нескольким видам атак, поэтому часто применяют модифицированные его версии.Работает он примерно так.Алиса и Боб хотят обменяться сообщениями.
1 шаг. Они публично договариваются об использовании определенной формулы, по которой будет вычисляться корректность их ключей. Для данного примера - a^x (mod b), где A публичный ключ применяющего формулу и b -  публичные ключ оппонента, а x - секретный ключ.
2 шаг. Каждый из них придумывает секретное число. Для Алисы, например, 3, а для Боба - 6. Это число не передается никуда, но вычисляется результат выполнения изначальной формулы. A^3(mod B), а результат (для Алисы - Z, для Боба - U).
3 шаг. Они обмениваются получившимися результатами и вычисляют значение формулы, подставляя вместо своего числа получившееся значение оппонента. Для Алисы это будет Z^3(mod B). И получившийся в результате этого действия ключ (он будет одинаковым для обоих) будет являться ключом подписи для обмена дальнейшими сообщениями.

Худший ответ: Почитайте про ассиметричное шифрование
Если вкратце, то с помощью публичного ключа сообщение шифруется. А с помощью секретного расшифровывается. Ассиметричное шифрование решает проблему передачу ключа, когда надо передать так, чтобы его никто не мог украсть
Вопрос: Какие ресурсы штудировать, чтобы разобраться в Android UI?

Лучший ответ: С техническими возможностями Appcompat и прочих библиотек помогут разобраться официальная документация, сайты типа StartAndroid или сайт А. Климова, и разные примеры кода, а пользоваться ими для решения ваших задач, это приходит исключительно с опытом, нигде нет готовых советов индивидуально для вас, ну если только курсы платные какие-нибудь.

Худший ответ: guides.codepath.com/android#designing-and-styling-views
Список мини гайдов по UI.
Вопрос: Какой выбрать nodejs Framework?

Лучший ответ: Так это же только обертка графическая, что там красть то? как вы запрашиваете данные? Ну так это можно и так посмотреть куда приложение обращается формат запроса/ответа и взять все данные, electron/nwjs/(любой толстый клиент или браузер) неважно. Какой нибудь fiddler покажет все. а в коде подключение к бд и всё, плакал мой проект, который снесет первоклашка.
ну так не подключайтесь на прямую к бд а все делайте через API своего сервера.

Худший ответ: А любое приложение можно посмотреть на Асме и вытащить что угодно. Это конечно не школьный уровень, но... Как вы никто не делает. Нужно либо сильно урезать клиентскую учётку в правах, либо писать северный API.
А десктопных фреймворка насколько знаю всего не много: Electron, NW. JS, что-то хромиумное и... все вроде.
Не нравится - пишите на другом языке.
Вопрос: Чем плохи классы в хтмл (col-md-2 col-md-offset-4юююи так далее) и как исправить?

Лучший ответ: ничем не плохи. просто ценители и перфекционисты "чистого" хтмл не годуют.

Худший ответ: плохо тем что дизайн хардкодится в хтмл. представим что у вас сайтик на неск десятков страничек. и вдруг меняется дизайн, например сайдбра был 4 колонки стал 3. 
если бы у вас там был был класс "sidebar" то вы бы просто поменяли в css его ширину в разных разрешениях. а когда у вас col-md-4 то вам нужно перелопатить вручную все шаблоны... 
ps я и сам его использую, но у меня все это в шаблонизаторах, поэтому дублирования кода нет, и все меняется в одном месте. но не везде это так.
раньше был zencss сайт, где одна разметка и сотни вариантов дизайна. вот к такому следует стремится. хтмл - только контент, а css - дизайн
Вопрос: Как отправить смс через wget или curl?

Лучший ответ: да нафиг эти SMS, поднимайте telegram бота.

Худший ответ: как выше уже сказали - sms.ru на свой номер бесплатно (5 смс в сутки), отправлять можно чем угодно (я отправляю через curl)
Вопрос: Область применения асинхронного программирования?

Лучший ответ: Асинхронный код позволяет выполнять код параллельно в одном потоке, итого профит в том что экономится память т.к. каждый поток требует память под себя. По сути все.
Итого это позволяет запускать 1Млн параллельных задач и более, экономя память.
Код не работает быстрее, а зачастую медленнее, т.к. ваша реализация переключения задач медленнее чем это делает ОС и процессор.
Выигрыш может быть за счет того что вы запустите задачи параллельно, когда в много поточном вы будете их блокировать друг другом. Но если под каждую задачу делать отдельный поток, то асинхронный не будет быстрее.
Асинхронный подход имеет смысл (только) когда в задаче есть долгие блокировки (веб-сокеты, сетевые закачки с зависаниями) - когда поток весит и ждет события, тогда вместо 10к потоков, можно все задачу уложить в один асинхронный поток.
Все бы нечего, но проблема в том что сложность асинхронного кода гораздо выше в разных аспектах, итого времени может тратится в разы больше (год на проект вместо 4 мес например).
Поэтому асинхронность применять лучше там где это оправдано (для веб-сокетов), а весь остальной проект делать "классически". А сейчас из-за моды некоторые пытаются целиком все асинхронным кодом делать, потом иногда по прошествии года/двух появляются статьи о том что асинхронность не стоит того, а их в комментариях обливают, что мол не умеете готовить.
Более разумным видится использование файберов/корутин, но эту тему не сильно развивают.

Худший ответ: Грубо говоря - профит в ситуациях, в которых процесс простаивает во время выполнения операции (например, указанные в вопросе ситуации).
Соответственно, если работа происходит синхронно - в это время невозможна работа с другими запросами. Если юзаются "системные" потоки - уже лучше, но накладные расходы относительно высоки. Ну и существуют подходы, позволяющие лучше утилизировать 1 поток (нодовое event-driven, golang-е горутины и прочее).
Вопрос: Есть ли простые игры на Си?

Лучший ответ: Q3 Arena — если 3D.

Худший ответ: Пример крестиков-ноликов (не мой, не проверял):
www.c-cpp.ru/books/primer-programmy-igry-v-krestik...
Вопрос немного не ясен, нужна ли графика или нет?