Простая спираль Улама на Javascript
В инете есть разные спирали Улама, и гораздо более пафосные. Показанный ниже код, во-первых, сам по себе прост и не использует внешних библиотек, во-вторых, демонстрирует характерную для этой задачи простую реализацию обхода матрицы или таблицы по раскручивающейся спирали, в-третьих, мы здесь строим картинку без использования графической канвы или чего-то подобного, просто добавляя в документ div'ы.
Вот какая вышла картинка для границы поиска в 100000 чисел.
Спираль Улама при границе поиска 100000
Если сохранить показанный ниже код как файл типа .html
, он сработает, естественно, довольно медленно, так как на JS.
<div id="wrapper"></div> <style> #wrapper { position: relative; } .number { position: absolute; width: 2px; height: 2px; line-height: 2px; font-size: 2px; text-align: center; color: #ffffff; border-radius: 1px; } .prime { color: #000000; font-weight: bold; background-color: #000000; } .first { background-color: #800000; } </style> <script> var isPrime = function (n) { //true, если n - простое var i, l; if (n == 1) return false; if (n == 2) return true; if (n % 2 == 0) return false; for (i = 3, l = Math.sqrt(n); i <= l; i += 2) { if (n % i == 0) return false; } return true; }; var appendNum = (function () { //Добавляет элемент в DOM var doc = document; var wrapper = document.getElementById('wrapper'); var first = true; return function (num, highlight, x, y) { var div = doc.createElement('div'); var className = 'number'; className += highlight ? ' prime' : ''; className += first ? ' first' : ''; first = false; div.className = className; div.style.left = x + 'px'; div.style.top = y + 'px'; wrapper.appendChild(div); }; }()); var size = 2; //размер точки, соответствует размеру из стиля var offsetX = 400; //начальная позиция в пикселах var offsetY = 350; var dir = 0; //направление var limit = 1; //лимит для смены направления var counter = 0; //сколько прошли в текущем направлении var turns = 0; //счетчик поворотов for (var i = 1; i < 100000; i++) { //граница поиска appendNum(i, isPrime(i), offsetX, offsetY); switch (dir) { case 0: offsetX += size; break; //вправо case 1: offsetY -= size; break; //вверх case 2: offsetX -= size; break; //влево case 3: offsetY += size; break; //вниз } counter++; if (counter >= limit) { counter = 0; turns = (turns + 1) % 2; dir = (dir + 1) % 4; if (turns == 0) limit++; } } </script> <noscript>You need Javascript to run it</noscript>
06.01.2019, 16:06 [1814 просмотров]