Задать вопрос
  • Как скрыть отображение адреса всех ссылок в браузере одним скриптом?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    document.querySelectorAll('a').forEach(a=>{
    	if(!a.href || !(a.href.indexOf('http')===0)) return;
    	let href = a.href;
    	a.removeAttribute('href');
    	a.addEventListener('click',e=>{
    		location.href = href;
    	});
    });

    Но этот скрипт испортит некоторые хитрые кнопки. Так что надо доделывать либо под конкретный сайт, либо думать, как определять кнопки в универсальном варианте скрипта.
    Немного улучшенный вариант:

    Но нет предела совершенству. Улучшать можно бесконечно.
    document.querySelectorAll('a').forEach(a=>{
    	//a.style.backgroundColor = 'red'; //красным проигнорированные
    	if (a.href && a.href.indexOf('javascript:') === 0) {
    		//a.style.backgroundColor = '#ff0'; //желтым скриптованные ссылки
    		let eval_str = a.href.substr(11);
    		a.addEventListener('click',e=>{
    			eval(eval_str);
    		});
    		a.removeAttribute('href');
    		return;
    	}
    	if(!a.href || !(a.href.indexOf('http')===0)) return;
    	let c = a.className;
    	if (c.indexOf('button') > -1 || c.indexOf('btn') > -1 || c.indexOf('like') > -1 || c.indexOf('reply') > -1) return;
    	if (a.querySelector('svg') || a.querySelector('img')) return;
    	if (a.style.borderRadius) return;
    	//a.style.backgroundColor = '#0f0'; //зеленым очищенные ссылки
    	let href = a.href;
    	a.removeAttribute('href');
    	a.addEventListener('click',e=>{
    		location.href = href;
    	});
    });
    Ответ написан
    5 комментариев
  • Оптимизировать код или как выделить всю вычислительную мощность пк на его выполнение?

    dollar
    @dollar
    Делай добро и бросай его в воду.
    Первое, что бросается в глаза - это многократное копирование массива. Представьте, что при сортировке мы бы после каждых двух-трех перестановок делали бы полный дубликат массива. Это же ужас! И это слабое место, постоянное перевыделение памяти больших размеров.

    Второе, что тоже важно - это сложность O(N*N). В вашем случае это критично, потому что много элементов в исходном массиве.

    Предлагаю немного изменить алгоритм. Делаем одно прохождение, но немного увеличиваем потребление памяти, в которой храним интервалы. Таким образом, мы избавляемся от постоянного копирования массива, а также уменьшаем сложность примерно до O(N).

    И маленькая оптимизационная хитрость - поиск интервала происходит по индексу, то есть O(1). Нужно немного поразмыслить, чтобы до этого догадаться, но в целом всё просто.
    Код
    <?php
    $arr = [100,125,75,175,25,300,275,325,375];
    $step = 50;
    
    $b = []; //-1 - deny, 0 - not set, 1 - has interval
    $int = []; //intervals if necessary 
    $step2 = intdiv($step,2);
    $arr = array_values(array_filter($arr, function($v) use ($step2,&$b,&$int) {
        $i = intdiv($v,$step2);
        $mod = $v % $step2;
        $res = true;
        if (isset($b[$i])) {
            if ($b[$i] === -1) $res = false;
            elseif ($mod < $int[$i][0] or $mod > $int[$i][1]) $res = false;
        }
        $b[$i] = -1;
        $b[$i+1] = -1;
        $b[$i-1] = -1;
        if (!isset($b[$i+2])) {
            $b[$i+2] = 1;
            $int[$i+2] = [$mod,$step2];
        } elseif ($b[$i+2] === 1) {
            if ($int[$i+2][0] < $mod) {
                $int[$i+2][0] = $mod;
                if ($int[$i+2][0] >= $int[$i+2][1]) $b[$i+2] = -1;
            }
        }
        if (!isset($b[$i-2])) {
            $b[$i-2] = 1;
            $int[$i-2] = [0,$mod];
        } elseif ($b[$i-2] === 1) {
            if ($int[$i-2][1] > $mod) {
                $int[$i-2][1] = $mod;
                if ($int[$i-2][0] >= $int[$i-2][1]) $b[$i-2] = -1;
            }
        }
        return $res;
    }));
    
    var_dump($arr); // [100, 175, 25, 300, 375]
    ?>

    Переписав алгоритм на С++, получите дополнительно 50-кратное увеличение скорости.
    Ответ написан
    3 комментария