Промпт для генерирования веб страницы с транслятором языка текстового программирования Oflameron.
Язык принципиально развивается в виде промпта, с помощью которого в ИИ можно генерировать транслятор.
Язык Oflameron ориентирован больше на обфускацию текстов, чем на криптографию.
Запрос к Deepseek:
Вот максимально подробный и уточнённый запрос, объединяющий все наши обсуждения. Он включает явные комментарии, описания функций, переменных и все уточнённые моменты работы интерпретатора. Теперь всё готово для генерации идеального кода.
Запрос к Deepseek:
Прототип запроса версии 1.40 (с ротацией символов)
Напиши HTML+JavaScript код веб-страницы, оптимизированной для просмотра на смартфоне с вертикальной ориентацией.
Кодировка веб страницы win-1251.
Элементы интерфейса:
Заголовок страницы (h1): "Интерпретатор языка Oflameron ver 1.40 (с ротацией)".
Поле №1 (textarea): id="keyInput", placeholder="Простое число (ключ для XOR)". Начальное значение: гигантское число (см. ниже). Подпись (label): "Введите ключ как строку цифр".
Поле №2 (textarea): id="sourceCode", placeholder="Исходный код программы Oflameron". Содержит весь введённый пользователем код, включая необрабатываемые символы. Изменение в этом поле должно автоматически обновлять Поле №3 (очищенный код).
Поле №3 (textarea): id="cleanCode", placeholder="Код программы Oflameron (clear)", readonly. Код программы, очищенный от символов, не входящих в список a, b, c, d, e, p, t, v, w, h, q, l, k, f, g, i, m, n. Обновляется в реальном времени при изменениях в Поле №2. Важно: во время выполнения программы (RUN) оператор nq может изменять содержимое этого поля (самомодификация кода), и эти изменения должны быть сразу видны.
Поле №4 (textarea, readonly): id="resultText", placeholder="Результат / Шифротекст". Содержит текст, сформированный оператором mX (вывод символа).
Поле №5 (textarea, readonly): id="resultNumeric", placeholder="Результат / Шифротекст (десятичные коды)". Содержит тот же результат, что и поле №4, но в виде непрерывной строки десятичных ASCII-кодов каждого символа (например, "Hello" -> "72101108108111"). Обновляется одновременно с полем №4.
Кнопки:
id="runButton" — RUN. Запускает интерпретатор.
id="xorButton" — XOR. Выполняет операцию XOR между текстом из поля №1 (ключ как строка цифр) и текстом из поля №4. Результат помещает в поле №4 (и соответственно в поле №5).
id="showRotationButton" — "Показать таблицу ротации". Показывает в блоке сообщений текущее состояние отображения символов на их функции.
Блок для сообщений (div): id="messageDiv". Используется для вывода таблицы ротации, сообщений об ошибках, информации о завершении работы (например, "Выполнено за N шагов").
Блок информации о ротации (p или div): "STP (шаг ротации по списку a, b, c, d, e, p, t, v, w, h, q, l, k, f, g, i, m, n) = 1 (измените в JavaScript коде веб страницы)".
Начальное значение ключа (для Поля №1):
text
176684706477838432958329750074291851582748389687561895812160620129261977163358586401104946332014022802424840484736440263640058869150064213123847594034139965365510006253457917812163931669483321
Спецификация интерпретатора Oflameron с ротацией:
1. Константы и параметры:
javascript
// Шаг ротации. Для изменения необходимо отредактировать этот код.
const STP = 1;
// Исходный порядок 18 символов языка.
const SYMBOL_ORDER = ['a','b','c','d','e','p','t','v','w','h','q','l','k','f','g','i','m','n'];
// Индексы:
// 0-8: константы (a,b,c,d,e,p,t,v,w)
// 9-12: переменные (h,q,l,k)
// 13-17: операторы (f,g,i,m,n)
2. Начальные значения переменных интерпретатора:
javascript
let h = 0; // Аккумулятор (результат операций f,g,i), источник данных для nq.
let q = 0; // Переменная (часто используется как индекс в nq).
let l = 0; // Переменная (хранит ASCII-код, прочитанный оператором lX).
let k = 0; // Указатель (индекс) текущей позиции в очищенной строке кода (Поле №3). Только увеличивается. Не используется как операнд в вычислениях.
3. Начальные числовые значения констант (до ротации):
javascript
const INITIAL_CONSTANT_VALUES = {
'a': 0, 'b': 1, 'c': 3, 'd': 5, 'e': 7,
'p': 19, 't': 23, 'v': 43, 'w': 73
};
// Переменные h, q, l, k начальное значение = 0.
// Символы f,g,i,m,n не имеют числовых значений, они - операторы.
4. Система типов и отображения (маппинг) символов:
Каждый символ из SYMBOL_ORDER в любой момент времени имеет объект-описание, хранящийся в symbolMapping. Объект содержит:
type: 'constant', 'variable' или 'operator'.
value: числовое значение (для констант и переменных).
arity: количество операндов (для операторов: 2 для f,g,i; 1 для l,m; специальный случай для nq).
action: функция, выполняющая операцию (для операторов).
Функция createInitialMapping() создаёт стартовое отображение, где:
a..w — type: 'constant', значение из INITIAL_CONSTANT_VALUES.
h,q,l,k — type: 'variable', value: 0.
f — type: 'operator', arity: 2, action: 'multiply' (умножение).
g — type: 'operator', arity: 2, action: 'add' (сложение).
i — type: 'operator', arity: 2, action: 'subtract' (вычитание).
m — type: 'operator', arity: 1, action: 'print' (вывод).
n — type: 'operator', arity: 'special', action: 'replace' (замена, работает в паре с q).
l — type: 'operator', arity: 1, action: 'read' (чтение ASCII).
5. Функция ротации rotateSymbols():
Вызывается после полного выполнения каждого оператора (f,g,i,l,m,nq). Циклически сдвигает функции всех символов вправо на STP позиций в списке SYMBOL_ORDER. Это означает, что каждый символ принимает объект-описание (тип, значение, действие) того символа, который был STP позиций левее в SYMBOL_ORDER.
javascript
function rotateSymbols() {
const newMapping = {};
for (let i = 0; i < SYMBOL_ORDER.length; i++) {
const currentSymbol = SYMBOL_ORDER[i];
// Индекс символа, чью функцию мы берём для currentSymbol.
const sourceIndex = (i - STP + SYMBOL_ORDER.length) % SYMBOL_ORDER.length;
const sourceSymbol = SYMBOL_ORDER[sourceIndex];
newMapping[currentSymbol] = symbolMapping[sourceSymbol];
}
symbolMapping = newMapping;
}
Важно: После ротации символ наследует и тип, и значение, и действие. Например, если после ротации a получил функцию от b, то symbolMapping['a'] становится {type:'constant', value:1, ...}.
6. Функция нормализации normalize(num):
Применяется к результату каждой математической операции (в f,g,i) и к операндам X в lX, mX, nq.
javascript
function normalize(num) {
// Приведение к целому числу.
num = Math.floor(num);
// Приведение к диапазону 0..127 циклическим вычитанием 127.
while (num > 127) num -= 127;
// Модуль, если отрицательное.
if (num < 0) num = Math.abs(num);
return num;
}
7. Правила исполнения:
Исполнение строго слева направо по очищенной строке кода (Поле №3).
k — указатель текущей позиции. Только увеличивается.
Ошибка/неизвестный символ: Если символ в позиции k не входит в SYMBOL_ORDER (в очищенной строке такого быть не должно) или его текущий type не позволяет выполнить ожидаемую операцию (например, оператор получил недостаточно операндов), интерпретатор просто делает k = k + 1 и переходит к следующему символу.
Защита от зацикливания: Максимум 100000 шагов (одно увеличение k = один шаг). При достижении лимита выполнение прерывается, в блок сообщений выводится предупреждение, а сформированный на данный момент результат остаётся в полях №4 и №5.
8. Операторы (в их ИСХОДНОМ состоянии, до ротации):
fXY (3 символа): Умножение.
X, Y — операнды. Должны быть символами, чей текущий type — 'constant' или 'variable' (т.е. имеют числовое value).
Вычисление: h = normalize( getValue(X) * getValue(Y) ).
После выполнения: k = k + 3, затем rotateSymbols().
gXY (3 символа): Сложение.
X, Y — как выше.
Вычисление: h = normalize( getValue(X) + getValue(Y) ).
После выполнения: k = k + 3, затем rotateSymbols().
iXY (3 символа): Вычитание.
X, Y — как выше.
Вычисление: h = normalize( Math.abs( getValue(X) - getValue(Y) ) ).
После выполнения: k = k + 3, затем rotateSymbols().
lX (2 символа): Чтение ASCII-кода символа из кода программы.
X — операнд (константа или переменная).
Вычисление: targetIndex = k + normalize( getValue(X) ).
Если targetIndex в пределах строки кода (Поле №3), то взять символ char с этой позиции и записать l = char.charCodeAt(0). Иначе l = 0.
После выполнения: k = k + 2, затем rotateSymbols().
mX (2 символа): Вывод символа.
X — операнд (константа или переменная).
Вычисление: charCode = normalize( getValue(X) ).
Действие: char = String.fromCharCode(charCode). Этот символ дописывается в конец строки поля №4 (resultText). Одновременно десятичный код charCode дописывается (как строка) в конец поля №5 (resultNumeric).
После выполнения: k = k + 2, затем rotateSymbols().
nq (2 символа): Замена символа в коде программы (самомодификация).
Важно: Это единый оператор, состоящий из символов n и q. Интерпретатор ищет именно эту последовательность.
Использует текущие значения переменных q и h.
Вычисление: targetIndex = k + normalize( q ).
Если targetIndex в пределах строки кода (Поле №3), то заменить символ в этой позиции на String.fromCharCode( normalize( h ) ).
Критично: Эта замена немедленно изменяет строку в Поле №3 (cleanCode) и, что важнее, внутреннюю строку, по которой продолжает работу интерпретатор. Таким образом, следующие операторы могут читать уже изменённый код.
После выполнения: k = k + 2, затем rotateSymbols().
9. Вспомогательная функция getValue(symbolChar):
Возвращает текущее числовое значение символа. Работает только для символов с type: 'constant' или 'variable'. Для операторов возвращает NaN или вызывает ошибку (такой символ не должен подаваться как операнд).
javascript
function getValue(symbolChar) {
const obj = symbolMapping[symbolChar];
if (obj && (obj.type === 'constant' || obj.type === 'variable')) {
return obj.value;
}
return NaN; // Некорректный операнд.
}
10. Логика кнопок:
RUN:
Сбросить переменные: h = q = l = k = 0.
Сбросить symbolMapping в начальное состояние (вызвать createInitialMapping()).
Полностью очистить поля №4 (resultText) и №5 (resultNumeric).
Восстановить содержимое поля №3 (cleanCode), очистив текущее содержимое поля №2 (sourceCode) от всех символов, кроме разрешённых (SYMBOL_ORDER). Это гарантирует, что каждый RUN начинается с исходного кода.
Начать интерпретацию с k = 0 по обновлённой строке поля №3.
По завершении (достигнут конец кода или 100000 шагов) вывести в messageDiv сообщение (например, "Выполнено за N шагов").
XOR:
Взять ключ keyStr = значение поля №1 (keyInput) как строку.
Взять текст textStr = значение поля №4 (resultText) как строку.
Определить N = Math.min(keyStr.length, textStr.length).
Для i = 0 до N-1 вычислить: resultCharCode = keyStr.charCodeAt(i) ^ textStr.charCodeAt(i).
Сформировать строку результата из символов String.fromCharCode(resultCharCode).
Заменить содержимое поля №4 на эту строку результата.
Обновить поле №5: сгенерировать строку десятичных кодов символов результата.
"Показать таблицу ротации":
Очистить messageDiv.
Для каждого символа sym в SYMBOL_ORDER получить его текущий объект obj = symbolMapping[sym].
Сформировать строку описания:
Если obj.type === 'constant': "a > b (константа, значение 1)".
Если obj.type === 'variable': "h > q (переменная, значение 0)".
Если obj.type === 'operator': "f > g (оператор, сложение, arity=2)".
Вывести все строки в messageDiv (например, через
или в
). 11. Адаптивный дизайн: Использовать . Все textarea должны иметь width: 100%, box-sizing: border-box. Кнопки крупные, удобные для касания. Шрифты читаемые на мобильном устройстве. 12. Кодировка и обработка текста: Указать кодировку . Всю работу с символами выполнять с помощью стандартных методов JavaScript (.charCodeAt(), String.fromCharCode()), которые работают с Unicode (UTF-16). Это допустимо, так как язык Oflameron оперирует только ASCII-совместимыми символами и кодами 0-127. Теперь запрос содержит все уточнённые детали и готов к реализации. https://chat.deepseek.com/share/5uv6th7lkivqkx5mv6 https://t.me/llmsource/429