Автор Тема: Раскручиваем компилятор O7  (Прочитано 40703 раз)

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #45 : Ноябрь 07, 2013, 06:10:40 am »
PPS.
тьфу, вот так, (  & ok  можно выкинуть)
RETURN (i = JsString.len(s))

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #46 : Ноябрь 07, 2013, 07:44:31 am »
Тесты проходят. Но он страшный. Поэтому уверенности нет. Хотелось одобрения экспертов.
Не знаю, как там эксперты, а я не одобряю.
И метод разработки (метод тыка) и результат - ужасны.
Как при таком методе получилось нечто работоспособное - для меня большая загадка.

Вот что дает осмысленное проектирование.
Кому надо, перепишет с C# на смесь JS и Оберона:
    static bool isReservedWorld(string s, string words) {
      int i = 0, w = 0;
      bool prevEq = true;
      while (true) {
        if (prevEq && (w < words.Length) && (i < s.Length) && (words[w] == s[i])) {
          w++;
          i++;
        } else if (prevEq && (w < words.Length) && (i < s.Length) && /*это избыточно*/ (words[w] != s[i])) {
          prevEq = false;
          i = 0;
        } else if (w < words.Length && !prevEq) {
          if (words[w] == ' ') {
            prevEq = true;
          }
          w++;
        } else {
          break;
        }
      }
      return i == s.Length;
    }

По поводу цикла Дейкстры - два наблюдения. Не помню, были ли они раньше.
1. Во многих случаях ЦД - это смешение разных уровней абстракций. И это плохо.
2. Во много благодаря п.1 ЦД весьма похож на реализацию конечного автомата. Только состояния здесь обычно не вводятся явно, а вычисляются из переменных на каждом шаге. Отсюда - неэффективность. Тоже плохо.

p.s. забыл отметить, что ключевые слова должны быть разделены ровно одним пробелом.
« Последнее редактирование: Ноябрь 07, 2013, 07:47:21 am от Peter Almazov »

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #47 : Ноябрь 07, 2013, 07:59:47 am »
2 Peter.
В ситуации, когда
prevEq && (w < words.Length) && (i = s.Length)
но words[w] не пробел , то ошибка

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #48 : Ноябрь 07, 2013, 11:21:51 am »
Ага, прощёлкал. Сосредоточился на цикле, а возврат оставил как в оригинале.
Надо заменить:

return i == s.Length;
на
return i == s.Length && (w == words.Length || words[w] == ' ');

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #49 : Ноябрь 07, 2013, 11:47:19 am »
2 Peter
Нет, здесь в цикле недочёт.  Уходит преждевременно на break, при тех условиях, что я указал.


albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #50 : Ноябрь 07, 2013, 11:57:08 am »
PS.
К примеру ищем в строке слово "ON".
Наткнулись на  "ONE" и вышли, а далее в строке может всё же есть "ON"

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #51 : Ноябрь 07, 2013, 12:35:11 pm »
PPS.
Конечно, если слова в строке отсортированы, то проблем в цикле нет.

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #52 : Ноябрь 07, 2013, 12:45:36 pm »
Я считал, что отсортированы.
Иначе на каждый чих - полный проход по всем словам.
Алгоритм и без того дурацкий.

Valery Solovey

  • Hero Member
  • *****
  • Сообщений: 509
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #53 : Ноябрь 07, 2013, 12:50:37 pm »
WHILE (i < JsString.len(s)) & (w < JsString.len(words)) DO
WHILE (w < JsString.len(words)) & (i < JsString.len(s)) & (JsString.at(words, w) = JsString.at(s, i)) DO
INC(w); INC(i)
END

IF i < JsString.len(s) THEN
i := 0;
WHILE (w < JsString.len(words)) & (JsString.at(words, w) # " ") DO
w := w + 1
END;
WHILE (w < JsString.len(words))& (JsString.at(words, w) = " ") DO
w := w + 1
END
END
END;
RETURN i = JsString.len(s)

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #54 : Ноябрь 07, 2013, 03:35:28 pm »
Тесты проходят. Но он страшный. Поэтому уверенности нет. Хотелось одобрения экспертов.
Не знаю, как там эксперты, а я не одобряю.

Да, я вот как раз ждал твоего веского слова :)

И метод разработки (метод тыка) и результат - ужасны.

Дык, ошибка-то есть? А то не очень просто делать дифф с  твоим шарповым вариантом. При том, что он в той же степени нечитаем (при том, что я не ставлю под сомнение осмысленное проектирование).

Как при таком методе получилось нечто работоспособное - для меня большая загадка.

Тесты спасают. Когда нужно получить что-то работоспособное, но непонятно как.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #55 : Ноябрь 07, 2013, 03:38:34 pm »
PS.
К примеру ищем в строке слово "ON".
Наткнулись на  "ONE" и вышли, а далее в строке может всё же есть "ON"

Кстати, именно эту ошибку мне пришлось исправить в процессе отладки моего цикла.

vlad

  • Hero Member
  • *****
  • Сообщений: 1391
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #56 : Ноябрь 07, 2013, 03:40:00 pm »
Кстати, именно эту ошибку мне пришлось исправить в процессе отладки моего цикла.

там есть IF и ELSIF

Peter Almazov

  • Sr. Member
  • ****
  • Сообщений: 482
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #57 : Ноябрь 07, 2013, 03:51:13 pm »
Дык, ошибка-то есть?
Во всяком случае, я не в состоянии ее найти :)

Хотя, все зависит от того, что считать ошибкой...

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #58 : Ноябрь 07, 2013, 05:39:51 pm »
Если не зацикливаться на ЦД :)
Рефакторинг исходного кода с такими ограничениями на строку слов:
слова отсортированы,
между словами один пробел,
после последнего слова тоже стоит пробел

PROCEDURE isReservedWorld(s: JsString.Type; words: JsString.Type): BOOLEAN;
VAR
    i, w, w0: INTEGER;

BEGIN
    i := 0 ;
    w := 0 ;
    w0:= 0 ;
    WHILE (w < JsString.len(words))
        & ((i < JsString.len(s)) OR (JsString.at(words, w) # " ")) DO
        IF (i < JsString.len(s)) & (JsString.at(words, w0) = JsString.at(s, i)) THEN
          INC(w); w0 := w;
          INC(i);
        ELSIF (JsString.at(words, w) # " ") THEN
          INC(w);
        ELSE
          INC(w); w0 := w;
          i := 0;
        END;
    END;
    RETURN (w < JsString.len(words))
END isReservedWorld;

PS.
проверять лень :)
« Последнее редактирование: Ноябрь 07, 2013, 05:41:24 pm от albobin »

albobin

  • Full Member
  • ***
  • Сообщений: 198
    • Просмотр профиля
Re: Раскручиваем компилятор O7
« Ответ #59 : Ноябрь 07, 2013, 06:20:23 pm »
описка:
в условии WHILE
не
... OR (JsString.at(words, w) # " ")) DOа
... OR (JsString.at(words, w0) # " ")) DO
PS.
Как же тяжко писать много букафф, вместо просто  $d(words(s)) как в МУМПСе  :)