2014 dxdy logo

Научный форум dxdy

Математика, Физика, Computer Science, Machine Learning, LaTeX, Механика и Техника, Химия,
Биология и Медицина, Экономика и Финансовая Математика, Гуманитарные науки




Начать новую тему Ответить на тему На страницу Пред.  1, 2, 3, 4, 5, 6  След.
 
 Re: Задача по ссылке от Munin
Сообщение28.02.2013, 23:55 
Заслуженный участник
Аватара пользователя


06/10/08
6241
Да, видимо во входном файле есть перевод строки в конце. Просто обрабатывайте '\n' так же, как пробел

 Профиль  
                  
 
 Re: Задача по ссылке от Munin
Сообщение01.03.2013, 00:04 


05/09/12
2572
Спасибо, наконец-то он прожевал мой код :-) Просто я не подозревал что в корректной входной строке будут ещё '\r' и '\n'....

ЗЫ странно, по времени победил лидера, а по памяти нет.... Сейчас ещё уберу лишний массив...
Не помогло :-) Вообще интересно, как он считает используемую память?
Скачал код лидера (фактически он на С, там навскиду никаких С++ особенностей не встречается) - взглянул пару секунд и закрыл - такая лаконичность и красота (по первому впечатлению), что не хотел разбираться в нем раньше того, как сам ещё подумаю над оптимальным алгоритмом :-)

 Профиль  
                  
 
 Re: Задача по ссылке от Munin
Сообщение01.03.2013, 04:41 


05/09/12
2572
После нескольких безуспешных попыток улучшить количественные оценки кода - скорость и память, возникают вопросы: а как они, собственно, считаются?

Время выполнения - я понимаю как количество тактов процессора при данной частоте. На каждую операцию однозначное количество тактов (в EEPROM не пишем). Судя по АВР отладчику я заметно уменьшил такты, а время не изменилось.

Память - вообще непонятно. Какая память считается? Флеш где лежит сам код, его объем? Или использование ОЗУ + стек? Я в последней редакции максимально ужался - использую всего один массив 158 байт (при этом корректно обрабатывается максимальная входная строка в 80 символов!) и несколько переменных, никаких рекурсий и нарастания стека. У меня этот алгоритм влезет со свистом в самый маленький по ОЗУ микроконтроллер. Откуда взялась цифра 214 Кб?

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

 Профиль  
                  
 
 Re: Задача по ссылке от Munin
Сообщение01.03.2013, 07:37 
Заслуженный участник


06/07/11
5570
кран.набрать.грамота
_Ivana в сообщении #689384 писал(а):
После нескольких безуспешных попыток улучшить количественные оценки кода - скорость и память, возникают вопросы: а как они, собственно, считаются?
Я думаю, этот вопрос надо владельцу/админу сайта задавать, вряд ли кто-то здесь ответит.
Я, кстати, тоже пытался сдать свою задачу (только другую, про палиндромы, и на паскале), у меня на компе все работает, а там - нет. Плюнул и пошел спать.

 Профиль  
                  
 
 Re: Задача по ссылке от Munin
Сообщение01.03.2013, 08:29 


05/09/12
2572

(Оффтоп)

Админу сайта я написал, но что-то подсказывает мне что я могу не дождаться ответа и тем более каких то комментариев. Я думал просто обсудить этот момент, а еще может вдруг у кого есть возможность как-нибудь протестировать код на скорость\память, я бы дал свой и тот который скачал оттуда, получили бы более адекватные цифры... Хотя, кому это надо?... Просто если мотивация опередить другие алгоритмы, соревновательный момент, зарубается вот так на корню из-за непонятной и сомнительной системы распределения мест, то пропадает всякое желание и энтузиазм. Буду соревноваться в других областях - в скоростном беге на коньках, например :-)

 Профиль  
                  
 
 Re: Задача по ссылке от Munin
Сообщение01.03.2013, 09:33 
Заслуженный участник


06/07/11
5570
кран.набрать.грамота

(Оффтоп)

_Ivana в сообщении #689406 писал(а):
Буду соревноваться в других областях - в скоростном беге на коньках, например :-)
Я в прошлые выходные участвовал в альпинистском двоеборье - лыжная гонка 15 км и скалолазание. Я вам так скажу: если хотите побеждать - лучше программируйте...

 Профиль  
                  
 
 Re: Задача по ссылке от Munin
Сообщение01.03.2013, 15:08 


05/09/12
2572
Задача про максимальный палиндром имхо вообще для школьников. Непонятно, за что там давать 15 баллов, когда за сабжевую задачу топика дают 10. Вот мой код, который работает на http://liveworkspace.org и по традиции не работает на сайте с задачами :-) Конечно, для гарантии хорошо быть вставить пару проверок - невыходы за границы массива.
код: [ скачать ] [ спрятать ]
Используется синтаксис C++
#include <iostream>

int main(void)
{
   char in_str[100001];
        int len=0, max_len=0;
        char *p_in, *p_l, *p_r, *p_res;
       
        std::cin >> in_str;
        p_in = in_str; p_res = in_str;
        while (*p_in) {
                p_l = p_in; p_r = p_in + 1; len = 0;
                while (*p_l-- == *p_r++) {len++;} len = len<<1;
                if (len > max_len) {max_len = len; p_res = p_l+2;}

                p_l = p_in - 1; p_r = p_in + 1; len = 0;
                while (*p_l-- == *p_r++) {len++;} len = (len<<1)+1;
                if (len > max_len) {max_len = len; p_res = p_l+2;}

                p_in++;
        };     
        for (len=0;len<max_len;len++) {std::cout << *p_res++;}
   
   return 0;
}
 
Но я пока не планирую глубоко разбираться в С++ и особенностях класса string, а на С там компилятора нет, поэтому придется или искать другой сайт подобного рода, который принимает С код, или обувать таки коньки :lol: Если только вдруг Munin не даст задачку с аналогичного С-шного сайта :-)

 Профиль  
                  
 
 Re: Задача по ссылке от Munin
Сообщение01.03.2013, 23:56 


05/09/12
2572
Вести с полей :-)
Путем насилия упомянутого сайта удалось выяснить:
- время выполнения включает время ввода-вывода и зависит от организации и библиотеки последнего.
- количество Кб памяти - объем слинкованного файла вместе с подгружаемыми библиотеками.
- можно использовать тамошний С++ компилятор, но подсовывать ему чистый С код, со своей библиотекой stdio - это уменьшает объем, но увеличивает время.
- на ОЗУ и время выполнения к каждой задаче даются свои ограничения (выше условия), но они там имхо более чем щедрые - например, зря я уложился в 200 Байт - мог бы использовать все
Цитата:
Ограничение памяти: 65536КБ
- это никак не влияет на ранжирование результата :lol:

 Профиль  
                  
 
 Re: Задача по ссылке от Munin
Сообщение02.03.2013, 13:50 


05/09/12
2572

(Оффтоп)

Провел тест - специально сделал ошибку в тексте скачанной программы лидера (только не приводящую к ошибке компиляции, а только к неправильному ответу) - и отправил его от своего имени на сайт :-) Казалось бы, зачем? У меня возникли сомнения, и я их подтвердил. Код с ошибочным результатом не помещается в список решений, зато помимо сообщения об ошибке выдается и время выполнения и размер файла. Так вот, сейчас код лидера имеет показатели: время 0.0014 сек, память 218 КБ. А на момент когда этот код занял первое место (01.03.2011), было: 0.0016 сек / 122 КБ. В коде стоит
Код:
#include <iostream>
#include <string>
Я полагаю, что с того времени обновилась и существенно выросла одна или обе библиотеки и немножко убыстрилось железо сервера. Получается, что если сейчас использовать стандартные библиотеки, то нереально превзойти лидера в принципе. Кстати, лучший мой код имеет показатели 0.0013 сек / 214 КБ (видно на странице статистики по задаче), и капельку, но превосходит настоящие (на текущий момент) лидерские.

По-хорошему, надо бы выдрать из iostream или stdio нужные функции, обрезать их по максимуму только для работы с файлами и поместить прямо в код, ничего не прилинковывая, и выкладывать такие решения. Или найти и сразу прилинковать старую короткую версию iostream. Вот на такие мысли навел меня результат моего нехитрого теста...

 Профиль  
                  
 
 Re: Задача по ссылке от Munin
Сообщение02.03.2013, 13:55 
Заслуженный участник
Аватара пользователя


30/01/06
72188

(Оффтоп)

Можете написать всё это админу...

 Профиль  
                  
 
 Re: Задача по ссылке от Munin
Сообщение02.03.2013, 14:18 


05/09/12
2572

(Оффтоп)

Админ или не получает или игнорирует мои письма, так что пусть и дальше пребывает в благоденствии. Если будет интерес, я сделаю себе короткую библиотеку ввода/вывода и пошлю с ней. И вообще, раз тема про алгоритмы - я придумал алгоритм потеснения лидера:
1) пишем любое, самое неоптимальное, но верное решение задачи
2) отправляем его, получаем возможность скачать код лидера
3) перерабатываем его немного, чтобы не выглядел плагиатом, и отправляем с короткими и быстрыми процедурами ввода/вывода - получаем код меньше и быстрее лидерского

 Профиль  
                  
 
 Re: Задача по ссылке от Munin
Сообщение03.03.2013, 14:11 
Заслуженный участник


28/04/09
1889
Xaositect
Xaositect в сообщении #688915 писал(а):
У EtCetera какой-то из диалектов пролога. Сначала классифицируем все символы на скобки, идендификаторы и операторы, потом для списка таких токенов строим синтаксическое дерево (задаваемое типом Operation). Для этого рассматриваем список слева направо как последовательность, разделенную операторами малого приоритета (+-), каждый элемент этой последовательности как последовательность, разделенную операторами */, а на нижнем уровне операнд - либо идентификатор, либо аналогичное выражение в скобках.
Удивительно точное описание!
Остается только добавить, что используемый вариант пролога $\text{---}$ Visual Prolog (для компиляции применялась одноименная среда старенькой, кажется, 5-ой, версии).

 Профиль  
                  
 
 Re: Задача по ссылке от Munin
Сообщение03.03.2013, 14:17 


05/09/12
2572
Меня Xaositect в этой теме вообще поражает способностью быстро и точно разбираться в чужих кодах на самых разнообразных языках :shock:

 Профиль  
                  
 
 Re: Задача по ссылке от Munin
Сообщение03.03.2013, 19:35 
Заслуженный участник


11/05/08
31889
Такой тупой-тупой вариант. Конечно, никто так не пишет, это даже и неприлично, тем не менее: безо всяких деревьев и рекурсий. Ловля ошибок -- неполная: допускает записи типа A*B(+C), интерпретируя их как A*(B+C).

код: [ скачать ] [ спрятать ]
Используется синтаксис Pascal
var  prg: string;                        { Исходое выражение            }
     wrk: string;                        { Поток накопленных фрагментов }
     af:  array[#128..#255] of byte;     { Адреса фрагментов в потоке   }
     lastc:  char;                       { Код последнего фрагмента     }
     lev: string;                        { Уровни вложенности           }

{-------------------------------------------------------------------}
procedure stop(i: integer);
begin    writeln('!!!  Error  ', i, '  !!!');    readln;    Halt;    end;
{-------------------------------------------------------------------}
{-------------------------------------------------------------------}
function getfrg(c: char): string;
{ Извлекает из потока  wrk  фрагмент с кодом  c }
var  i,k: integer;
begin
  i:=af[c];                      k:=ord(wrk[i]);
  getfrg:=Copy(wrk, i+1, k);     Delete(wrk, i, k+1);
  for c:=#128 to #255 do
    if af[c]>i  then dec(af[c], k+1);
end;
{-------------------------------------------------------------------}
procedure insfrg(frg: string);
{ Добавляет в конец потока  prg  фрагмент  frg  с кодом  lastc+1 }
var  i: integer;
begin
  inc(lastc);    af[lastc]:=length(wrk)+1;
  wrk:=wrk + frg[0] + frg;
  end;
{-------------------------------------------------------------------}
function findop(currlev: integer; op: char): boolean;
{ Находит на текущем уровне первую операцию с приоритетом op ('*' / '+') }
{ Заносит в поток  wrk  фрагмент выходного кода для этой операции        }
{ Удаляет из потока фрагмент, на которые ссылались операнды              }
{ Заменяет в исходной  prg  операцию с операндами на код её фрагмента    }
var  i: integer;    s1,s2: string;     c: char;
begin
  findop:=false;
  for i:=1 to length(prg) do begin
    if currlev<>ord(lev[i]) then continue;
    c:=prg[i];
    if (op='*') and (c<>'*') and (c<>'/')  then continue;
    if (op='+') and (c<>'+') and (c<>'-')  then continue;
    if (i=1) or (i=length(prg)) then stop(2);
    if prg[i-1] in ['a'..'z', 'A'..'Z']   then s1:=prg[i-1]
      else if prg[i-1]>=#128   then s1:=getfrg(prg[i-1])
      else stop(2);
    if prg[i+1] in ['a'..'z', 'A'..'Z']   then s2:=prg[i+1]
      else if prg[i+1]>=#128   then s2:=getfrg(prg[i+1])
      else stop(2);
    s2:='(' + s1 + ',' + s2 + ')';
    case c of
      '*':  s1:='MUL';     '/':  s1:='DIV';
      '+':  s1:='ADD';     '-':  s1:='SUB';
      else;   end;
    insfrg(s1 + s2);
    Delete(prg, i, 2);    prg[i-1]:=lastc;
    Delete(lev, i, 2);
    findop:=true;    break;
  end;
end;
{-------------------------------------------------------------------}

var  inp,out: string;
     i,k: integer;
     maxlev: integer;

begin

  inp:='y-(a*s/t-(h+A/f*r/c))*((((b-m))))';

  {---------- Определяем уровни вложенности: ----------}
  k:=0;        maxlev:=0;
  prg:=inp;    lev:=inp;
  for i:=1 to length(prg) do begin
    if prg[i]='(' then inc(k);
    if prg[i]=')' then dec(k);
    if k<0 then stop(1);
    if maxlev<k then maxlev:=k;
    lev[i]:=char(k);
  end;
  {---------- Удаляем скобки - они больше не нужны: ----------}
  i:=1;
  while i<=length(prg) do
    if (prg[i]='(') or (prg[i]=')')
      then begin    Delete(prg, i, 1);    Delete(lev, i, 1);    end
      else inc(i);
  {---------- Собственно парсинг: }
  lastc:=#127;
  wrk:='';
  for k:=maxlev downto 0 do begin
    while findop(k, '*') do;
    while findop(k, '+') do;
  end;
  if prg<>lastc then stop(3);
  out:=getfrg(lastc);

  writeln(#177, inp, #177);
  writeln(#177, out, #177);
  readln;
end.

 

 Профиль  
                  
 
 Re: Задача по ссылке от Munin
Сообщение03.03.2013, 19:59 
Заблокирован
Аватара пользователя


07/08/06

3474
Это задача на знание "обратной польской записи", по-моему. По крайней мере, я бы решал только так :-)

 Профиль  
                  
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 89 ]  На страницу Пред.  1, 2, 3, 4, 5, 6  След.

Модераторы: Toucan, maxal, PAV, Karan, Супермодераторы



Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group