Задачка


  • Banned

    Задачка для тех , кто хочет размять мозги.

    Есть 5 чисел: a = 15, b = 21, c = 34, d = 49, e = 67.
    Требуется разбить эти числа на интервалы следующего вида: Например интервалы для числа a:
    (0:4), (5:8), (9,12), (13,15) , для остальных чисел интервалы должны быть такого же вида.

    Условия:

    1. Должен быть алгоритм по которому вы разбивали числа на интервалы.
    2. Чем больше число , тем больше должно быть интервалов , но один интервал должен включать не менее 3 чисел.
      Например интервал (0, 1) не подходит.

    Соточку смарта подкину тому , кто раньше меня напишет данный алгоритм)



  • Ща забацаем )



  • Кстати, у тебя в условии "один интервал должен включать не менее 3 чисел". Почему тогда в примере 0,4 и 5,8? Это по 5 чисел (0, 1, 2, 3, 4) и 4 числа (5, 6, 7, 8). Можно ведь интервалы делать одинаковыми, ровно по 3 числа, 0,2 (0, 1, 2) и 3,5 (3, 4, 5)



  • https://sth-invest.eu/int.php

    В каждом интервале, кроме последнего, ровно 3 числа. В последнем может быть от 3 до 5 чисел


  • Banned

    @komokhepbob не менее 3х чисел , т.е. больше или равно. В интервале (0,4) - 5 чисел , в интервале (5,8) - 4 числа. Что не так не пойму?))) Да , инвервалы можно делать одиннаковыми.


  • Banned

    @komokhepbob да , вполне. Желательно только , чтобы количество чисел в инвервалах шло от большего к меньшему. Например: (0, 4) (0, 3) (0 , 2) , т.е. желательно не так -> (0, 3) (0 , 2) (0 , 4)


  • Banned

    Следует поторопиться , т.к. у меня уже половина алгоритма написана - вторую часть как поздно вечером освобожусь - допишу , но это не точно))

    Простой пример части алгоритма на языке Python , который найдет минимальное кол-во чисел , которое должно находится в интервале для каждого числа из условия. Продолжение следует))

    l = [a, b, c, d ,e]
    l2 = []
    
    def foo(x):                                 # х - число из условия задачи
        while x > 3:                            # будет выполняться пока x > 3
            x = (x / 2).__round__()      # делим х на 2 до тех пора пока x > 3
    
        return x
    
    # Делаем итерации по списку , в котором находятся числа из условия.
    for i in l:
        l2.append(foo(i))     # добавляем значение , которое вернула функция foo в новый список.
    


  • Так я же уже скинул ссылку на рабочий пример )


  • Banned

    @komokhepbob прошу прощения , не открыл сразу ссылку) . Есть вариант с псевдокодом , а то я вариант на пыхе не разберу к сожалению?) Ну или хотя бы исходный код , а не вывод



  • @Itachi Да тут все просто )) Разницы какой язык особо нету ) Берешь целое число от деления на 3, чтоб выяснить сколько будет пар +/- 1 пара, а потом в цикле делаешь пары с 3 числами, или больше в случае с последней парой 🙂

    <?php
    
    $numbers = [
        'a' => 15,
        'b' => 21,
        'c' => 34,
        'd' => 49,
        'e' => 67,
    ];
    
    foreach ($numbers as $k=>$v) {
      $ints = abs($v / 3);
    
      $res = [];
    
      for ($i=0; $i<$ints; $i++) {
        if ($i*3+2+3 < $v) {
          $res[] = [$i*3, $i*3 + 2];
        } else {
          $res[] = [$i*3, $v];
          $i+=2;
        }
      }
    
      echo "<strong>{$k} = {$v}</strong><br/><pre>";
      
      var_dump($res);
      
      echo "</pre><br/><br/><hr><br/><br/>";
    }

  • Banned

    @komokhepbob ммм интересное решение , я догнал) , но я по другому хотел сделать , как закончу - залью свой вариант)). Присылай кошель - ты раньше меня написал алгоритм)).
    Как нужен будет алгоритм - теперь знаю куда писать надо))))



  • @itachi так это мелоч, минуты 2-3 потратил )) Ты же и раньше знал кому писать в таких случаях ))) Решений почти всегда несколько, это одно их них )

    SNYid2jsZosybiFqke9E68xjrX3hT4N271

    А про пары я спрашивал, потому что удивило, что разное количество чисел в них. Зачем заморачиваться если можно сделать везде по 3 числа. Просто хотел уточнить )


  • Banned

    @komokhepbob знал , думал может кому еще будет интересно)). Я у мамы не технарь поэтому мне требуется чуть больше времени 😁


  • Banned

    @komokhepbob твое решение оказалось намного лучше и проще моего. Я в своем коде буду использовать твой вариант))

    Тогда поборемся за номинацию "самое компактное решение" 😁

    def foo(x, z):
        lst = []
        for i in range(0, round(x)):
            if i * 3 + 2 + 3 < z:
                lst.append((i * 3, i * 3 + 2))
            else:
                lst.append((i * 3, z))
                break
        return lst
    
    list_ = [15, 21, 34, 49, 67]
    [print(foo(i / 3, i)) for i in list_]
    


  • @itachi а тут код выйдет из цикла при попадании в

     if i * 3 + 2 + 3 < z:?
    

    Думаю ты пропустил ручное увеличение переменной i для прерывания цикла


  • Banned



  • @itachi тогда ок )


  • Banned

    @komokhepbob
    В python просто нет такой записи.

    for ($i=0; $i<$ints; $i++)
    

    Я итерируюсь по диапазону чисел , которые сгенерирует функция range , т.е. от 0 до x , 3ьи параметром могу еще шаг задать. Цикл for в Python просто автоматически перебирает элементы , т.е. мне не требуется явно инкрементировать i в цикле for , как например в пыхе , да и во многих других ЯП)) Вообщем я это как то так понимаю)

    for i in range(0, round(x)):
    


  • @itachi это я понял ) я к тому, что когда срабатывает условие, то оставшийся шаг цикла нужно пропустить ) иначе в конце буду пары к примеру 30,34 и 33,34


  • Banned

    @komokhepbob да , он пропускается.

    Вот вывод результатов.

    [(0, 2), (3, 5), (6, 8), (9, 11), (12, 15)]
    [(0, 2), (3, 5), (6, 8), (9, 11), (12, 14), (15, 17), (18, 21)]
    [(0, 2), (3, 5), (6, 8), (9, 11), (12, 14), (15, 17), (18, 20), (21, 23), (24, 26), (27, 29), (30, 34)]
    [(0, 2), (3, 5), (6, 8), (9, 11), (12, 14), (15, 17), (18, 20), (21, 23), (24, 26), (27, 29), (30, 32), (33, 35), (36, 38), (39, 41), (42, 44), (45, 49)]
    [(0, 2), (3, 5), (6, 8), (9, 11), (12, 14), (15, 17), (18, 20), (21, 23), (24, 26), (27, 29), (30, 32), (33, 35), (36, 38), (39, 41), (42, 44), (45, 47), (48, 50), (51, 53), (54, 56), (57, 59), (60, 62), (63, 67)]
    
    

Log in to reply
 

Looks like your connection to Community was lost, please wait while we try to reconnect.