Перейти к содержанию
    

Кризис в самообразовании.

Гость TSerg
Студент не обязан догадываться, что препод "тупит"..

Сначала научитесь ясно выражать свои мысли, а потом занимайтесь преподавательством.

Ну, извини, забыл взять в кавычки "середина" массива.

А тебе, любезный - тоже не стоит тупить. Пример приведен.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну, извини, забыл взять в кавычки "середина" массива.

А тебе, любезный - тоже не стоит тупить. Пример приведен.

Не надо мне "ты-кать", не на базаре..

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Как хочу - так и обращаюсь. Не нравится - не читай.

Так ты специально по форумам шляешься, чтобы потупить? :biggrin:

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Сарказм тэе где тут :) Меня приколоа идея сложения указателей.. или как-то так? Я уже снова не понимаю как это работает

(int (*)(_t*) ((uint32_t)setpin*...+ (uint32_t) ....) ()

 

О! А я понял.

Значит берет он два указателя на функции. Преобразует их в целые и умножает один на состояние, а другой на инвертированное состояние.

Получает в результате суммы только один из указателей. Потом снова приводит указатель к функции и вызывает ее вкладывая как аргумент структуру описывающую пин.

 

Фишка этой функции в том, что она не требует if т.е. абсолютно детерминирована.

Ай! Красота. Надо записать где-то на память.

 

Тому кто пишет драйвера и не знает такие финты должно быть стыдно по моему.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Пример:

rnd= 19 [40,14,17,46,12,53,3,49,26,56,10,28,59,20,35,42,42,18,24]

sort=19 [56,46,42,42,40,28,26,24,20,18,14,12,10,3,17,35,49,53,59]

 

Требования: простота, изящность, самодокументируемость кода для понимания студентами.

Реализация планировалась на тех или иных разновидностях Pascal/Delphi/FreePascal/Lazarus.

#!/usr/bin/python

rnd =  [40,14,17,46,12,53,3,49,26,56,10,28,59,20,35,42,42,18,24]

even = [x for x in rnd if not x%2]
odd  = [x for x in rnd if x%2]
res  = sorted(even, reverse=True) + sorted(odd)

print res

 

Вывод:

 

[56, 46, 42, 42, 40, 28, 26, 24, 20, 18, 14, 12, 10, 3, 17, 35, 49, 53, 59]

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость TSerg
Так ты специально по форумам шляешься, чтобы потупить? :biggrin:

Нет, конечно, исключительно, чтобы тупых выявить :)

Все как обычно - профи все поняли правильно, студенты - затупили.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

О! А я понял.

Значит берет он два указателя на функции. Преобразует их в целые и умножает один на состояние, а другой на инвертированное состояние.

Получает в результате суммы только один из указателей. Потом снова приводит указатель к функции и вызывает ее вкладывая как аргумент структуру описывающую пин.

 

Фишка этой функции в том, что она не требует if т.е. абсолютно детерминирована.

Ай! Красота. Надо записать где-то на память.

 

Тому кто пишет драйвера и не знает такие финты должно быть стыдно по моему.

а цель?

Кстати умножать на bool это видимо по вашему )

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость TSerg
..

even = [x for x in rnd if not x%2]

odd = [x for x in rnd if x%2]

res = sorted(even, reverse=True) + sorted(odd)

..

Отлично!

Прекрасный пример на Питоне по краткости, хотя тут не сортировка на месте.

Идея была именно такая - разделить четные/нечетные в массиве по месту, отдельно отсортировать на месте части массива (четные/нечетные).

Т.е. метод разделения сложного на части, простые операции над частями - доступны для понимания студентам с начальным уровнем.

 

P.S.

Я это затеял не для того, что быть здесь Рефери.

Просто предложил Профи показать возможности тех или иных языков.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

#!/usr/bin/python
rnd =  [40,14,17,46,12,53,3,49,26,56,10,28,59,20,35,42,42,18,24]
even = [x for x in rnd if not x%2]
odd  = [x for x in rnd if x%2]
res  = sorted(even, reverse=True) + sorted(odd)
print res

Ну.., это слишком сложно.

В Matlab гораздо короче:

X = [40,14,17,46,12,53,3,49,26,56,10,28,59,20,35,42,42,18,24]

>> [sort(X(find(mod(X,2) <= 0)),'descend' ),  sort(X(find(mod(X,2) > 0))) ]

ans =

    56    46    42    42    40    28    26    24    20    18    14    12    10     3    17    35    49    53    59

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость TSerg
В Matlab гораздо короче:

>> [sort(X(find(mod(X,2) <= 0)),'descend' ), sort(X(find(mod(X,2) > 0))) ]

Кратко, да.

Но, Mathlab.. сложно назвать чистым ЯП.

Александр, а Вы приведите трансляцию этого кода на Си :)

Кроме того, опять же это не сортировка на месте.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Ну.., это слишком сложно.

В Matlab гораздо короче:

Было сказано, чтобы читабельно и понимабельно бегиннерам - т.е. разумная декомпозиция. Но для любителей говнокода, извольте:

 

res  = sorted([x for x in rnd if not x%2], reverse=True) + sorted([x for x in rnd if x%2])

 

Кратко, да.

Но, Mathlab.. сложно назвать чистым ЯП.

Матлаб в данном контексте ничем не лучше питона и даже наоборот.

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость TSerg
Было сказано, чтобы читабельно и понимабельно бегиннерам - т.е. разумная декомпозиция. Но для любителей говнокода, извольте:

res  = sorted([x for x in rnd if not x%2], reverse=True) + sorted([x for x in rnd if x%2])

Матлаб в данном контексте ничем не лучше питона и даже наоборот.

+1.

Совершенно верно.

С таким подходом - налетят Сишники и такое понапишут в "три буквы" :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Гость TSerg

Пример обфускации программ на C ( 21-й конкурс IOCC ).

Второй призер (hamano):

post-29537-1490632533_thumb.png

 

Есть желающие это понять? :)

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Поясните чем все-таки вот это:

((int (*)(dev_gpio_t *))((uint32_t)cs_pin->setpin*(!state) + (uint32_t)cs_pin->resetpin*(state)))(cs_pin);

лучше чем вот это?

if (state)
    cs_pin->resetpin(cs_pin);
else 
    cs_pin->setpin(cs_pin);        
return 0;

 

Вот сортировка на месте на C. Просто 2 сортировки вставкой. Да, не коротко конечно, но надеюсь понятно.

void swap(int *a, int *b )
{
  int tmp = *a;
  *a = *b;
  *b = tmp;
}
int odd_even_separate(int* mas, int len)
{
  // odd to left, even to right
  int i;
  int n = len;
  for (i = 0; i < n;)
  {
     if ((mas[i] % 2) == 0)
     {
        i++;
     }
     else
     {
        swap(&mas[i],&mas[n-1]);
        n--;
     }
  }
  return n; //even start
}

int cmp (int a, int b, int par)
{
  return par ?  a > b : a < b;
}

void insertion_sort(int* mas, int len, int dir)
{
  // dir - diretion : 0 for down, 1 for up
  int i;
  int j;
  for(i=1; i<len; i++)
  {
     for( j=i; j>0 && cmp(mas[j-1], mas[j], dir); j--)
     {
        swap(&mas[j], &mas[j-1]);
     }
  }
}

void test_sort(int *mas, int len)
{
  int even_start = odd_even_separate(mas, len);
  insertion_sort(mas, even_start, 0); // left part(odd) sort down
  insertion_sort(mas+even_start, len-even_start, 1); // right part(even) sort up
}

Поделиться сообщением


Ссылка на сообщение
Поделиться на другие сайты

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в этой теме...

×   Вставлено с форматированием.   Вставить как обычный текст

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отображать как обычную ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.

×
×
  • Создать...