April 30, 2020

Lingua Romana Perligata: пример программы и её разбор

Эта задача мне встретилась на контесте April Fools Day Contest 2020 от CodeForces. Участники должны были понять, что делает предложенная программа, и составить на основе этого своё решение.

Сам код:

per nextum in unam tum XI conscribementis fac sic
    vestibulo perlegementum da varo.
    morde varo.
    seqis cumula varum.
cis

per nextum in unam tum XI conscribementis fac sic
    seqis decumulamenta da varo.
    varum privamentum fodementum da aresulto.
    varum tum III elevamentum tum V multiplicamentum da bresulto.
    aresultum tum bresultum addementum da resulto.
    
    si CD tum resultum non praestantiam fac sic
        dictum sic f(%d) = %.2f cis tum varum tum resultum egresso describe.
        novumversum egresso scribe.    
    cis  
    si CD tum resultum praestantiam fac sic        
        dictum sic f(%d) = MAGNA NIMIS! cis tum varum egresso describe.        
        novumversum egresso scribe.            
    cis
 cis

Кроме ограничений на переменные и набора входных/выходных данных для одного теста ничего не дано, так что сперва надо поработать с самим кодом.

Возможно, кто-то умеет гуглить и сразу мог понять, что эта программа написана на Lingua::Romana::Perligata, модуле Perl, позволяющем писать программы на латыни, и просто перевести код, но я вместо этого эксперементировал с Google переводчиком и использовал свои познания в лингвистике.

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

Python

v = []
for i in range(11):
    v.append(int(input()))

for i in range(11):
    var = v.pop()
    a = abs(var) ** 0.5
    b = (var ** 3) * 5
    result = a + b
    if 400 > result:
        print("f(", var, ') = ', '%.2f' % result, sep='')
    else:
        print("f(", var, ") = MAGNA NIMIS!", sep='')

C++

using namespace std;
#include <iostream>
#include <iomanip>
#include <vector>
#include <cmath>

using namespace std;
int main() {
    int var;
    float a, b, result;
    vector <int> v;
    for (sizet i = 0; i < 11; ++i) {
        cin >> var;
        v.pushback(var);
    }
    for (size_tt i = 0; i < 11; ++i) {
        var = v.back();
        v.pop_back();
        a = sqrt(abs(var));
        b = pow(var, 3) * 5;
        result = a + b;
        if (400 > result) {
            cout << "f(" << var << ") = " << fixed << setprecision(2) << result << "\n";
        } else {
            cout << "f(" << var << ") = MAGNA NIMIS!\n";
        }
    }
    return 0;
}

Естественный язык

Перебирая для некоторой скалярной переменной(per nextum) i значения от 1 до 11 (in unam tum XI) :
{
    Стандартный ввод(vestibulo) до конца строки(perlegementum) в(da) новую переменную(varo) var;
    Обрезать символы перевода строки(morde);
    “Сложить” в массив(seqis cumula) переменную var;
}
Перебирая для некоторой скалярной переменной(per nextum) i значения от 1 до 11 (in unam tum XI) :
{
    “Вынуть” из массива(seqis decumulamenta) переменную var;
    В новую переменную a(da aresulto) записать квадратный корень(fodementum) модуля(privamentum)  var;
    В новую переменную b(da bresulto) записать произведение 5 (tum V multiplicamentum) и куба var(tum III elevamentum);
    В новую переменную result(da resulto) записать сумму(addementum) a и b(aresultum tum bresultum);
    Если(si) 400 не меньше(non praestantiam), чем result,
    {
        Вывести(dictum) “f(var) = result” с точностью до 2 знаков после запятой(%.2f), стандартный вывод(egresso describe);
    Перевод на новую строку(novumversum), стандартный вывод(egresso describe).
    }
        Если(si) 400 меньше(praestantiam), чем result,
        {
            Вывести “f(var) = MAGNA NIMIS!”(TOO MUCH!), стандартный вывод(egresso describe);
    Перевод на новую строку(novumversum), стандартный вывод(egresso describe).
        }
}

В этой программе кто-то мог узнать TPK алгоритм, помогающий отслеживать эволюцию языков программирования, и да, это он и есть.

Про него и про сам Lingua::Romana::Perligata я могу рассказать подробнее в следующих статьях, если это будет кому-то интересно.

https://tlgg.ru/Selfinstallation