[Logo] Форум DL
  [DL]  На главную страницу 
Индекс форума ->Олимпиадное программирование ->Обсуждение теории 1, 2
Автор Сообщение
Тимофей Грибанов

Темы: 1
Сообщений: 6

Мой профиль
Курс "Методы алгоритмизации"

Олимпиады по информатике\Реализация\Строки\10_Gg - "Аббревиатура" 100111 Вераксич, Коржик, Тимошков

Моё решение проходит на Delphi 7,но не проходит на FP Win32.

var
  p     : array [1..1000] of string;
  d,n,i : longint;
  s,z,f : string;
begin
  readln(s);
  s:=s+' ';
  d:=length(s);
  z:='';
  n:=0;
  for i:=1 to d do
    if s[i]<>' '
      then z:=z+s[i]
      else begin
             inc(n);
             p[n]:=z;
             z:='';
           end;
  f:='';
  for i:=1 to n do f:=f+Upcase(p[i,1]);
  writeln(f);
end.

Вадим Грибанов

Темы: 4
Сообщений: 23

Мой профиль
В Delphi string по умолчанию ansistring, а в freepascal нет.
______________________
Never say never.
Терентий Гацуков

Темы: 1
Сообщений: 43

Мой профиль
USACO 2004-2011\Bronze\Одномерный массив\08_NovB - "Switching Lights" 78207 LongFan, 2008

Моё решение не проходит на Turbo Pascal но проходит на FP Win32 и Delphi 7.
Оно проходит на Turbo Pascal если readln заменить на read.

{$r+}
var
  A           : array [1..1000] of longint;
  n,m,c,b,r,k,i,j : longint;
begin
  assign(input,'swtch.in'); reset(input);
  assign(output,'swtch.out'); rewrite(output);
  readln(n,m);
  for i:=1 to n do a[i]:=0;
  for i:=1 to m do
    begin
      readln(c,r,b);
      if c=0
        then for j:=r to b do a[j]:=1-a[j]
        else begin
               k:=0;
               for j:=r to b do if a[j]=1 then k:=k+1;
               writeln(k);
             end;
    end;
  close(input); close(output);
end.

Михаил Долинский

Темы: 1984
Сообщений: 47232

Мой профиль
У этой задачи тесты из под Linux (между строками только код 0A, а не 0D 0A, как принято в Windows )
Терентий Гацуков

Темы: 1
Сообщений: 43

Мой профиль
Олимпиады по информатике\Реализация\Строки\10_BY - "Бактериальное родство" 98545

Моё решение проходит на Turbo Pascal, но непроходит на FP Win32(выдаёт "ошибка копиляции"):
var
  s1,s2:string;
  i,n,k,max : longint;

  procedure Sdvig(s1:string; var k,i:longint);
    var
     y,d : longint;
     f : string;
    begin
      k:=0;
      d:=length(s1);
      f:=copy(s1,i+1,d-i+1)+copy(s1,1,i);
      for y:=1 to n do
        if f[y]=s2[y] then inc(k);
    end;

begin
  assign(input,'input.txt'); reset(input);
  assign(output,'output.txt'); rewrite(output);
  readln(n); readln(s1); readln(s2);
  for i:=1 to n do
    begin
      Sdvig(s1,k,i);
      if k>max then max:=k;
    end;
  writeln(max);
  close(input); close(output);
end.


Как оказалось ошибка была в этой строке:
procedure Sdvig(s1:string; var k,i:longint);  

При такой записи переменная может быть изменена в procedure Sdvig;
FP win32 запрещает это, поскольку переменная i является переменной цикла в главной программе.

Исправленное решение, которое прошло в TP и FP Win32:
var
  s1,s2:string;
  i,n,k,max : longint;

  procedure Sdvig(s1:string; i:longint; var k:longint);
    var
     y,d : longint;
     f : string;
    begin
      k:=0;
      d:=length(s1);
      f:=copy(s1,i+1,d-i+1)+copy(s1,1,i);
      for y:=1 to n do
        if f[y]=s2[y] then inc(k);
    end;

begin
  assign(input,'input.txt'); reset(input);
  assign(output,'output.txt'); rewrite(output);
  readln(n); readln(s1); readln(s2);
  for i:=1 to n do
    begin
      Sdvig(s1,i,k);
      if k>max then max:=k;
    end;
  writeln(max);
  close(input); close(output);
end.

Александр Соловьёв

Темы: 7
Сообщений: 29

Мой профиль
Гомельская обл. \1998\День 1\C - "Такси"
Выложу сразу исходник.



var 
a,b,ans : Array [1..100] of longint;
st : array [1..100] of longint;
n,i,sum,stn,kol,min : longint;

Procedure rec(k : longint);
var ak,i : longint;
begin
 ak:=b[k];
 if sum+ak>n then exit;
    inc(sum,ak);
    inc(st[ak]);
 if sum=n then 
 begin
  kol:=0;
  for i:=1 to 10 do kol:=kol+a[i]*st[i];
  if kol<min then 
  begin
   min:=kol;
   for i:=1 to 10 do ans[i]:=st[i];
  end;
 end;
 rec(k);
 for i:=k+1 to 10 do rec(i);
 dec(sum,ak);
 dec(st[ak]);
end;

begin
assign(input,'taxi.inp'); reset(input);
assign(output,'output.txt'); rewrite(output);
 min:=maxlongint;
 for i:=1 to 10 do read(a[i]);
 read(n);
 sum:=0;
 for i:=1 to 10 do b[i]:=i;
 for i:=1 to 10 do rec(i);
 for i:=1 to 10 do 
 begin
  while ans[i]>0 do 
  begin
   writeln(i,' ',a[i]);
   dec(ans[i]);
  end;
 end;
 writeln(min);
 close(input); close(output);
end.


Вот мои посылки на разные компиляторы:
C. Такси 100 / 100 Все тесты успешно пройдены 1С.pas DelTA3 at NewIT Delphi 7

26.11 20:20 C. Такси 0 / 100 ошибка компиляции 1С.pas DelTA3 at NewIT FP Win32 2.0.2

26.11 20:19 C. Такси 100 / 100 Все тесты успешно пройдены 1С.pas DelTA3 at NewIT FP go32v2 v1.0.10

26.11 20:18 C. Такси 0 / 100 Ошибка чекера на 5-ом тесте. Причина выхода: Runtime Error 201:Range check error 1С.pas DelTA3 at DLServer FP Win32 v2.2.0

C. Такси 100 / 100 Все тесты успешно пройдены 1C.pas DelTA3 at NewIT Turbo Pascal 7.0

Хотелось бы разобраться, почему один и тот же код на одних компиляторах проходит, а на других слетает.
(Конкретно интересует компилятор FP Win32 v2.2.0 там где ошибка чекера)

Михаил Долинский

Темы: 1984
Сообщений: 47232

Мой профиль


Тимофей Дубовик:

интересную вещь наблюдал сегодня: отправляю код, написанный в дельфи при выбранном компиляторе дельфи - выдаёт либо "неверный ответ" либо "access violation". копирую ТОТ ЖЕ САМЫЙ код в блокнот, сохраняю с разрешением *.pas и отправляю, выбрав компилятор fpc. и вуаля - "все тесты пройдены"

и такое случалось на нескольки задачах. я сомневаюсь, что дело в выборе компилятора. в чём проблема? 



Михаил Долинский:

Именно в компиляторе
Я говорил об этом на лекциях:

Turbo Pascal, Free Pascal, Delphi - это разные программы, написанные разными командами программистов в разное время.

Неудивительно, что они работают ПО-РАЗНОМУ.

У нас даже есть специальная тема, где мы описываем эти "разности":
Различия между Turbo Pascal, FP Win32, Delphi 7

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

А потом "всем миром" будем искать очередное отличие в их работе. 
Михаил Долинский

Темы: 1984
Сообщений: 47232

Мой профиль
-----Original Message-----
From: User 126138 [mailto:webmaster*gsu.by]
Sent: Thursday, December 01, 2011 11:22 PM
To: Michael Dolinsky
Subject: Consultation on course 15

Помогите, пожалуйста.
Почему-то когда отправляю код на Delphi (Dpr) не работает,(. Решение вызвало ошибку ACCESS_VIOLATION). пишу ту же программу на Паскале, все четко срабатывает.

-- Спрашивает 126138 [Зданович Егор]
-- Курс 'Методы алгоритмизации'
Distance Learning Belarus - http://dl.gsu.by - 01.12.2011 23:21

Коробейникова Евгения

Темы: 4
Сообщений: 32

Мой профиль
В качестве поучительной истории для тех кто этого не знает.Cегодня Богдан Тихонов попросил меня посмотреть его задачу N3 с областной олимпиады. Он ее писал на Delphi и утверждал, что Delphi на первый тест ему выдавал правильный ответ, а в результате тестирования с компилятором FPC 0 баллов. Я взяла его решение и тесты. Действительно Delphi выдает на первых трех тестах( дальнейшие тесты не верный ответ) ответ правильный, а FPC нет. Стала смотреть программу.
Вот кусок кода.
     while l<=k do
      begin
        for i:=x to x+d-1 do
         sum[l]:=sum[l]+a[i];
        inc(l);
        inc(x,d);
      end;
    if i<=n then
     for l:=i to n do
      sum[k]:=sum[k]+a[l];

Так вот во FP после выполнения цикла for параметр цикла равен последнему значению, а в Delphi последнее значение +1.
Следовательно в FP если x+d-1 равно n, то этот if выполнится, а в Delphi нет.
 if i<=n then
     for l:=i to n do
      sum[k]:=sum[k]+a[l];

Михаил Долинский

Темы: 1984
Сообщений: 47232

Мой профиль
Баг с int64 и Q+ в Delphi 7

Автор сообщения - Quercitron (Codeforces):

Долго пытался найти, почему мое решение получает Runtime Error. Было установлено, что программа падает во время подсчета "векторного произведения" по трем точкам, текст ошибки:
"Project E.exe raised exception class EIntOverflow with message 'Integer overflow'."
Координаты точек не превосходили по модулю 10^9, значит координаты векторов не больше 2*10^9, и получаемый результат больше 8*10^18 никак не мог быть. А int64 это примерно до 9*10^18, и вроде все должно замечательно работать.
Тогда я поймал значения, на которых программа падала в этом месте. И получилась весьма странная вещь, суть которой сводится к следующему: если запустить такую программу:
{$Q+}
uses SysUtils;
var
  a, b, c: int64;
procedure bug;
begin
    a := -1834569418;
    b := -330651027;
    c := a * b;
end;
Begin
  bug;
End.

то при умножении a на b случается описанная выше ошибка.
Но если выключить директиву проверки на переполнение целочисленных операций Q: {Q-} то все будет выполняться без ошибок. Так же было установлено, что даже с включенной Q+, если производить умножение в основном теле программы (т.е. между Begin и End.), то все будет нормально, пока включен оптимизатор (O+), а если его выключить, то и там падает... При этом числа не обязательно только такие, их можно менять в довольно большом диапазоне (+/- 5-10 %).
Короче, полная хрень какая-то.
Я хочу узнать, может кто-нибудь сталкивался с похожими вещами или просто может объяснить, почему такое происходит и как с этим бороться.
Заранее спасибо.

ИМХО, int64 в Delphi - зло, страшнее ядерной войны.
Работает долго, иногда вот с такими ошибками... 


Я тоже сталкивался с этим в какой-то геометрии. Это вроде-бы из-за того, что delphi (не обязательно 7) неправильно проверяет на owerflow у int64. После этого окончательно перешел на fpc. В нем подобных багов я не замечал. 
Михаил Долинский

Темы: 1984
Сообщений: 47232

Мой профиль
Баг возвращения значения функции

Anatoliy Prisyazhnyuk:

Это не баг в компиляторе - это специфика FreePascal:

Функция

function less(a1, a2, b1, b2: string): boolean;
begin
  result:= false;
  if a1 < b1 then result:= true else
  if a1 > b1 then result:= false else
  if a1 = b1 then begin
    if a2 <= b2 then result:= true else result:= false;
  end;
end;

применительно к реализации на FPC должна выглядеть так:

function less(a1, a2, b1, b2: string): boolean;
begin
  less := false;
  if a1 < b1 then less:= true else
  if a1 > b1 then less:= false else
  if a1 = b1 then begin
    if a2 <= b2 then less:= true else less:= false;
  end;
end;
Т.е. во фришнике не используется для возврата значения функции переменная result - в этом одно из отличий FPC от Delphi.
Михаил Долинский

Темы: 1984
Сообщений: 47232

Мой профиль
Задача Гомельская гор.\2004\Младшая группа\6 - "Поле" 24154 Короткевич Геннадий

Решение (Сукач Сергей)

var
  n,m,s : extended;
begin
  read(n,m);
  s:=(1+n)*(1+m)*n*m/4;
  writeln(s:20:0);
end.
Дает различные результаты в Turbo Pascal и Free Pascal

Рабочая версия
- в TP (при добавлении директив {$e+,n+}) идет программная реализация обработки вещественных чисел - ТОЧНАЯ
- в FP win 2.2.0 - идет аппаратная реализация и она неточна (за счет ошибок округления?)

Тест 19

Ввод
34282 19448

Вывод программы Сергея в FPwin 2.2.0
111136624006178630

Вывод программы Сергея в TP(при добавлении директив {$e+,n+})
и авторский ответ, полученный решением приведенным ниже, тоже в TP
111136624006178628

{$N+}
program sol;
var
  n,m: comp;
begin
  read(n,m);
  writeln((n*(n+1)/2)*(m*(m+1)/2):0:0);
end.


Авторское решение (использующее тип comp, а не extended) при отсылке на FP Win,
как ни странно, также дает ДРУГОЙ ответ
111136624006179000

UPD. Получается,
наиболее точные (правильные) ответы у TP типы extended и comp.
средний по точности FP Win тип extended (10 байтов на число)
худший по точности FP Win тип comp (8 байтов на число).

UPD2: Правильное решение для FP Win

var
  n,m,s : qword;
begin
  read(n,m);
  s:=(1+n)*(1+m)*n*m div 4;
  writeln(s);
end.



Терентий Гацуков

Темы: 1
Сообщений: 43

Мой профиль
Олимпиады по информатике\Реализация\Строки\09_COCI5 - "LJESNJAK" 92324
Моё решение проходит на Turbo Pascal,а на Delphi 7 и FP Win32 v2.2.0 не проходит!

Вот мой код.


var
  s,p,o,k,l,h,g,f : string;
  Kx              : longint;
begin
  readln(s);
  Kx:=0;
  while pos('c=',s)<>0 do begin delete(s,pos('c=',s),2); inc(Kx,1); end;
  while pos('c-',s)<>0 do begin delete(s,pos('c-',s),2); inc(Kx,1); end;
while pos('dz=',s)<>0 do begin delete(s,pos('dz=',s)-1,3); inc(Kx,1); end;
  while pos('d-',s)<>0 do begin delete(s,pos('d-',s),2); inc(Kx,1); end;
  while pos('lj',s)<>0 do begin delete(s,pos('lj',s),2); inc(Kx,1); end;
  while pos('nj',s)<>0 do begin delete(s,pos('nj',s),2); inc(Kx,1); end;
  while pos('s=',s)<>0 do begin delete(s,pos('s=',s),2); inc(Kx,1); end;
  while pos('z=',s)<>0 do begin delete(s,pos('z=',s),2); inc(Kx,1); end;
  writeln(Kx+(length(s)));
end.


30.3 13:03 09_COCI5. LJESNJAK 18 / 30 не пройден 4-й тест(снято по времени (>2 сек)) PASCAL.PAS DelTA3 at Nit4 FP Win32 v2.2.0

30.3 13:01 09_COCI5. LJESNJAK 18 / 30 не пройден 4-й тест(снято по времени (>2 сек)) PASCAL.PAS DelTA3 at Nit4 Delphi 7

30.3 13:01 09_COCI5. LJESNJAK 30 / 30 Все тесты успешно пройдены PASCAL.PAS DelTA3 at Nit4 Turbo Pascal 7.0

Почему одно и тоже решение проходит на Turbo Pascal, а на FP Win32 v2.2.0 и Delphi 7 нет??
(Конкретно интересует компилятор FP Win32 v2.2.0)


А этот код проходит на всех 3 компиляторах.

var
  w,q : string;
  s,p : string;
  d,i : longint;
  Kx  : longint;
begin
  readln(s);
  i:=1; d:=length(s); p:='';
  while (i<=d) do
    begin
      q:=copy(s,i,2);
      w:=copy(s,i,3);
      if w='dz=' then begin inc(i,3); inc(Kx); end else
      if q='c=' then begin inc(i,2);inc(Kx);end else
      if q='c-' then begin inc(i,2);inc(Kx);end else
      if q='d-' then begin inc(i,2);inc(Kx);end else
      if q='lj' then begin inc(i,2);inc(Kx);end else
      if q='nj' then begin inc(i,2);inc(Kx);end else
      if q='s=' then begin inc(i,2);inc(Kx);end else
      if q='z=' then begin inc(i,2);inc(Kx);end else
      begin inc(kX); inc(i); end;
    end;
  writeln(Kx);
end.

Виктор Терещук

Темы: 0
Сообщений: 1

Мой профиль
Почему одно и тоже решение проходит на Turbo Pascal, а на FP Win32 v2.2.0 и Delphi 7 нет??
(Конкретно интересует компилятор FP Win32 v2.2.0)  


Ответ очевиден. Причина в этой строке:
while pos('dz=',s)<>0 do begin delete(s,pos('dz=',s)-1,3); inc(Kx,1); end;

Если 'dz=' находится в начале строки, то никогда не сможет приведенным кодом оттуда удалиться. Странно не то, что этот код не работает на Delphi и Free Pascal, а то, что он работает на Turbo Pascal.
Терентий Гацуков

Темы: 1
Сообщений: 43

Мой профиль
Задачи из лекций Долинского М.С.\Лекция 19\Л19_8 - "Симметричное отображение" 639

Моё решение проходит на Tp , а на Fp и Delphi 7 нет!

Вот моё решение.

var
  x1,y1,x2,y2,x0,y0,A,B,C,A1,B1,C1 : real;

  procedure Per(A,B,C,x,y : real; var A1,B1,C1 : real);
    begin
      A1:=-B;
      B1:=A;
      C1:=B*x-A*y;
    end;

  procedure Tp(A,B,C,A1,B1,C1 : real; var x,y : real);
    var
      d,dx,dy : real;
    begin
      C:=-C; C1:=-C1;
      d:=A*B1-A1*B;
      dx:=C*B1-C1*B;
      dy:=A*C1-A1*C;
      x:=dx/d;
      y:=dy/d;
    end;

  procedure EndOtr(x1,y1,x0,y0 : real; var x2,y2: real);
    begin
      x2:=2*x0-x1; y2:=2*y0-y1;
    end;

begin
  assign(input,'input.txt'); reset(input);
  assign(output,'output.txt'); rewrite(output);
  readln(x1,y1);
  readln(A,B,C);
  Per(A,B,C,x1,y1,A1,B1,C1);
  Tp(A,B,C,A1,B1,C1,x0,y0);
  EndOtr(x1,y1,x0,y0,x2,y2);
  writeln(x2:0:2,' ',y2:0:2);
  close(input); close(output);
end.


В Tp даёт ответ 0.00 0.00, а в Delphi 7 и Fp 0.00 -0.00

11.4 14:40 Л19_8. Симметричное отображение 66 / 100 не пройден 3-й тест (неверный ответ) PASCAL.PAS DelTA3 at DLServer Delphi 7
11.4 14:33 Л19_8. Симметричное отображение 66 / 100 не пройден 3-й тест (неверный ответ) pascal.pas DelTA3 at DLServer FP Win32 v2.2.0
11.4 14:32 Л19_8. Симметричное отображение 100 / 100 Все тесты успешно пройдены PASCAL.PAS DelTA3 at DLServer Turbo Pascal 7.0
Почему одно и тоже решение проходит на Turbo Pascal, а на FP Win32 v2.2.0 и Delphi 7 нет?
(Конкретно интересует компилятор FP Win32 v2.2.0)


UPD.

var
  x1,y1,x2,y2,x0,y0,A,B,C,A1,B1,C1 : real;

  procedure Per(A,B,C,x,y : real; var A1,B1,C1 : real);
    begin
      A1:=-B;
      B1:=A;
      C1:=B*x-A*y;
    end;

  procedure Tp(A,B,C,A1,B1,C1 : real; var x,y : real);
    var
      d,dx,dy : real;
    begin
      C:=-C; C1:=-C1;
      d:=A*B1-A1*B;
      dx:=C*B1-C1*B;
      dy:=A*C1-A1*C;
      x:=dx/d;
      y:=dy/d;
    end;

  procedure EndOtr(x1,y1,x0,y0 : real; var x2,y2: real);
    begin
      x2:=2*x0-x1; y2:=2*y0-y1;
    end;

begin
  assign(input,'input.txt'); reset(input);
  assign(output,'output.txt'); rewrite(output);
  readln(x1,y1);
  readln(A,B,C);
  Per(A,B,C,x1,y1,A1,B1,C1);
  Tp(A,B,C,A1,B1,C1,x0,y0);
  EndOtr(x1,y1,x0,y0,x2,y2);
  if abs(x2)<0.001 then x2:=0.0;
  if abs(y2)<0.001 then y2:=0.0;
  writeln(x2:0:2,' ',y2:0:2);
  close(input); close(output);
end.


А этот код на всех 3 копмиляторах проходит
 
Индекс форума ->Олимпиадное программирование ->Обсуждение теории 1, 2
Time:0,049