Мои проблемы, как правило, немного сложны и непривлекательны. Так что тут что-то легкое и веселое.
Последовательность Алкуина
Последовательность Алкуина A(n)
определяется путем подсчета треугольников. A(n)
это число треугольников с целыми сторонами и периметром n
. Эта последовательность названа в честь Алкуина Йоркского.
Первые несколько элементов этой последовательности, начиная с n = 0
:
0, 0, 0, 1, 0, 1, 1, 2, 1, 3, 2, 4, 3, 5, 4, 7, 5, 8, 7, 10, 8, ...
Например A(9) = 3
, потому что единственными треугольниками с целыми сторонами и периметром 9
являются 1 - 4 - 4
, 3 - 3 - 3
и 2 - 3 - 4
. Вы можете увидеть 3 действительных треугольника внизу.
В этой последовательности есть довольно интересный паттерн. Например A(2*k) = A(2*k - 3)
.
Для получения дополнительной информации см. A005044 на OEIS.
Вызов
Но ваша задача заключается в двоичном представлении этих чисел. Если мы преобразуем каждый порядковый номер в его двоичное представление, помещаем их в векторы столбцов и выстраиваем их в линию, это создает довольно интересную двоичную картину.
На следующем рисунке вы можете увидеть двоичное представление порядковых номеров A(0), A(1), ..., A(149)
. В первом столбце вы можете увидеть двоичное представление A(1)
, во втором столбце представление A(1)
и так далее.
Вы можете увидеть какой-то повторяющийся узор на этой картинке. Это даже выглядит как фракталы, если вы посмотрите, например, на изображение с порядковыми номерами A(600), A(601), ..., A(899)
.
Ваша задача - создать такой образ. Ваша функция, ваш скрипт получит два целых числа 0 <= m < n
, и он должен сгенерировать двоичное изображение последовательности Алкуина A(m), A(m+1), A(m+2), ..., A(n-2), A(n-1)
. Таким образом, на входе 0, 150
генерируется первое изображение, на входе 600, 900
- второе изображение.
Вы можете использовать любой популярный графический формат, который вы хотите. Скажем, каждый формат, который можно преобразовать в png, используя image.online-convert.com . Кроме того, вы можете отобразить изображение на экране. Не допускаются первые белые ряды!
Это код-гольф. Таким образом, самый короткий код (в байтах) выигрывает.
white=1 and black=0
или наоборот?white=0 and black=1
. Так что наоборот.A(0)
создает белый столбец,A(9)=3
создает белый столбец с двумя черными пикселями внизу.0,0,0,1,0,2
пока список в начале вопроса говорит0,0,0,1,0,1
.Ответы:
J (
5245 (кодовая страница 437))Это будет разрешено (я думаю)
Шестнадцатеричный дамп
(Ничего особенного, черный квадрат - это DB 16 или 219 10 в кодовой странице 437.)
использование
Это выводится следующим образом (теги кода запутывают это, добавляя пробел между строками):
В стандартной консоли J интервал между строками отсутствует, поэтому я называю правило «В противном случае вы можете отобразить изображение на экране». (Нигде не сказано, что это изображение должно быть представлено как разумный формат изображения внутри)
РЕДАКТИРОВАТЬ: Jconsole (в отличие от JQT) использует кодовую страницу 437 по умолчанию и правильно отображает прямоугольники при использовании их из строки.
источник
Mathematica,
12612212189 байтЭто определяет безымянную функцию, принимающую два целых числа в качестве параметров и отображающую изображение на экране. Он отображает каждый квадрат как один пиксель, но при желании вы можете увеличить масштаб.
Сейчас я использую явную формулу, приведенную в статье OEIS (первая в разделе Mathematica, спасибо Дэвиду Каррахеру за указание на это). Это также невероятно быстро сейчас.
Вот код с отступом и несколькими комментариями:
Вот вывод для
0, 600
:источник
Image[1 - Thread@IntegerDigits[ l = Round[If[EvenQ[#], #^2, (# + 3)^2]/48] & /@ Range@##, 2, \[LeftCeiling]2~Log~Max@l\[RightCeiling]]] &
CJam (
56 5553 символов) / GolfScript (64 символа)CJam:
GolfScript:
Оба производят вывод в формате NetPBM, и они по существу являются портами друг друга.
рассечение
Благодаря Оптимизатору для CJam 56 -> 53.
источник
'PoXq~{_1&3*+_*24+48/}%>_:e>2b,\2_$#f+2fbz(,@@]e_N*
Пиф -
1016059Выходы а
.pbm
. Скорее всего, можно играть в гольф больше.Очень безнравственный, потому что я буду переводить на Pyth.Объяснение будет дальше. Прямо сейчас посмотрите на эквивалентный код Python.Он использует алгоритм OEIS для вычисления последовательности, а затем преобразует в двоичную форму, дополняет числа, выполняет поворот матрицы и форматирует ее в
pbm
изображение. Поскольку я не использую грубую силу, это невероятно быстро.Вот
600,900
пример:Попробуйте здесь онлайн .
источник
R -
127125Я не уверен, полностью ли это соответствует правилам. Он не выводит изображение в файл, но создает растр и выводит его на устройство вывода.
Я нашел ту же формулу, что и Мартин, но здесь .
Он использует безымянную функцию.
Запустить следующим образом
Производит следующий сюжет
источник
raster
к пространству имен, такraster()
как это единственная вещь, специфичная для этого пакета. Вместо этого просто делайraster::raster(...)
.Python 2
+ PIL,255184Моя первая версия использовала PIL, чтобы показать изображение:
Новая версия просто создает черно-белый PPM-образ на stdout:
источник
for
. Вы можете избежать скобок вокругx%2
, изменив порядок наx%2*...
. Короче не определять печать как функцию, а просто использовать два вложенныхfor
цикла, используя,print ...,
чтобы избежатьprint
новых строк и пробел, чтобы начать новую строку. Хитрость, чтобы заставить двоичные расширения иметь длинуh
безzfill
добавления2**h
, состоит в том, чтобы добавить , а затем извлечь последниеh
цифры.ЯВАСЦРИПТ - 291
Код:
Объяснение:
Результат:
Да результат с ног на голову, но это потому , что
0,0
наjs canvas
вверху слева. : 3Демо-версия:
Демо на jsfiddle
источник