Опять массивы

Самое компактное решение на Питоне (аналогично можно и на PHP, Perl, PascalABC.Net и др. ЯСВУ):

rnd.sort(key=lambda x: -1*x if x & 0x1 else x, reverse=True);
 
Еще немного про ЯВУ и ЯСВУ:

Есть такие понятия, как "синтаксический сахар" и "синтаксическая соль".
Применение первого, обеспечивает, по выражению Джек Криншоу:
"В конце концов, люди тоже должны читать программы… Сахарные токены служат в качестве полезных ориентиров, помогающих вам не сбиться с пути…"
Сам термин "syntactic sugar" был введен Peter J. Landin в 1964 г. для описания синтаксиса алголо-подобного языка с использованием лямбда-исчисления.
Пример во многих ЯВУ - дополнение базового безусловного цикла, сначала тремя циклами (пред-, пост-условие, цикл с шагом), а затем и foreach.
Или, к примеру (x := x + y) == (x+=y); Это стандартно для C, но для Pascal - нет. Тем не менее, отечественные разработчики PascalABC.Net, сознательно пошли на значительную переделку Object Pascal, для сближения его с современными технологиями.

Синтаксическая "соль" - дополнительные, технически бесполезные, конструкции в языке программирования, которые правила языка требуют употреблять при выполнении потенциально небезопасных действий.
Пример в Delphi - override.
Или, например - завершение операции точкой с запятой.
Для синтаксического парсера, это не принципиально, но большинство разработчиков к этому привыкли.
 
Еще одно красивое решение:
(предполагает, что все исходные числа - положительные + 0)

PascalABC.Net:

Код:
var
  ar: array of integer;
const
  maxValue = 60; // Max value of rnd
  maxLen = 19; // ar.Length

procedure Inv(ar: array of integer);
begin
  for var i := Low(ar) to High(ar) do
    if not Odd(ar[i]) then ar[i] := -ar[i];
end;

begin
 // Init  
  SetLength(ar, maxLen);
  for var i := Low(ar) to High(ar) do
    ar[i] := random(MaxValue + 1);

  write('rnd= ', ar.Length,' ', ar);
  writeln();
  
  Inv(ar); ar.Sort(ar); Inv(ar);
  
  write('rnd= ', ar.Length,' ', ar);
  writeln();
end.
 
Назад
Сверху