Страницы

Поиск по вопросам

воскресенье, 24 ноября 2019 г.

Перевести программу с Паскаля на [любой-язык]


Конкурс окончен, смотрите результаты в конце вопроса.



Я думаю, многие из вас видели вопросы, состоящие из просьбы перевода программы 
одного языка на другой. Давайте-ка покажем, как делать такие вещи правильно! В нашем конкурсе мы исходим из такой простой программы на Паскале:

program test;
var a, b, c: integer;
begin
    readln(a);
    readln(b);
    c := a + b;
    writeln(c);
end.


(Она же на ideone.)

Задание состоит в следующем: вы должны перевести программу на любой-язык так, чтоб
сохранить как можно больше от исходного текста программы. В качестве целевого языка, понятно, исключаются языки группы Паскаля (Delphi, Algol, Oberon, Modula, etc., все языки, в которых используется begin/end для группировки команд в составную команду).

Вы можете дописывать конструкции до и после данного в условии текста, но не внутр
его (точнее, можете и внутри, но это будет считаться изменением — смотрите ниже условия подсчёта). Сам текст желательно менять как можно меньше.

Ограничения: Строки исходной программы между begin и end должны сохранять свой смысл
Они должны выполняться, и при их выполнении должно происходить в общих чертах то же
что и в исходной программе: readln должно считывать значения с консоли, c := a + b должно складывать значения двух переменных (или что там есть в вашем языке) в третью, writeln должно выводить правильный результат на консоль. (Это означает, что вы не можете просто закомментировать код первоначальной программы.)

Определение победителя: Выигрывает код, в котором исходный текст менее всего изменё
по сравнению с полным первоначальным вариантом (количество добавленных символов + количеств
удалённых символов + количество изменённых символов), считая и строки с program и end.
Разница в больших/маленьких буквах, а также замена символа на одинаковый по начертанию (например, русское «с»/английское «c») считается за пол-символа. Если два решения имеют одинаковое количество отличий (например, ноль), выигрывает то, у которого меньше добавленного кода (в символах). Если несколько решений одинаковы и по этому критерию, выигрывает то решение, которое получит больше голосов (как обычно, «за» минус «против»).

В частности, полное совпадение кода выигрывает у неполного независимо от количества подготовительного кода.

Для того, чтобы было легче проверять ваш код, старайтесь публиковать ссылку на онлайн-компилято
с вашим кодом. Код должен компилироваться без ошибок (пусть даже с предупреждениями) и правильно работать в диапазоне входных чисел от 0 до 1000.

Продолжительность конкурса — 1 неделя.



Для исключения разночтений, при неясности в правилах пожалуйста переспрашивайте в комментариях или в чате, посвящённом code golf.



Для примера, вот внеконкурсное решение на plain TeX:

\newcount\tmp \newcount\c

\def\uncatcodeletters{\uncatcoderange{`a}{`z}\uncatcoderange{`A}{`Z}}
\def\uncatcoderange#1#2{%
  \tmp=#1 \advance\tmp -1
  \loop\advance\tmp 1 \expandafter\catcode\number\tmp=11 \ifnum\tmp<#2 \repeat}

\def\s{\begingroup\uncatcodeletters\shlp}
{\def~ := #1 + #2;{%
  \global\expandafter\c\csname #1\endcsname
  \global\expandafter\advance\expandafter\c\csname #2\endcsname
  \endgroup}
\global\let\shlp=~}

\def\inp{\begingroup\uncatcodeletters\inphelper}
\def\inphelper eadln(#1);{\endlinechar=-1 \escapechar=-1
  \expandafter\inphelperi\csname #1\endcsname\endgroup}
\def\inphelperi{\global\read16 to }

\def\out{\begingroup\uncatcodeletters\outhelper}
\def\outhelper riteln(#1);{\message{\expandafter\the\csname #1\endcsname}\endgroup}

\let\DEF\def \let\END\end
\catcode`r=13 \let r=\inp \catcode`w=13 \let w=\out
\catcode`p=14 \catcode`v=14 \catcode`b=14
\let~=\catcode ~`c=13 \let c=\s ~`e=13 \DEF end.{\END}

program test;
var a, b, c: integer;
begin
    readln(a);
    readln(b);
    c := a + b;
    writeln(c);
end.


(Если кому интересно, гольфированный вариант.) Транскрипт компиляции:

~>tex golf.tex
This is TeX, Version 3.14159265 (MiKTeX 2.9 64-bit)
(golf.tex
a=5                % <-- 5 введено с консоли

b=8                % <-- 8 введено с консоли
13 )
No pages of output.
Transcript written on golf.log.




Просьба к отвечающим писать в начале решения ваш язык, количество изменённых символо
и количество символов в подготовительном коде. Также просьба давать не более одного решения на ответ.



Обновление: Конкурс окончен, вот результаты.

Побеждает ответ @Mike, сумевший уложиться в 78 подготовительных символов, и не поменять ни символа в исходном коде.

Другой ответ того же автора выглядит чрезвычайно изящно (подключение паскалевског
синтаксиса как внешний модуль, хей!), и почти выиграл приз зрительских симпатий, н
проигрывает по количеству символов вследствие своей большей общности. Оба решения пользуются особенностью языка Perl, который в своих модулях позволяет предобработку текста на Perl самим Perl'ом. Мощный язык, мощные средства управления синтаксисом, заслуженная победа.

Второй в списке победителей — ответ @Qwertiy. Это решение продолжает идею «получит
текст как строку, обработать, чтобы получился код на нужном языке, и выполнить над ней eval», с симпатичной, очень техничной и компактной реализацией (регулярки!).

Приз зрительских симпатий получает неожиданный ответ @kmv. В этом решении текст исходно
программы не объявляется строкой, а «вытягивается» из кода функции! (Это, формально говоря, решение не по стандарту, но фактически в распространённых браузерах toString() работает именно так.)

Третье место получает решение @pavel с комбинацией Unix shell/C, которое обходитс
без eval за счёт замены строк до компиляции и использования препроцессора C. Такой подход позволяет справиться с двоеточиями, которые вызывают затруднения для препроцессора у чистых решений на C/C++.

Вообще, идея со строкой и eval оказалась наиболее популярной, её реализуют такж
ответы @edem Perl, построчная замена, практически интерпретация, @Red Skotina (замен
строк на Питоне, построчная адаптация текста, оставаясь в рамках правил, хотя и на грани), @gil9red (то же, но более универсально, Питон), @nuts119 на C# (да, в C# можно сделать eval, вы не знали?) и @Streletz на Java (интерпретатор из сторонней библиотеки).

Тему интерпретации продолжает ещё одно решение @nuts119 на C# с использованием DataTabl
как arithmetic engine. Это решение, при всей его сложности, имеет дальний прицел на построение полноценного интерпретатора.

Оставшиеся решения на чистом C/C++ и Javascript/Typescript без eval вынуждены модифицироват
исходный текст, хотя они смогли обойтись минимальным количеством изменений. Из эти
решений наилучшие с одним удалённым символом решения @kmv (C, препроцессор, использование битовых полей) и @Qwertiy (C++, тонкости препроцессора). Интересно, что эти оба решения убирают из исходного текста соседние символы: из := убрано в первом случае двоеточие, а во втором — знак = (!).

Оставшиеся четыре решения (@Qwertiy, typescript, @pavel, C++, препроцессор (заработал
больше голосов, чем победитель), снова @Qwertiy, javascript и @Grundy, C, препроцессор) меняют больше символов в исходном коде, но также интересны и стоят вашего внимания.

Большое спасибо всем, кто принимал участие в конкурсе!



Таблица лидеров: (спасибо @Grundy за адаптацию скрипта и @jfs за идею)



function getAnswers(questionId, answer_filter, page) {
  return jQuery.ajax({
    url: '//api.stackexchange.com/2.2/questions/' + questionId + '/answers?page=
+ page + '&pagesize=100&order=desc&sort=activity&site=ru.stackoverflow&filter=' + answer_filter,
    method: "get",
    dataType: "jsonp",
    crossDomain: true
  }).then(function(data) {
    if (data.has_more) {

      return getAnswers(questionId, answer_filter, page + 1).then(function(d) {
        return data.items.concat(d.items);
      })
    }
    return data.items;
  });
}

function getAuthorName(e) {
  return e.owner.display_name
}

function process(items) {

  return items.map(function(item) {
    var matched = item.body.match(/\s*(.+?)\s*?,.*?(\d+),.*?(\d+)\s*?(?:[.;,(].*)?<\/h/);
    if (matched) {
      return {
        lang: matched[1],
        setup: +matched[2],
        changes: +matched[3],
        link: item.share_link,
        author: getAuthorName(item)

      };
    } else {
      return {
        lang: "N/A",
        setup: "N/A",
        changes: "N/A",
        link: item.share_link,
        author: getAuthorName(item)
      }
    }
  });
}

function sort(items) {
  return items.sort(function(a, b) {
    if (a.lang == "N/A") return 1;
    if (a.changes != b.changes) return a.changes - b.changes;
    return a.setup - b.setup;
  })
}

function fillTemplate(sortedItems) {
  $('#leadership').append(sortedItems.map(function(item, index) {
    return $('').append($('').html(index + 1))
      .append($('').html(item.author))
      .append($('').html(item.lang))
      .append($('').html(item.setup))
      .append($('').html(item.changes))
      .append($('').append($('').attr('href', item.link).text('Link')));
  }));
  return sortedItems;
}

var QUESTION_ID = 526265,
  ANSWER_FILTER = "!4*SyY(4Kifo3Mz*lT",
  startPage = 1;
getAnswers(QUESTION_ID, ANSWER_FILTER, startPage)
  .then(process)
  .then(sort)
  .then(fillTemplate);
#leadership {
  border-collapse: collapse;
}
#leadership td,
#leadership th {
  padding: 5px;
}
#leadership th {
  text-align: center;
}

Таблица лидеров

Автор Язык Подготовка Изменено


Ответы

Ответ 1



Раз в конкурсе участвует размер, вот еще вариант (лично мне нравится меньше, потому как большая ориентировка именно на этот код): perl, подготовка 97, измененных 0 perl, подготовка 78, измененных 0 sub r{$_[0]=<>} sub wr{print@_} $_=q. program test; var a, b, c: integer; begin readln(a); readln(b); c := a + b; writeln(c); end. ;s/\b(\w)\b/\$$1/g ;s/^\S.*|.{4}n|://gm ;eval Тест на ideone В коде происходит: Создаем функции r/wr аналогичные по действию паскалевским read/write ln. $_=q. присваивает "переменной по умолчанию" весь текст до следующего знака .. Все последующие строки работают с этой "переменной по умолчанию", так как явных переменных в них не указано. Перед переменными (однобуквенными словами) ставим знак $. Удаляем строки program, var, begin, end, части названий функций (readln=r, writeln=wr), двоеточия Выполняем полученный текст: r($a); r($b); $c = $a + $b; wr($c);

Ответ 2



C++, Добавлено 194, изменено 2 Честное решение в 1 файл. #include #define readln(a) std::cin>>a #define writeln(a) std::cout << a #define var int #define program int main(){ #define test struct E{ int n; } end; #define integer #define begin program test; var a, b, c integer; begin readln(a); readln(b); c = a + b; writeln(c); end. n; }

Ответ 3



perl, подготовка (423+17) 440, измененных 0 Включаемый модуль PascalSyntax.pm: package PascalSyntax; use Filter::Simple; use Exporter; @ISA=(Exporter); @EXPORT = qw(var program readln writeln); sub var(@){$_=undef for @_} sub readln(@) {chomp($_[0]=<>);} sub writeln(@) {print @_;} sub program(@) {}; FILTER { s/:=/=/g;s/:\s+\w+//g; s/begin/{/g; s/end\.?/}/g; for(/var\s+(.*?);/) { my $t=$1; $t=~s/\s+//g; for (split(/,/,$t)) { my $var=undef; *{'main::'.$_}=sub():lvalue{$var}; } } }; Программа: #!/usr/bin/perl use PascalSyntax; program test; var a, b, c: integer; begin readln(a); readln(b); c := a + b; writeln(c); end. В данном случае, зная гибкость perl я хотел что бы код работал сам по себе, с минимальным изменениями. И это при том, что в perl все переменные должны начинаться знаком $. Что было сделано: К коду применяется модуль Filter который позволяет его менять до стадии компиляции Он заменяет begin и end на фигурные скобки (можно было не делать, объявив функции с этими именами). И удаляются : так как других способов их использовать я не нашел (в perl нет оператора "двоеточие" и перегрузить его нельзя). Тот же filter анализирует строку var и создает в основной программе функции с именам переменных. Возвращающих каждая свою переменную, созданную в замыкании. Функции имею атрибут lvalue, позволяющий присваивать значения возвращаемым ими переменным (конструкция c()=a()+b() становится рабочей, а круглые скобки для известных на момент компиляции функций не обязательны) Для остальных ключевых слов паскаля (program, var, read/writeln) созданы функции.

Ответ 4



JavaScript, подготовка (без форматирования 223+5) 228, Изменено: 0 Текст программы все же можно поместить в комментарий, не нарушая ограничения на задание если затем этот текст можно извлечь и выполнить. Данное решение применяет этот подход. Комментарий был использован, поскольку в JavaScript нет here-document синтаксиса для строк. Что происходит: Весь текст функции, включая комментарии, в JavaScript может быть преобразован в строку Через f.toString() получаем текст функции, в теле которой находится комментарий с программой. Первый replace удаляет первые 4 и последние 2 строки. Второй replace оборачивает аргументы у readln и writeln в кавычки. Используется факт того, что c также попадает в window как глобальная переменная. Третий убирает двоеточие. Посмотреть можно тут. Проверял на Firefox, Chrome. Код с форматированием: (function (f) { var readln = function (x) { window[x] = +prompt() }; var writeln = function (x) { alert(window[x]) }; eval(f.toString() .replace(/(.+\n){4}([\s\S]+)en[^]+$/, '$2') .replace(/\((.)\)/g, '("$1")') .replace(':', '') ) })(function(){/* program test; var a, b, c: integer; begin readln(a); readln(b); c := a + b; writeln(c); end. */});

Ответ 5



C, подготовка 157, изменено 1 C, подготовка 159, 162, 187, 196, изменено 1. От одного двоеточия удалось избавиться, используя битовые поля в структуре. Для второго двоеточия ничего придумать не смог. :) Код здесь. #define test #define var struct{int #define integer 1;}end;a,b,c #define begin main(){ #define readln(x) scanf("%d",&x) #define writeln(x) printf("%d",x) program test; var a, b, c: integer; begin readln(a); readln(b); c = a + b; writeln(c); end. a;} После обработки препроцессором: # 1 "test.c" # 1 "" # 1 "" # 1 "test.c" program; struct{int a, b, c: 1;}end;a,b,c; main(){ scanf("%d",&a); scanf("%d",&b); c = a + b; printf("%d",c); end. a;}

Ответ 6



C#, Подготовка 804, Измененных 0 Написано не оптимально. На Mono не запустится. Но можно добавить еще "известных конструкций и изменить выражение. Неидеальное решение для конкурса :) using System; using System.Data; using System.Text.RegularExpressions; using VarIntegers = System.Collections.Generic.Dictionary; namespace Q526265_MyAnswer { class Program { static void RunProgram(string textProgram) { DataTable dt = new DataTable(); VarIntegers vars = new VarIntegers(); Func getVarName = str => Regex.Match(str, @"\(([\w]+)\)").Groups[1].Value; foreach (var item in textProgram.Replace("\r\n", "").Split(';')) { if (item.Contains("readln")) vars[getVarName(item)] = int.Parse(Console.ReadLine()); else if (item.Contains("writeln")) Console.WriteLine(vars[getVarName(item)]); else if (item.Contains(":=")) { var exp = Regex.Split(item.Replace(" ", ""), ":="); vars[exp[0]] = (int)dt.Compute(Regex.Replace(exp[1], @"[\w]+", m => vars[m.ToString()].ToString()), ""); } } } static void Main() { RunProgram(@" program test; var a, b, c: integer; begin readln(a); readln(b); c := a + b; writeln(c); end. "); RunProgram(@" program test; var number1, number2, number3: integer; begin readln(number1); readln(number2); number3 := number1 * number2 - (number1 + number2); writeln(number3); end. "); } } }

Ответ 7



Javascript ES6, добавлено 100, изменено 0 readln=prompt,writeln=alert;eval(` program test; var a, b, c: integer; begin readln(a); readln(b); c := a + b; writeln(c); end. `.replace(/^[pbe].*|: ?\w*/gm,"").replace(/\w+\((.)\)/g,"$1=+$&"))

Ответ 8



C++, добавлено 252, изменено 1 (и это не двоеточие!) https://ideone.com/WxCd1s #include #define program int #define test main(){ #define var int #define v(t) integer=a+b;u##t #define z(t) v(t) #define c z(__LINE__) #define begin #define readln std::cin>> #define writeln(x) std::cout<

Ответ 9



Typescript, добавлено 127 120, изменено 2 Песочница declare type integer=any ~function(a,b,writeln,end){var test,begin,u=arguments,readln=i=>u[i]=+prompt(), program=test; var a, b, c: integer; begin readln(a); readln(b); c = a + b; writeln(c); end. a}(0,1,alert,{}) Javascript ES6, добавлено 93 86, изменено 3 Аналогичная идея, но с несколькими глобальными переменными: ~function(a,b,writeln,end,test,begin){readln=i=>arguments[i]=+prompt() program=test; var a, b, c, integer; begin readln(a); readln(b); c = a + b; writeln(c); end. a}(0,1,alert,{}) Значение по умолчанию использовать нельзя, т. к. оно разрывает связь arguments с именами.

Ответ 10



c, Подготовка: 180, изменено 5 #define program #define test #define begin int main(void){ #define end } #define var(a,b,c,...) int a,b,c #define readln(a) scanf_s("%d",&a) #define writeln(a) printf("%d",a) program test; var(a, b, c, : integer); begin readln(a); readln(b); c = a + b; writeln(c); end

Ответ 11



C# Еще один вариант, здесь уже pascal код транслируется в c# код, который затем компилируется и запускается. using System; using System.Reflection; using System.Text.RegularExpressions; namespace Q526265_MyAnswer2 { class Program { static void RunProgram(string pascalProgram) { string className = "Program"; Func pascalType2SharpType = pascalType => { switch (pascalType) { case "integer": return "int"; } return "object"; }; var sharpProgram = Regex.Replace(pascalProgram, @"program (\w+);", => { className = m.Groups[1].Value; return m.Result(@" using System; class $1 { static void readln(ref int variable) { variable = int.Parse(Console.ReadLine()); } static void writeln(int value) { Console.WriteLine(value); } "); }); sharpProgram = Regex.Replace(sharpProgram, @"var (.*): (\w+);", m = m.Result("static " + pascalType2SharpType(m.Groups[2].Value) + " $1;")); sharpProgram = Regex.Replace(sharpProgram, @"readln\((\w+)\)", "readln(ref $1)"); sharpProgram = sharpProgram.Replace("begin", "static void Main() {").Replace("end.", "}}").Replace(":=", "="); object programObject = new Microsoft.CSharp.CSharpCodeProvider() .CompileAssemblyFromSource(new System.CodeDom.Compiler.CompilerParameters(), sharpProgram) .CompiledAssembly.CreateInstance(className); programObject.GetType().GetMethod("Main", BindingFlags.Static | BindingFlags.NonPublic).Invoke(null, null); } static void Main(string[] args) { RunProgram(@" program test; var a, b, c: integer; begin readln(a); readln(b); c := a + b; writeln(c); end. "); RunProgram(@" program MyProgram; var a, b, c, d: integer; begin readln(a); readln(b); readln(d); c := (a + b) / d; writeln(c); end. "); } } } https://ideone.com/Dt0WhE Более короткий вариант: https://ideone.com/jwdByx

Ответ 12



Python3, подготовка 423, измененных 0 code_pas = '''\ program test; var a, b, c: integer; begin readln(a); readln(b); c := a + b; writeln(c); end.''' code_pas = code_pas.split('\n') code_pas = code_pas[3:7] code_pas[0] = code_pas[0].replace(' readln(a);','a = int(input())') code_pas[1] = code_pas[1].replace(' readln(b);','b = int(input())') code_pas[2] = code_pas[2].replace(' c := a + b;','c = a +b') code_pas[3] = code_pas[3].replace(' writeln(c);','print(c)') code = '\n'.join(code_pas) co = compile(code,'','exec') exec(co) http://ideone.com/fGsz4n Вариант вне конкурса: code_pas = '''\ program test; var a, b, c: integer; begin readln(a); readln(b); c := a + b; writeln(c); end.''' code_py = '''\ a = int(input()) b = int(input()) c = a + b print(c)''' code = code_pas.replace(code_pas, code_py) co = compile(code,'','exec') exec(co) http://ideone.com/L4ilJD

Ответ 13



Java, Подготовка: >1500 (точно затрудняюсь подсчитать) 1500, Изменено:0 Небольшой пример трансляции с Pascal на Java с последующим выполнением результата на лету при помощи библиотеки BeanShell. Считаю, что написано далеко не идеально, так как не обладает достаточной гибкостью. Особенность решения - синтаксис Pascal в незначительной степени сохранён и в результирующем коде на Java. Класс Engine (реализует требуемый функционал): import bsh.EvalError; import java.io.IOException; import bsh.Interpreter; public class Engine { //Задание с ru.SO, скопированное без каких-либо изменений private final String sourcePascal = "program test;\nvar a, b, c: integer;\nbegin\n readln(a);\n readln(b);\n c := a + b;\n writeln(c);\nend."; private final String classPrefix = "public class Test{"; private String methodPrefix = "public void testMethod(){"; private final String postfix = "}"; private final String readln = "private int readln(){Scanner in = new Scanner(System.in);return in.nextInt();}"; private final String writeln = "private void writeln(int a){System.out.println(a);}"; private final String engineScript = "Test t = new Test();t.testMethod();"; private String translateToJava(String source) { String preparedCode = source.substring(source.indexOf(";") + 1).replace(":=" "=").replace("var a, b, c: integer", "int a,b,c").replace("begin", "{").replace("end.", "}").replace("readln(a)", "a=readln()").replace("readln(b)", "b=readln()"); String methodScript = methodPrefix +preparedCode+ postfix; String classScript = classPrefix + readln + writeln + methodScript + postfix; String result = classScript + engineScript; return result; } public void run() throws IOException, EvalError { Interpreter i = new Interpreter(); i.eval(translateToJava(sourcePascal)); } } Использование класса Engine: Engine en =new Engine(); en.run(); Результирующий код на Java, в который механизмы класса Engine превращают задани на Pascal: public class Test{private int readln(){Scanner in = new Scanner(System.in);retur in.nextInt();}private void writeln(int a){System.out.println(a);}public void testMethod(){ int a,b,c; { a=readln(); b=readln(); c = a + b; writeln(c); }}}Test t = new Test();t.testMethod();

Ответ 14



Javascript ES6, добавлено 86 79, изменено 3 (без eval) begin=end=test=writeln=alert;with(o={a:'a',b:'b',readln(x){o[x]=+prompt()}}){ program=test; var a, b, c, integer; begin readln(a); readln(b); c = a + b; writeln(c); end. a}

Ответ 15



python3: code = """\ program test; var a, b, c: integer; begin readln(a); readln(b); c := a + b; writeln(c); end. """\ .replace('program test;', '')\ .replace('var a, b, c: integer;', '')\ .replace('begin', '')\ .replace('end.', '')\ .replace(' ', '')\ .replace(':=', '=')\ .replace('writeln', 'print')\ .strip() import re code = re.sub('readln\((.+)\);', r'\1 = int(input())', code) exec(code) Замена операндов / операторов на аналогичные. Для замены readln используется регулярка.

Ответ 16



Perl, Добавлено 304, Изменено 0 p(' program test; var a, b, c: integer; begin readln(a); readln(b); c := a + b; writeln(c); end. '); sub p { # Получаем токены. while (my $s = substr($_[0], $i++, 1)) { $s !~ /\s/ ? $t .= $s : $t ne '' ? ((push @t, $t) and ($t='')):(); } # Анализируем их, составляя текстовый аналог pascal программы для perl. for (my $i=0; $i < @t; $i++) { $e .= '$'.substr($t[$i],7,1).'=<>;' if $t[$i]=~/^readln/; $e .= '$'.$t[$i-1].'=$'.$t[$i+1].$t[$i+2].'$'.$t[$i+3] if $t[$i] eq ':='; $e .= 'print$'. (substr($t[$i], 8, 1)).';' if $t[$i]=~/^writeln/; } # Выполняем программу. eval $e; }

Ответ 17



sh/С, Подготовка: ~175, Изменено:0 Не знаю насколько это честно и как считать. echo ' Dreadln(a) scanf("%d",&a); Dwriteln(a) printf("%d",a); Dvar int Dtest Dinteger Dbegin main(){ Dend ; program test; var a, b, c: integer; begin readln(a); readln(b); c := a + b; writeln(c); end. }' | sed 's/[.:]//g' | sed 's/D/#define /g'| gcc -x c - -o 1 && ./1 Параметры заголовка примерные, возможно можно ещё улучшить. Спасибо чатику за идеи.

Комментариев нет:

Отправить комментарий