Анализ Личности

Известная методика анализа личности: 200 вопросов, профиль по 10 шкалам, расчёт на сервере

Добро пожаловать

Тест состоит из 200 вопросов. На каждый нужно ответить «Да» или «Нет». Отвечайте честно — первая реакция обычно самая точная.

Итог — профиль по 10 шкалам, отражающим разные черты личности.

Мои тесты

Кандидаты

Ссылки-приглашения

Результаты кандидатов

10 шкал анализа личности

Каждая шкала даёт значение от −100 до +100. Положительный полюс — благоприятная черта, отрицательный — противоположная.

Как считается результат

Модель восстановлена точно (выравнивание с reference-реализацией OCA + ~8500 измерений на эмуляторе оригинального бинарника; валидация max|err| = 0 на 400 свежих случайных паттернах). Каждый вопрос влияет ровно на одну шкалу: ответ «Да» добавляет dy, «Нет» — dn, «Не уверен» — 0. Сырая сумма по шкале переводится в итоговое значение ступенчатой норм-таблицей, зависящей от пола и возраста (4 комбинации).

Расчёт выполняется на сервере: браузер отправляет ответы, пол и возраст, сервер возвращает готовые значения шкал. Веса вопросов и норм-таблицы на клиент не отдаются.

для каждой шкалы s из A..J:
    raw[s] = Σ по 20 вопросам шкалы ( dy[q] при ответе «Да»
                                    + dn[q] при ответе «Нет» )   // «Не уверен» = 0
    результат[s] = norm_table[s][пол × возраст][raw[s]]   // целое, обычно −99..+98

// IQ оригинальная программа не вычисляет

Эталонные результаты оригинальной программы

Для калибровки использовался профиль «чередование Да/Нет начиная с Да» (Q1=Да, Q2=Нет, Q3=Да,… Q200=Нет) прогнанный в оригинальной DOS-программе для каждой комбинации пол × возраст. Цифры ниже — то, что выдала сама программа:

Как разобран тест

Исходные файлы

Что удалось извлечь надёжно

200 формулировок вопросов — из TEXT.DAT через cp866-декодирование записей Clarion DB.
Названия и описания 10 шкал (A–J) — найдены как русские строки cp866 в секции данных OCA_TST.EXE на офсете ≈ 0x24D00.
Заголовок теста «ОКСФОРДСКИЙ АНАЛИЗ ЛИЧНОСТИ» — оттуда же.
Эталонные результаты оригинальной программы для одного тестового профиля (чередование Да/Нет) на всех 4 комбинациях пол × возраст — получены прогоном в DOSBox (записано в original_result).

Модель подсчёта — восстановлена точно

Модель v2 (точная). Каждый вопрос влияет ровно на одну шкалу; вклады ответов «Да»/«Нет» — малые целые (dy/dn), «Не уверен» = 0. Сырая сумма по шкале переводится в результат ступенчатой норм-таблицей (4 комбинации пол × возраст).
Метод: headless-эмулятор оригинального бинарника (Unicorn, ~7 прогонов/с) + выравнивание с независимым портом оригинального OCA (github.com/roppa/oca). Найдена полная биекция вопросов DOS ↔ reference (порядок в RU-версии переставлен); у 166 вопросов веса совпали точно, 6 — инвертированные формулировки, 28 — изменённые веса RU-редакции.
Проверка: облака «сырой балл → результат» на 8537 прогонах — 0 конфликтов; норм-таблицы измерены на 100% достижимого диапазона; валидация на 400 свежих случайных паттернах — max|err| = 0 по всем 40 шкалам (4000/4000 точно).

Статический разбор P-кода (не потребовался)

Настоящая матрица весов лежит внутри P-кода Clipper 5 (процедуры VOPROSNIK, PASA, TOLK). Константы P-кода Clipper не хранятся непрерывной таблицей — они разбросаны по байткоду как tagged-литералы рядом с инструкциями. Публичного дизассемблера Clipper 5 P-кода нет.

Эмпирический путь (эмулятор + выравнивание с reference) оказался быстрее и дал точную модель без разбора байткода. Статический анализ сохранён в autotest/exe_analysis/ (Ghidra).

Структура EXE

РегионОфсетСодержимое
MZ header0x00000Entry point = 0x2231F
Сегмент кода + данных0x06200Turbo-C runtime и Clipper VM
Описания шкал A–J≈0x24D00cp866 русские строки заголовков и описаний
Таблица символов Clipper0x6FD6E57 записей имен процедур и модулей
P-код процедур0x70260+Байткод Clipper 5 с зашитыми весами
Таблица релокаций0x62006202 записи, 5025 указывают на BSS-сегмент 0x3BE0

Что есть ещё в папке проекта