Studyprog

Регистрация на сайте

Для того, чтобы зарегистрироваться на сайте, необходимо пройти по данной ссылке и следовать дальнейшим инструкциям.

ВАЖНО! E-mail указаный при регистрации должен быть рабочим, на него будет выслано письмо с подтверждением регистрации. Пользователь, не активировавший свой аккаунт на сайте, не может отправлять решения и пользоваться другими сервисами сайта.

Вердикты тестирующей системы

По мере сдачи задач в систему можно получить следующие вердикты тестирующей системы:

Вердикт Объяснение Причина
Засчитано Ваше решение прошло все тесты в системе
Неверный ответ Ваше решение выдало неверный ответ
  1. Вы запрограммировали неверный алгоритм
  2. Вывод вашей программы не соответствует формату вывода
  3. Ваша программа использует поток ввода/вывода, не заявленный при отправке решения
Исчерпан лимит времени Ваше решение работает слишком долго
  1. Асимптотика Вашего алгоритма не удовлетворяет требованиям задачи
  2. В программе присутствует бесконечный цикл
  3. Ошибки связанные с шаблоном программного ввода
Исчерпан лимит памяти Ваше решение использует слишком много системной памяти
  1. В программе выделяется слишком много памяти
  2. Вложенность рекурсии в программе превышает допустимую норму
Ошибка выполнения Ваша программа завершила работу с ошибкой
  1. Обращение к недоступному адресу памяти
  2. Некорректные математические операции (деление на ноль, особые точки логарифмов и т.д.)
Исчерпан лимит вызова программных функций Ваше решение слишком много раз обращается к программным функциям или методам класса
  1. Ваша программа обращается к программным функциям или методам класса больше, чем это подразумевает условие задачи
Ошибка компиляции Произошла ошибка при сборке программы
  1. Вы допустили синтаксическую ошибку в коде
  2. Вы выбрали не тот компилятор

Отправка задач

На сайте есть несколько категорий задач, где при отправке решений надо соблюдать определённые правила.

Олимпиадные задачи

Это стандартные задачи, где нужно считывать с консоли или файла и выводить ответ на задачу на консоль или в файлы "input.txt" и "output.txt" соответственно. Выходные данные программы должны полностью соответствовать формату вывода, указанного в условии. На примере задачи Простая задача? покажем как нужно оформлять решение на том, или ином языке программирования.

Реализация на языке C (ввод/вывод с консоли)
#include <stdio.h>
int main(void) 
{
   int a;
   scanf("%d", &a);
   printf("%d %d", a/10, a%10);
   return 0;
}
Реализация на языке C (ввод/вывод с использованием файлов)

Способ первый: использование перенаправления ввода/вывода. Этот способ более предпочтителен, т.к. удобен при отладки кода. В других языках описание данного способа будет опущено.

#include <stdio.h>
int main(void) 
{
   freopen("input.txt","r",stdin);
   freopen("output.txt","w",stdout);
   int a;
   scanf("%d", &a);
   printf("%d %d", a/10, a%10);
   fclose(stdin);
   fclose(stdout);
   return 0;
}

Способ второй:

#include <stdio.h>
int main(void) 
{
   FILE *fin = fopen("input.txt","r");
   FILE *fout = fopen("output.txt","w");
   int a;
   fscanf(fin, "%d", &a);
   fprintf(fout, "%d %d", a/10, a%10);
   fclose(fin);
   fclose(fout);
   return 0;
}
Реализация на языке C++ (ввод/вывод с консоли)
#include <iostream>
using namespace std;
int main(void) 
{
   int a;
   cin >> a;
   cout << a/10 << " " << a%10;
   return 0;
}
Реализация на языке C++ (ввод/вывод с использованием файлов)
#include <fstream>
using namespace std;
int main(void) 
{
   ifstream fin("input.txt");
   ofstream fout("output.txt");
   int a;
   fin >> a;
   fout << a/10 << " " << a%10;
   fin.close();
   fout.close();
   return 0;
}
Реализация на языке Java (ввод/вывод с консоли)
ВАЖНО! Основной класс должен называться main
import java.io.*;
import java.util.*;

public class main
{
   public static void main(String[] args)
   {
      Scanner in = new Scanner(System.in);
      PrintWriter out = new PrintWriter(System.out);
      int a = in.nextInt();
      out.print(a/10+" "+a%10);
      out.flush();
   }
}

Ввод-вывод вещественных чисел осуществляется с использованием соответствующих локалей:

Scanner in=new Scanner(System.in);
in.useLocale(new Locale("US"));
double x=in.nextDouble();
System.out.printf(Locale.US,"%.2f\n",x);
Реализация на языке Java (ввод/вывод с использованием файлов)
import java.util.*;
import java.io.*;

public class main
{
   public static void main(String[] argv) throws IOException
   {
      new main().run();
   }
   PrintWriter pw;
   Scanner sc;
   public void run() throws IOException
   {
      sc = new Scanner(new File("input.txt"));
      int a=sc.nextInt();
      pw = new PrintWriter(new File("output.txt"));
      pw.print(a/10+" "+a%10);
      pw.close();
   }
}
Реализация на языке Pascal (ввод/вывод с консоли)
var 
   a:integer;
begin 
   read(a);
   writeln(a div 10,' ',a mod 10); 
end.
Реализация на языке Pascal (ввод/вывод с использованием файлов)
var 
   a,b:integer; 
   fin,fout:text; 
begin 
   assign(fin, 'input.txt'); 
   assign(fout, 'output.txt'); 
   reset(fin); 
   rewrite(fout); 
   read(fin,a); 
   writeln(fout, a div 10,' ', a mod 10); 
   close(fin); 
   close(fout); 
end.

Задачи с гибким кодом

Эти задачи отличаются от обычных олимпиадных задач тем, что как правило в числе входных данных помимо текста может ещё и присутствовать функция, процедура, метод или класс, в зависимости от условия задачи. На примере задачи Квадратура Гаусса с двумя узлами (1) покажем как нужно оформлять решение на том, или ином языке программирования.

Решение на языках С/С++

В программе необходимо объявлять функцию с прототипом double studyprog(double), а также обращаться к ней. Вставлять и писать саму функцию в код не нужно.

#include <stdio.h>
#include <math.h>

double studyprog(double);
int main(void) 
{
    double c;
    c=0.5*studyprog(0.5*(1.0-1.0/sqrt(3.0)))+0.5*studyprog(0.5*(1.0+1.0/sqrt(3.0)));
    printf("%.12lf\n",c);
    return 0;
}
Решение на языке Java

В программе необходимо обращаться к методу с прототипом double test.studyprog(double).

import java.io.*;
import java.util.*;
class main 
{ 
    public static void main(String[] args) 
	{  
        Locale.setDefault(Locale.ENGLISH);
        Scanner in = new Scanner(System.in);
        PrintWriter out = new PrintWriter(System.out);   
        double c;
        c=0.5*test.studyprog(0.5*(1.0-1.0/Math.sqrt(3.0)))+0.5*test.studyprog(0.5*(1.0+1.0/Math.sqrt(3.0)));
        out.format("%.12f",c);
        out.flush();
    }
}

Математические задачи

В эту категорию входит огромное число задач, так что всех даже и не перечислить. Например, суть задачи Простейшая задача вариационного исчисления (1) состоит в том, чтобы запрограммировать функцию $x(t)$, являющуюся решением задачи вариационного исчисления. Система Studyprog проверяет корректность данной функции численно. Поэтому входным данным к программе будет параметр $t$ в котором надо будет посчитать значение функции $x(t)$. Решением данной задачи, как не трудно догадаться, будет функция $x(t)=t$. Так что всего лишь необходимо запрограммировать код, подобный этому:

#include <stdio.h>
#include <math.h>
int main(void) 
{
    double t;
    scanf("%lg",&t);
    printf("%.14lf\n",t);
    return 0;
}

Однако, если Вам не хочется писать столь много строк кода, то можно воспользоваться компилятором Studyprog Math: Float Judge, разработанным компанией Studyprog. Тогда всего лишь нужно в одной строке записать саму функцию по правилам языка C. Не допускается пропуск знака умножения (например, выражения $2t$ и $tsin(t)$ считаются недопустимыми, вместо них нужно использовать 2*t и t*sin(t) соотвественно), запись дроби 1/3 также считается недопустимой (нужно использовать одну из следующих записей: 1/3.0, 1.0/3, 1.0/3.0), допустимо использовать функции и константы из библиотеки math.h, ниже приводятся наиболее часто встречающиеся функции и константы:

  1. синус — sin(t)
  2. косинус — cos(t)
  3. тангенс — tan(t)
  4. квадратный корень — sqrt(t)
  5. t в степени ppow(t,p)
  6. экспонента — exp(t)
  7. натуральный логарифм — log(t)
  8. гиперболический синус — sinh(t)
  9. гиперболический косинус — cosh(t)
  10. гиперболический тангенс — tanh(t)
  11. e — M_E
  12. π — M_PI
ВАЖНО! Обязательно использовать в качестве параметра ту переменную, которая требуется в условии задачи.