Ответы пользователя по тегу Алгоритмы
  • Как работает алгоритм "Решето Эратосфена" (java)?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    не могу понять почему в данной задаче второй цикл проходит до n/i.

    так как нам надо найти все простые числа меньшие чем n то будет логично что все числа полученные перемножением i и j с результатом произведения больше чем n нам не нужны, таким образом, деля n на i мы находим максимально возможное j при котором результат перемножения i и j будут меньше или равен n)))
    Ответ написан
  • Как перевести число в 16-ричное представление?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    реализация на js
    // можно обойтись и без этого массива, но для демки делаю с ним
    var hexchar = [0,1,2,3,4,5,6,7,8,9,"A","B","C","D","E","F"].map(v=>v.toString());
    function decToHex(num){
       let out = num&15;
       num = num>>>4;
       return num?decToHex(num)+hexchar[out]:hexchar[out];
    }
    
    /* тестируем */
    for(var i=0; i<100; i++){
       console.log(i,"=",decToHex(i));
    }


    вывод в консоль
    0 = 0
    1 = 1
    2 = 2
    3 = 3
    4 = 4
    5 = 5
    6 = 6
    7 = 7
    8 = 8
    9 = 9
    10 = A
    11 = B
    12 = C
    13 = D
    14 = E
    15 = F
    16 = 10
    17 = 11
    18 = 12
    19 = 13
    20 = 14
    21 = 15
    22 = 16
    23 = 17
    24 = 18
    25 = 19
    26 = 1A
    27 = 1B
    28 = 1C
    29 = 1D
    30 = 1E
    31 = 1F
    32 = 20
    33 = 21
    34 = 22
    35 = 23
    36 = 24
    37 = 25
    38 = 26
    39 = 27
    40 = 28
    41 = 29
    42 = 2A
    43 = 2B
    44 = 2C
    45 = 2D
    46 = 2E
    47 = 2F
    48 = 30
    49 = 31
    50 = 32
    51 = 33
    52 = 34
    53 = 35
    54 = 36
    55 = 37
    56 = 38
    57 = 39
    58 = 3A
    59 = 3B
    60 = 3C
    61 = 3D
    62 = 3E
    63 = 3F
    64 = 40
    65 = 41
    66 = 42
    67 = 43
    68 = 44
    69 = 45
    70 = 46
    71 = 47
    72 = 48
    73 = 49
    74 = 4A
    75 = 4B
    76 = 4C
    77 = 4D
    78 = 4E
    79 = 4F
    80 = 50
    81 = 51
    82 = 52
    83 = 53
    84 = 54
    85 = 55
    86 = 56
    87 = 57
    88 = 58
    89 = 59
    90 = 5A
    91 = 5B
    92 = 5C
    93 = 5D
    94 = 5E
    95 = 5F
    96 = 60
    97 = 61
    98 = 62
    99 = 63


    демка в ресочнице
    Ответ написан
    Комментировать
  • Как написать функцию пересчета значений одной шкалы в другую?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    На первом интервале
    y=x*1000;

    На втором
    y=1000+(x-0.2)*(6000-1000)
    Ответ написан
    Комментировать
  • Как найти арифметическую прогрессию в списке?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    к сожалению python не мой рабочий инструмент, поэтому сделал реализацию на js. Старался не использовать "особые фишки" языка, чтобы получить более универсальный код (с точки зрения переносимости на другие ЯП). Думаю вы без проблем сможете переписать его на python.

    var arr1 = [1487, 1847, 4817, 4871, 7481, 7841, 8147, 8741];
    var res1 = search(arr1);
    console.log(res1); 
    // найдена 1 прогрессия. выведет:
    // [ 
    //   [ 1487, 4817, 8147 ] 
    // ]
    
    
    
    var arr2 = [1487, 1847, 4817, 4871, 7481, 7841, 8147, 8741, 10001];
    var res2 = search(arr2);
    console.log(res2); 
    // найдено 2 прогрессии. выведет:
    // [ 
    //   [ 1487, 4817, 8147 ],
    //   [ 7481, 8741, 10001 ]
    // ]
    
    
    
    
    
    
    function search(a){
    	// создадим массив, в который будем заносить данные о найденых прогрессиях
    	var result = [];
    
    	// проверяем в цикле все числа
    	for(var start=0; start<a.length; start++){
    		for(var i=start+1; i<a.length; i++){
    
    			// вычисляем предпологаемый шаг прогрессии
    			var step = a[i]-a[start]; 
    
    			// и проверяем его.
    
    			// создаем массив, в который складываем 
    			// числа предполагаемой прогрессии
    			var list = [ a[start], a[i] ]; 
    
    			// смотрим в цикле следующие числа
    			for(var j = i+1; j< a.length; j++){
    				// если следующее число - шаг прогрессии равно
    				// последнему занесенному в массив list
    				// то добавляем его в массив list
    				if( a[j]-step == list[list.length-1]){
    					list.push(a[j]);
    				}
    			}
    
    			// если в массиве 3 элемента или более, то считаем что
    			// еще одна прогрессия найдена и запоминаем ее в
    			// массиве с результатами
    			if( list.length>2){
    				result.push(list);
    			}
    
    			console.log(start, i, step, list)
    		}
    	}
    
    	// возвращаем массив результатов
    	return result;
    }
    Ответ написан
    Комментировать
  • Каким образом должен работать этот алгоритм?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Алгоритм полностью рабочий. Вот посмотрите такой пример:

    def smallest(arr):
        smallest = arr[0]
        smallest_index = 0
        for i in range(1,len(arr)):
            if arr[i] < smallest:
                smallest = arr[i]
                smallest_index = i
        return smallest_index 
    
    d = [4,15,6,2,7,9,9]
    
    print(smallest(d)) # 3
    print(d[smallest(d)]) # 2
    Ответ написан
    Комментировать
  • Каков алгоритм решения задачи о жуках, которые не любят находиться близко друг от друга?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Тут все просто, каждый очередной жук будет искать точку равноудаленную от края и других жуков.
    тоесть первый засядет ровно по середине, два последующих засядут с двух сторон от первого, посередине между первым и краями и так далее.
    По сути это задача на нахождение значений фрактала.
    Ответ написан
  • Как вычислить интервал для дат средних значений?

    lastuniverse
    @lastuniverse
    Всегда вокруг да около IT тем
    Решение для одного массива:
    код
    // пишу на js, на php уже забыл как писать:)
    
    // исходный массив данных
    var data = {
    	1555349065: 3,
    	1555349059: 10,
    	1555349057: 4,
    	1555349047: 12,
    	1555349037: 8,
    	1555349027: 11,
    	1555349017: 2
    };
    
    
    
    
    // далее понадобится некий интервал, внутри которого мы будем вычислять значения с обпределенным шагом
    // для этих целей возмем таймштамп из первой и последней ячеек, вы же можете указать любой, удобный вам
    
    
    	// получим массив ключей (специфика js) и навсякий случай отсортируем его:)
    	var times = Object.keys(data).sort();
    
    	// начальное значение интервала времени
    	var start = +times.shift();
    
    	// следующее за начальным значение интервала времени
    	var next = +times.shift();
    
    	// конечное значение интервала времени
    	var stop = +times[times.length-1];
    
    	// зададим шаг вычислений (поставил равным 3 чтобы было интересней)
    	var step = 3;
    
    
    
    // все готово для вычисления средних значений. Тут есть несколько особенностей, по сути данная задачя является интерполяцией
    // а интерполяции бывают разными. Общей особенностью любой интерполяции является то, то они не дают точный результат
    // далее для вычисления средних значений я буду использовать самую простую интерполяцию - линейную
    
    	// создадим ассоциативный массив, в который будем складывать результаты вычислений
    	var result = {};
    
    	for(var i=start; i<stop; i+=step ){
    		console.log(i);
    		// если долши до следующего значения
    		if(i>=next){
    			start = next;
    			next = +times.shift();
    		}
    
    		// вычисляем промежуточное хначение (тут вся соль, и при этом это простая пропорция)))
    		var dx = next-start;
    		var dy = data[next]-data[start];
    		var dt = i-start;
    		result[i] = data[start] + dt*dy/dx; 
    	}
    
    
    	// выводим результат
    	console.log(result);


    ну и результат:
    {
      '1555349017': 2,
      '1555349020': 4.7,
      '1555349023': 7.4,
      '1555349026': 10.1,
      '1555349029': 10.4,
      '1555349032': 9.5,
      '1555349035': 8.6,
      '1555349038': 8.4,
      '1555349041': 9.6,
      '1555349044': 10.8,
      '1555349047': 12,
      '1555349050': 9.6,
      '1555349053': 7.2,
      '1555349056': 4.8,
      '1555349059': 10,
      '1555349062': 6.5
    }


    Если необходимо решение учитывающее значения во всех массивах, просто можете объединить их скопировав ключи и их значения в один ассоциативный массив и использовать данное решение уже на объединенном массиве
    Ответ написан
    Комментировать