Помощь новичкам

В задаче было сказано, что надо упорядочить элементы именно самого массива, а не просто получить результат на выводе. Ну и половин-то две… А в целом идея с очередью мне очень понравилась!

Попробую поэкспериментировать. Может, удастся написать код короче, чем у меня получился.

Метод Average с функцией преобразования n -> n * n выдаёт ошибку. А последовательное применение методов Select(n -> n * n).Average() работает нормально:

` // Average var sq := Range(1, 10).Println; Println(sq.Average(n -> n * n));
Println(sq.Select(n -> n * n).Average());’

В чём тонкость работы метода Average?

Тут возможно, что average сомневается, в типе n*n - то ли ему брать integer, то ли int64… Ему же еще делить потом придется…

Его сомнения понятны.

Но приведение к типам integer (сомнительно), ни к int64 не проходят:

Println(sq.Average(n -> int64(n * n)));

А типы double и decimal проходят:

Println(sq.Average(n -> double(n * n))); Println(sq.Average(n -> decimal(n * n)));

Почему бы поделить целое на целое? Получится вещественное. Или произведение за границами типа int64? Вероятно, нужно явно задавать тип функции…

Да. Но single или double? Я пробовал в Sum писать выражения - там вообще был дурдом. Ответы в одних случаях были верными, в других - нет. А источником служил рандомный массив, не последовательность, т.е. данные не перевычислялись.

А пример приведите

Я бы привел, конечно, как приводил уже многие другие примеры, когда ошибка была стабильной. Но в этом случае был цейтнот, я перенес условие в фильтр Where и все получилось. А что я там писал конкретно, я от злости и досады, вместе взятых, тут же и забыл. попробую восстановить, если получится - обязательно напишу. Помню только, что там работа была с массивом типа real.

Такую же ошибку компиляции в Avarage выдает даже более простой вариант

// PascalABC.NET 3.2, сборка 1363 от 17.12.2016
// Внимание! Если программа не работает, обновите версию!

begin
  var sq := Seq(1,2,3);
  Println(sq.Sum(n->n));
  Println(sq.Average(n->n));
end.
```
При этом с Sum все нормально.

По моему скромному разумению, результат должен иметь тип double. Это более логично, чем float. Хотя перегрузки определяются типами параметров, а не результата.

Работает и так:

begin
  var sq := Seq(1,2,3);
  Println(sq.Sum(n->n));
  Println(sq.Average(n->single(n)));
end.
```
и так:

begin var sq := Seq(1,2,3); Println(sq.Sum(n->n)); Println(sq.Average(n->double(n))); end.

Осталось выяснить, фича это, или все же бага )))

Так работает. Это я знаю. Если фича, то где-то бы надо это отметить. Иначе очень на баг похоже. По-моему, типа double вполне бы хватило…

Это - слабый алгоритм вывода типов в нашем компиляторе и 20 перегрузок метода Average с близкими типами. Это нельзя назвать багом, но - очень неприятная фича.

По сути, игры с лямбдой в Average легко обходятся использованием Select(…).Average; Посему, особой печали это не должно вызывать. Надо знать об этой фиче - и не более того. “Предупреждён - значит, вооружен!” (с)

Про Select.Average я писал. Эта связка работает надёжно. А про фичу нужно написать в справке - и вопросов не будет.

Исправили Average. Наша ошибка была. Теперь это работает:

begin
  var sq := Range(1, 10).Println;
  Println(sq.Sum(n -> n * n));
  Println(sq.Average(n -> n * n));
end.
2 лайка

Спасибо. Работает!

Как повернуть спрайт (или картинку) на произвольный угол?

Думаю, никак. Когда это писалось, такой сценарий не рассматривался.

Тогда спрайты получаются слабоватые для игр. Очень жаль…

Почему первый оператор работает, а второй и третий нет?

var pr: Predicate<string> := s -> s.Length > 0;
var pr2: Predicate2<String, integer>:= (s, n) -> s.Length > n;
var pr3: Predicate3<integer, integer, integer>:= (n1,n2,n3) -> n1 > n2 + n3;