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;
Предлагаю посоревноваться в количестве вызовов методов (можно считать символ .). Скажем так, с помощью тех методов можно решить за 5 вызовов, а у вас 6. Ну, не говоря о том, что текста будет намного меньше.
то, что написал на практике(не увидел Без использования исключений)[методов 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;
Эм, Артем Михайлович, "Без использования длины последовательности, полученной после фильтрации, или использования исключений."
Также изначально у Вас было “Без использования исключений”, как я понял, это where
Давайте так: если вы не знаете, что такое исключения, то просто забудьте про это. Я не буду тут в форме поста на форуме пытаться вам объяснять, что такое исключения, это длинная история. Решение этой задачи на основе других методов последовательностей и исключений можно найти в интернете, потому я и дописал такое ограничение, ведь исключений мы ещё официально не проходили. Да и решение мне не нравится.
Есть вопрос по обработке последовательностей. Есть некоторые проблемы с 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.