Author Topic: Интересные задачки для реализации  (Read 7750 times)

0 Members and 1 Guest are viewing this topic.

dramster

  • Герой форума
  • *****
  • Posts: 1134
    • View Profile
Re: Интересные задачки для реализации
« Reply #15 on: February 11, 2016, 11:19:33 AM »
хехе, я вчера часа 4 потратил на эту задачу. получил простенький вариант с сортировкой массива, но длительный, на сортировку много уходит сил.
второй вариант мега сложный, но быстрый.
Code: (clickermann) [Select]

SUB(fast)     //быстрый но сложный способ
   IF(ARRSIZE($arr)>3)     //проверка, чтоб в массиве было более трех элементов
     
      FOR($a=0,$a<ARRSIZE($arr)) //делим на отрицательные и положительные  (0 пусть будет положительным)
         IF($arr[$a]<0)
            arrpush($minus,$arr[$a])
         else
            arrpush($plus,$arr[$a])
         END_IF
      END_CYC
     
      IF(ARRSIZE($plus)=0)   //если положительных чисел нету
         print("положительных чисел нету")
         $minus_max=$minus[0]
         $i=0
         FOR($a=1,$a<ARRSIZE($minus))
            IF($minus[$a]>$minus_max)
               $minus_max=$minus[$a]
               $i=$a
            END_IF
         END_CYC
         $minus[$i]=1
         
         //print($minus_max)
         
         IF($i=0)
            $minus_2 = $minus[1]*$minus_max
         else
            $minus_2 = $minus[0]*$minus_max
         END_IF
         
         $i=0
         FOR($a=0,$a<ARRSIZE($minus))                     //наименьшее произведение двух отрицательных
            IF((($minus[$a]*$minus_max) < $minus_2)&($minus[$a]<0))
               $minus_2=$minus[$a]*$minus_max
               $i=$a
            END_IF
         END_CYC
         $minus[$i]=1
         
         //print($minus_2)
         
         IF($minus[0]<0)
            $finish = $minus[0]*$minus_2
         else
            IF($minus[1]<0)
               $finish = $minus[1]*$minus_2
            else
               $finish = $minus[2]*$minus_2
            END_IF
         END_IF
         
         FOR($a=0,$a<ARRSIZE($minus))                     //наименьшее произведение трех отрицательных
            IF((($minus[$a]*$minus_2) > $finish)&($minus[$a]<0))
               $finish=$minus[$a]*$minus_2
            END_IF
         END_CYC
         
         print($finish)
         
      else
         IF(ARRSIZE($minus)>1)         //проверяем, чтоб отрицательных было 2 и более
            $i=0
            FOR($a=0,$a<ARRSIZE($minus))
               IF($minus[$a]<$minus_min)
                  $minus_min=$minus[$a]
                  $i=$a
               END_IF
            END_CYC
            //print($minus_min)
            $minus[$i]=0     //убираем наименьший элемент
           
            FOR($a=0,$a<ARRSIZE($minus))           //наибольшее произведение двух отрицательных
               IF(($minus[$a]*$minus_min) > $minus_2)
                  $minus_2=$minus[$a]*$minus_min
               END_IF
            END_CYC
         END_IF
         
         //print($minus_2)
         
         IF(ARRSIZE($plus)=1))           //если положительное одно
            $finish=$plus[0]*$minus_2
            print($finish)
         else
           
            IF(ARRSIZE($plus)=2))         //если положительных 2
               IF($plus[0] > $plus[1])
                  $finish=$plus[0]*$minus_2
                  print($finish)
               else
                  $finish=$plus[1]*$minus_2
                  print($finish)
               END_IF
            else                                //если положительных 3 и более
               $i=0
               FOR($a=0,$a<ARRSIZE($plus))      //находим максимум
                  IF($plus[$a]>$plus_max)
                     $plus_max=$plus[$a]
                     $i=$a
                  END_IF
               END_CYC
               
               $plus[$i]=0
               
               //print($plus_max)
               
               $i=0
               FOR($a=0,$a<ARRSIZE($plus))      //максимум при умножении на себеподобные
                  IF(($plus[$a]*$plus_max)>$plus_2)
                     $plus_2=$plus[$a]*$plus_max
                     $i=$a
                  END_IF
               END_CYC
               $plus[$i]=0
               
               //print($plus_2)
               
               FOR($a=0,$a<ARRSIZE($plus))           // максимум при умножении трех положительных
                  IF(($plus[$a]*$plus_2)>$plus_3)
                     $plus_3=$plus[$a]*$plus_2
                  END_IF
               END_CYC
               
               //print($plus_3)
               
               IF($plus_3 > ($minus_2*$plus_max))      //сравниваем, что больше - 2 отрицательных и одно положительное, или 3 положительных.
                  $finish = $plus_3
                  print($finish)
               else
                  $finish = $minus_2*$plus_max
                  print($finish)
               END_IF
               
            END_IF
         END_IF
      END_IF
     
   else
      IF(ARRSIZE($arr)=3)     // если всего три элемента
         $finish=$arr[0]*$arr[1]*$arr[2]
         print($finish)
      else
         print("в массиве меньше трех элементов")
         halt
      END_IF
   END_IF
   
END_SUB

//==========================================================

SUB(low)          //медленный но простой способ
   $siz = ARRSIZE($arr)
   $srtcheck = 0
   $srt = 0
   FOR($a=$siz-1,($a>0)&($srt=0),-1)
      FOR($b=0,$b<$a)
         IF($arr[$b] > $arr[$b+1])
            $srtcheck = 1
            $tmp = $arr[$b]
            $arr[$b] = $arr[$b+1]
            $arr[$b+1] = $tmp
         END_IF
      END_CYC
      IF($srtcheck = 0)
         $srt = 1
      END_IF
   END_CYC

   
   IF(($arr[0]*$arr[1]*$arr[ARRSIZE($arr)-1])<($arr[ARRSIZE($arr)-1]*$arr[ARRSIZE($arr)-2]*$arr[ARRSIZE($arr)-3]))
      $finish=$arr[ARRSIZE($arr)-1]*$arr[ARRSIZE($arr)-2]*$arr[ARRSIZE($arr)-3]
      else
      $finish=$arr[0]*$arr[1]*$arr[ARRSIZE($arr)-1]
   END_IF
   
   print($finish)     
END_SUB

//==========================================================
//==========================================================
//==========================================================
//==========================================================
//==========================================================
//==========================================================
STRSEPARATE("-5,-2,-3,2,3,1,0,-1",",",$arr)

//FOR($a=0,$a<ARRSIZE($arr))
//   print($arr[$a])
//END_CYC


wait(1)
$t=$_ms
fast()
print("за ",$_ms-$t,"ms")


wait(1)
$t=$_ms
low()
print("за ",$_ms-$t,"ms")






halt

Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Интересные задачки для реализации
« Reply #16 on: February 11, 2016, 01:42:49 PM »
Вот на питоне:
[spoiler]
Code: (php) [Select]
#!/usr/bin/env python
# -*- coding: utf-8 -*-

def multi_3_max(list_of_ints):
    if not list_of_ints: return 0, ''
    if len(list_of_ints) < 4:
        res = list_of_ints
    else:
        res = [0]
        list_of_ints.sort(reverse=True)
        pos = list_of_ints[:3]
        pos = [i for i in pos if i > 0]

        list_of_ints.sort()
        neg = [i for i in list_of_ints if i <= 0]

        if not len(pos):
            res = [neg[-1], neg[-2], neg[-3]]
        elif len(pos) == 1:
            res = [pos[0], neg[0], neg[1]]
        elif len(pos) == 2:
            if len(neg) > 1:
                res = [pos[0], neg[0], neg[1]]
        else:
            if len(neg) < 2:
                res = [pos[0], pos[1], pos[2]]
            elif pos[0]*pos[1]*pos[2] > pos[0]*neg[0]*neg[1]:
                res = [pos[0], pos[1], pos[2]]
            else:
                res = [pos[0], neg[0], neg[1]]
    op = ''
    result = 1
    for i in res:
        result *= i
        if op: op += u' * '
        op += str(i)
    return result, op

# list_of_ints = [-10, -10, 1, 3, 2]
# print u'Результат: %d  операнды %s' % multi_3_max(list_of_ints)

print u'Результат: %d  операнды %s' % multi_3_max([-10, 3, 2])
print u'Результат: %d  операнды %s' % multi_3_max([-10, -10, 0, 1, 3, 2])
print u'Результат: %d  операнды %s' % multi_3_max([-10, 0, 3, 2])
print u'Результат: %d  операнды %s' % multi_3_max([-10, 0, 3, 2, -2])
print u'Результат: %d  операнды %s' % multi_3_max([-10, 7, 3, 2])
print u'Результат: %d  операнды %s' % multi_3_max([-10, 7, 3, 2, -5])
print u'Результат: %d  операнды %s' % multi_3_max([-10, -7, -5, -2])
print u'Результат: %d  операнды %s' % multi_3_max([-5,-2,-3,2,3,1,0,-1])
print u'Результат: %d  операнды %s' % multi_3_max([4,3,-2,0,0])
[/spoiler]

Code: [Select]
Результат: -60  операнды -10 * 3 * 2
Результат: 300  операнды 3 * -10 * -10
Результат: 0  операнды 3 * -10 * 0
Результат: 60  операнды 3 * -10 * -2
Результат: 42  операнды 7 * 3 * 2
Результат: 350  операнды 7 * -10 * -5
Результат: -70  операнды -2 * -5 * -7
Результат: 45  операнды 3 * -5 * -3
Результат: 0  операнды 4 * -2 * 0

[-10, -10, 0, 1, 3, 2]
1000 раз за 0.00521407050337 мс
« Last Edit: February 11, 2016, 02:47:57 PM by Vint »


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Интересные задачки для реализации
« Reply #17 on: February 11, 2016, 02:36:17 PM »
А нафига там декомпилятор? pyc в py переводить?


Vint

  • Супермодератор
  • Герой форума
  • *
  • Posts: 3935
  • Лечу куда хочу. cman 4.13.014x32, 4.14.003 W10
    • View Profile
Re: Интересные задачки для реализации
« Reply #18 on: February 11, 2016, 02:50:26 PM »
Так зачем? Какая-то конкретная большая прога выложена без файлов py?
Обычно так никто не делает. Ну я раз делал, чтобы скрыть код. Но всё нужное можно найти в нормальных файлах. В крайнем случае самому написать.
Мне вот ни разу не потребовалось pyc декомпилировать.
« Last Edit: February 11, 2016, 02:52:11 PM by Vint »