У нас было несколько из проблем , о спирали Улама. Но этого недостаточно.
В этом задании мы построим треугольную спираль Улама (в отличие от обычной квадратной спирали Улама). Вот эскиз того, как выглядит спираль.
Как мы знаем, спираль Улама размещает все натуральные числа во внешней спирали и отмечает только те, которые являются простыми. Таким образом, в приведенном выше наброске будут показаны только цифры, которые отображаются черным цветом (простые числа).
Соревнование
Примите число N в качестве ввода и покажите треугольную спираль Улама до этого числа.
- Ввод может быть стандартным аргументом или аргументом функции.
- Спираль должна повернуться в положительном направлении (то есть против часовой стрелки), как показано на рисунке выше.
- Любой из поворотов на 120 градусов на приведенном выше рисунке будет действительным, и разворот может отличаться для разных входов. Но самая низкая сторона подразумеваемых треугольников должна быть горизонтальной, поскольку единственные разрешенные повороты (кратные) 120 градусов.
- Код должен выполняться теоретически (при условии достаточного количества времени и памяти) для любого N, вплоть до того, что допускается любыми промежуточными вычислениями, которые вы выполняете с типом данных по умолчанию.
double
достаточно; нет необходимости в больших целочисленных типах. - Все встроенные функции разрешены.
- Я не приму мой собственный ответ (не то, чтобы я думал, что он будет самым коротким в любом случае ...).
Выходные форматы
Выберите любой из следующих.
Отобразите график с маркером (точка, круг, крестик, что вы предпочитаете) на простых числах и ничего не на простых числах. Масштаб не обязательно должен быть одинаковым для двух осей. То есть подразумеваемые треугольники не обязательно должны быть равносторонними. Оси, линии сетки и метки осей являются необязательными. Требуются только маркеры на простых числах.
Пример вывода для N = 12 будет следующим (сравните с приведенным выше эскизом). Второй график - более интересный пример, соответствующий N = 10000.
- Создайте файл изображения с вышеуказанным, в любом хорошо известном формате изображения (например, png, tiff, bmp).
Отобразите спираль как ASCII-изображение , используя один символ по вашему выбору для простых чисел и пробел для непростых чисел, с пробелом для разделения числовых позиций в одной строке. Разрешены начальные или конечные пробелы или переводы строк. Например, случай N = 12 с использованием
o
символа будетo · · · o · o · · · o · o
где, конечно,
o
на самом деле будет отображаться только отметка в простых числах. В·
не простые числа показаны здесь только для справки.
Критерий победы
Настоящая награда - увидеть для себя эти удивительные модели Code golf, самые короткие коды выигрышей.
источник
Ответы:
CJam,
4942 байтаВведите как одно целое число в STDIN. Вывод в виде сетки ASCII с
0
простыми числами. Вращение спирали не является последовательным: наибольшее количество спирали всегда будет в нижнем ряду.Проверьте это здесь.
объяснение
Основная идея состоит в том, чтобы представить треугольник как рваный 2D-массив при выполнении вычислений. Вы получаете этот массив, переворачивая линии и выравнивая все строки влево:
Будет представлен как
Поскольку мы отразили линию, мы хотим свернуть спираль по часовой стрелке . Это удобно, потому что все, что нам нужно сделать, это повернуть треугольник против часовой стрелки и добавить следующий подсписок по порядку. Мы можем повернуть рваный массив, перевернув все строки и перенеся его:
Итак, вот код. Одна деталь, на которую я хотел бы обратить внимание, - это последняя деталь, которая создает треугольный макет. Я думаю, что это довольно изящно. :)
источник
MATL ,
4836 байтИспользует текущий выпуск (9.3.0) .
Попробуйте онлайн!
Не знаю, как онлайн-компилятору удается преобразовать графический вывод в ASCII, но это так.Это создает приблизительный график ASCII благодаря функции Octave, которая поддерживается онлайн-компилятором!Редактировать (4 апреля 2016 г.): функция
Y[
была переименованаk
с версии 13.0.0. Ссылка на онлайн-компилятор включает это изменение, так что код может быть протестирован.пример
производит графический вывод (показана версия MATLAB):
объяснение
Код использует комплексные числа, чтобы проследить путь, по которому идет спираль. Как видно из первой фигуры в задании, каждая прямая ветвь спирали представляет собой сегмент с возрастающей длиной 1, 2, 3, 4 ... и циклически возрастающей ориентацией 120 градусов, 240 градусов, 0 градусов, 120 градусов. ..
Код сначала генерирует отдельные комплексные смещения от каждого целого числа к следующему. Эти сложные смещения имеют величину 1 и угол
2*pi/3
,4*pi/3
или0
(в радианах). Таким образом, они могут быть легко сгенерированы как мнимые экспоненты. Для этого сначала используется целочисленная последовательность 0,1,2,2,3,3,3,4,4,4,4 ....Эта целочисленная последовательность почти аналогична последовательности «n появляется n раз» ( OEIS A002024 ) и может быть получена как
floor(sqrt(2*n)+.5)
гдеn
0,1,2,3, .... Умножение на2j*pi/3
, гдеj
мнимая единица, производит желаемые сложные смещения.Смещения накапливаются для вычисления позиций, соответствующих целым числам в спирали. Первое целое число в спирали, которое
1
произвольно расположено в положении1
в комплексной плоскости.Наконец, позиции, соответствующие непростым числам, отбрасываются, а остальные отображаются в комплексной плоскости.
источник
.png
файл, который будет отображаться на веб-странице @AlexAplot(1:5)
), и он производит текстово-графический вывод! matl.tryitonline.net/#code=NTpYRw&input= @AlexA. Как это??Рисование должно быть сделано с
LaTeX / PGF, 527
594байта527 байт - это полный документ, как указано выше, т.е. включает преамбулу и параметр (здесь 4000, то есть ~ 523 без параметра). Создает файл PDF.
Основная идея: ну просто нарисуй. Использует матричное преобразование для треугольной сетки. Единственная проблема заключается в том, что трансформации влияют (и растягиваются) и на точки. Поэтому я выбираю для маркеров эллипса :), что я имею в виду под вторым изображением (n = 250, 5pt).
Еще одна оговорка: из-за максимального размера стека TeX может обрабатываться только чуть меньше 5000. Первое изображение для n = 4000. Видимо можно увеличить размер стека , я не пробовал.
Использует PGF
isprime()
.Ungolfed:
источник
lualatex
или другой динамически размещаемый компилятор должен позволить вам обойти размер стека, если я правильно понимаю ваш соответствующий комментарий. Так что это не ограничение вашего ответа, просто большинство реализаций, где вы его запускаете.Mathematica, 94 байта
Результат
источник
Python, 263 байта
Будучи новичком в Python, безусловно, есть место для улучшения :)
Пример:
источник
s=[];X=[];Y=[];i=1;x=0;y=0
доs=X=Y=[];i=1;x=y=0;
x=y=0
.R, 137 байт
Используются только встроенные функции, даже для простых чисел. Учитывая векторизованный подход вместо итеративного, он быстрый, но не может обрабатывать огромные числа.
Golfed:
Ungolfed:
Пример:
источник