Найти слово максимальной (минимальной) длины. Turbo Prolog

      Комментарии к записи Найти слово максимальной (минимальной) длины. Turbo Prolog отключены

Главная Форумы Программирование Помощь с решением задач на Prolog Задачи на строки и файлы Найти слово максимальной (минимальной) длины. Turbo Prolog

В этой теме 1 ответ, 1 участник, последнее обновление  Васильев Владимир Сергеевич 2 года/лет, 3 мес. назад.

  • Автор
    Сообщения
  • #1939

    questioner
    Участник

    Помогите пожалуйста. Задачка такая:

    Создайте предикат, находящий в исходной строке слово максимальной (минимальной) длины.

    Программу написал, но в ней есть ошибка. Проблема в том, что если я введу, например, 33yyy, то программа разобьет это слово на два — «33» и «yyy». Она работает так только тогда, когда числа стоят перед буквами. Помогите исправить.

    predicates
      getMaxMin(string,integer,integer)
      max_min(integer,integer,integer,integer,integer)
     
    clauses
      getMaxMin(Str,Max,Min):-
        fronttoken(Str,Word,Rest),!,
        getMaxMin(Rest,Ma,Mi),str_len(Word,Len),
        max_min(Ma,Mi,Len,Max,Min).
     
      getMaxMin(_,0,9999):-!.
     
      max_min(0,9999,Len,Len,Len):-!.
      max_min(Ma,Mi,Len,Len,Mi):-
        Len>Ma,!.
      max_min(Ma,Mi,Len,Ma,Len):-
        Len<Mi,!.
      max_min(Max,Min,_,Max,Min).
     
    goal
      clearwindow,
      readln(Str),
      fronttoken(Str,_,_),
      getMaxMin(Str,Max,Min),
      write("samoe dlinnoe ", Max, "\nsamoe korotkoe ",Min).

    Для разбиения строки на слова я использую стандартный front_token.

  • #1940

    Описание задачи начни с описания того, что ты считаешь словом. Разработчики Turbo Prolog и Visual Prolog решили, что слово содержит либо слова, либо буквы, но не все сразу.
    Чтобы решить задачу ты можешь преобразовать свою строку в список символов, затем получить из него список слов. После этого, задача решается гораздо проще:

    find_longest_word([FirstWord|OtherWords], LongestOtherWord):-
      find_longest_word(OtherWords, LongestOtherWord),
      length(LongestOtherWord, LengthLongestOtherWord),
      length(FirstWord, LengthFirstWord), 
      LengthLongestOtherWord > LengthFirstWord, !.
    find_longest_word([FirstWord|_OtherWords], FirstWord).
    

    Функция разделяет исходный список на перво слово (FirstWord) и остальные (OtherWords). Выполняет рекурсивный поиск самого длинного слова (LongestOtherWord) среди OtherWords, определяет его длину (предикатом length) и сравнивает с длиной первого слова. В зависимости от результатов сравнения возвращает либо первое слово, либо слово, вычисленное рекурсивно.

Для ответа в этой теме необходимо авторизоваться.