Jump to content

    

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

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

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

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

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

Share this post


Link to post
Share on other sites
Ну, извини, забыл взять в кавычки "середина" массива.

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

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

Share this post


Link to post
Share on other sites
Guest TSerg
Не надо мне "ты-кать", не на базаре..

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

Share this post


Link to post
Share on other sites
Как хочу - так и обращаюсь. Не нравится - не читай.

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

Share this post


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

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

 

О! А я понял.

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

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

 

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

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

 

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

Share this post


Link to post
Share on other sites
Пример:

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]

Share this post


Link to post
Share on other sites
Guest TSerg
Так ты специально по форумам шляешься, чтобы потупить? :biggrin:

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

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

Share this post


Link to post
Share on other sites
О! А я понял.

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

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

 

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

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

 

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

а цель?

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

Share this post


Link to post
Share on other sites
Guest 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.

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

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

Share this post


Link to post
Share on other sites
#!/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

 

 

Share this post


Link to post
Share on other sites
Guest TSerg
В Matlab гораздо короче:

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

Кратко, да.

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

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

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

Share this post


Link to post
Share on other sites
Ну.., это слишком сложно.

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

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

 

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

 

Кратко, да.

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

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

Share this post


Link to post
Share on other sites
Guest TSerg
Было сказано, чтобы читабельно и понимабельно бегиннерам - т.е. разумная декомпозиция. Но для любителей говнокода, извольте:

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

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

+1.

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

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

Share this post


Link to post
Share on other sites
Guest TSerg

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

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

post-29537-1490632533_thumb.png

 

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

Share this post


Link to post
Share on other sites

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

((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
}

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now
Sign in to follow this