').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
Параметры заголовка примерные, возможно можно ещё улучшить. Спасибо чатику за идеи.
|
Комментариев нет:
Отправить комментарий