(1 курс ФИИТ) CS101. Основы программирования — практика

function ElementWithLastChar(seq: sequence of string; C: char): string;
begin
  Result := seq.Where(x -> x[x.length] = C).DefaultIfEmpty('').First;
  if not (Result = '') and not 
    (seq.Where(x -> x[x.length] = C).DefaultIfEmpty('').Last = Result) then
    Result := 'error';
end;

Ну, я попробую…

Ну это как-то криво и не использует указанных там методов… да и два раза писать длиннющую конструкцию это фейл.

а можно использовать только те 4 и больше никаких? (3 из них использованы были)

Предлагаю посоревноваться в количестве вызовов методов (можно считать символ .). Скажем так, с помощью тех методов можно решить за 5 вызовов, а у вас 6. Ну, не говоря о том, что текста будет намного меньше.

Если 4 это Skip, Any, DefaultIfEmpty, Last, то у вас использовано не 3, а 2 из них.

Точно. Что-то я криво и написал, и посчитал

то, что написал на практике(не увидел Без использования исключений)[методов 4]

function FExtra2(c: char; A: sequence of string): string;
begin
  var k:=a.Where(x->x.EndsWith(c));
  if k.count>1 then Result:='Error'
  else Result:= k.DefaultIfEmpty('').Last
  
end;  

то, что пришло в голову с данными методами(5шт), но SkipWhile

   function HappyOrMayBeUnHappyUlysses(c: char; alpha: sequence of string): string;
    begin
      if alpha.Any(x->x.EndsWith(c)) then
      begin
        Result:=alpha.Last(x->x.EndsWith(c));
        if alpha.SkipWhile(x->x.EndsWith(c)).Skip(1).Any(x->x.EndsWith(c)) then Result:='Error';
      end;
    end;

Там, где написано «без case» имелось ввиду «без использования длины (Count)», я исправлю. Так что первый вариант не подходит (он не сильно отличается от варианта с case).

Второй вариант уже весьма близок к истине, особенно в части Skip(1).Any(). В общем, мой вариант такой:

  var b := a.Where(s -> s.endswith(c));
  if b.Skip(1).Any then
    result := 'Error'
  else 
    result := b.FirstOrDefault;
function NumOfStrings2(s: sequence of string; c: char): string;
begin
  if s.Any(x -> x.Last = c) then
    if s.SkipWhile(x -> x.Last = c).Any(x -> x.Last = c) then
      Result := 'Error'
    else
      Result := s.First(x -> x.Last = c)
  else
    Result := '';
end;

А так?

Ну, после публикации моего ответа вы уже можете сами сравнить :grinning:

Эм, Артем Михайлович, "Без использования длины последовательности, полученной после фильтрации, или использования исключений." Также изначально у Вас было “Без использования исключений”, как я понял, это where

Я не понял, что не так. Where не имеет отношения к исключениям.

Под исключениями Вы имели в виду Except? Но его же нет смысла там использовать. Или что-то другое?

Давайте так: если вы не знаете, что такое исключения, то просто забудьте про это. Я не буду тут в форме поста на форуме пытаться вам объяснять, что такое исключения, это длинная история. Решение этой задачи на основе других методов последовательностей и исключений можно найти в интернете, потому я и дописал такое ограничение, ведь исключений мы ещё официально не проходили. Да и решение мне не нравится.

Опубликовано очередное домашнее задание.

Есть вопрос по обработке последовательностей. Есть некоторые проблемы с DefaultIfEmpty. Вот пример:

function LastStrStartsWithDigLengthL(L: integer; A: sequence of string): string;
begin
  
  Assert(L > 0, 'L должно быть больше 0');
  
  Result := A.Where(x -> (x.Length = L) and x.First.IsDigit).DefaultIfEmpty('Not found').Last;
  
end;

Так работает. А если поменять местами Last и DefaultIfEmpty, то возникает ошибка Нельзя преобразовать тип IEnumerable<char> к string

Если поменять местами, то DefaultIfEmpty будет применяться к значению типа string (его возвращает Last), что недопустимо: судя по сообщению, string не является экземпляром последовательности (IEnumerable) в текущей версии PABC, а метод DefaultIfEmpty есть только у последовательностей. Это, кроме того, делает возможным получение ошибки (если Last будет применён к пустой последовательности).

@Molkree Сегодня узнал от @Admin, что всё же преобразовывать строку к sequence of char и применять методы пеоследовательностей можно. Я не разобрался с вашей ошибкой: она происходит от того, что нельзя делать наоборот — преобразовывать sequence of char к string (во всяком случае, неявно, то есть без вызовов дополнительных методов). В вашем случае defaultifempty вернёт sequence, а result — типа string.

Опубликовано ДЗ 3.

В субботу контрольная работа по всем темам до неё.

Сегодня у многих не работал код

function CountNonEmpty(fname) := ReadLines(fname).Count(x -> x != '');

Работает, если явно написать тип возвращаемого значения функции.

function CountNonEmpty(fname): integer := ReadLines(fname).Count(x -> x = '');

Нам там надо было посчитать пустые строки.

Мы кстати догадались, что нужно явно указать, у нас заработало.

P.S. Мне кажется, что в Паскале не работает ‘!=’, только ‘<>’. Пишет, что неожиданный символ