Codegolf — Двоичные Изображения Числа Треугольников

  • Автор темы Irasamara75
  • Обновлено
  • 22, Oct 2024
  • #1

Мои задачи, как правило, немного сложны и непривлекательны. Итак, здесь что-то легкое и веселое.

Последовательность Алкуина

Последовательность Алкуина

 600, 900 
is defined by counting triangles. 0, 150 - количество треугольников с целыми сторонами и периметром A(m), A(m+1), A(m+2), ..., A(n-2), A(n-1) . This sequence is called after Alcuin of York.

Первые несколько элементов этой последовательности, начиная с 0 <= m < n are:

A(600), A(601), ..., A(899)

Например A(1) , because the only triangles with integer sides and perimeter A(1) являются A(0), A(1), ..., A(149) , A(2*k) = A(2*k - 3) и 2 - 3 - 4 . You can see the 3 valid triangles down below.

codegolf — двоичные изображения числа треугольников

В этой последовательности есть несколько весьма интересных закономерностей. Например 3 - 3 - 3 .

Для получения дополнительной информации см. А005044 на ОЭИС.

Испытание

Но ваша задача заключается в двоичном представлении этих чисел. Если мы преобразуем каждый порядковый номер в его двоичное представление, поместим их в векторы-столбцы и выстроим в линию, получится довольно интересная двоичная картина.

На следующем рисунке вы можете увидеть двоичное представление порядковых номеров. 1 - 4 - 4 . In the first column you can see the binary representation of 9 , во втором столбце представление A(9) = 3 , and so on.

codegolf — двоичные изображения числа треугольников

На этой картинке вы можете увидеть какой-то повторяющийся узор. Это даже похоже на фракталы, если посмотреть, например, на изображение с порядковыми номерами. 0, 0, 0, 1, 0, 1, 1, 2, 1, 3, 2, 4, 3, 5, 4, 7, 5, 8, 7, 10, 8, ... .

codegolf — двоичные изображения числа треугольников

Ваша задача — создать такой образ. Ваша функция, ваш скрипт получит два целых числа n = 0 , and it has to generate the binary image of Alcuin's sequence n . Итак, вход A(n) generates the first picture, the input A(n) вторая картинка.

Вы можете использовать любой популярный графический формат. Допустим, каждый формат, который можно преобразовать в PNG, используя image.online-convert.com. Альтернативно вы можете вывести изображение на экран. Никакие ведущие белые строки не допускаются!

Это код-гольф. Таким образом, побеждает самый короткий код (в байтах).

#code-golf #graphical-output #sequence #binary

Irasamara75


Рег
11 May, 2011

Тем
74

Постов
184

Баллов
574
  • 26, Oct 2024
  • #2

Математика, 126 122 121 89 байт

 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 ' ⎕'[⊤⌊12÷⍨6+×⍨⊥⊖0 2⊤…⎕]

⎕  take the second and first inputs

…   create an inclusive range between them

0 2⊤    encode into parts of 0 & 2

⊖        reverse the columns

⊥         decode from base 2

(this calculates (n+3×(n%2))/2)

×⍨          square that

⌊12÷⍨6+            divide by 12, round to the nearest integer               

⊤                   encode in base 2

(this gives a binary matrix witht the required graph)
' ⎕'[                  ] convert 0s to ' ' and 1s to '⎕'
 

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

Сейчас я использую явную формулу, заданную в статье OEIS (первый в разделе Mathematica, спасибо Дэвиду Карраеру за указание на это). Это также невероятно быстро сейчас.

Вот код с отступом и несколькими комментариями:

.5+12÷⍨ → 12÷⍨6+

Вот результат для ' ⎕'[⊤⌊12÷⍨6+×⍨⊥⊖0 2⊤…⎕] :

 

IceMan_T


Рег
17 Sep, 2007

Тем
65

Постов
201

Баллов
546
  • 26, Oct 2024
  • #3

CJam (56 55 53 символов) / GolfScript (64 символа)

СиДжем:

js canvas

Гольфскрипт:

0,0

Оба выдают выходные данные в формате NetPBM и, по сути, являются портами друг друга.

Диссекция

(function (a, b, c) { //setting canvas width c.width = b; //get context 2d of canvas t = c.getContext('2d'); //setting storke style. t.strokeStyle = 'black'; //looping from a to b for (i = a; i <= b; i++) { //calculating A(i) and converting it to a binary string g = (Math.floor(((i * i) + 6 * i * (i % 2) + 24) / 48) >>> 0).toString(2); //looping through that string for (j = 0; j < g.length; j++) { //since canvas is upside down and the first digit is actually the last digit: if (g[g.length - 1 - j] == '1') { //we create the 1 by 1 rect t.rect(i - a, j, 1, 1); //we draw the rect t.fill(); } } } //we append everything to the body document.body.appendChild(c); //parameters are put here })(0, 300, document.createElement('canvas'))

Благодаря Оптимизатор для CJam 56 -> 53.

 

Shestopalka


Рег
02 Jun, 2009

Тем
80

Постов
185

Баллов
605
  • 26, Oct 2024
  • #4

Пиф - 101 60 59

Выводит (function(a,b,c){c.width=b;t=c.getContext('2d');t.strokeStyle='black';for(i=a;i<=b;i++){g=(Math.floor(((i*i)+6*i*(i%2)+24)/48)>>>0).toString(2);l=g.length;for(j=0;j<l;j++){if(g[l-1-j]=='1'){t.rect(i-a,j,1,1);t.fill();}}}document.body.appendChild(c);})(0,300,document.createElement('canvas')) . Can likely be golfed more.

i,R,B=input,range,lambda x:bin((x*x+6*x*(x%2)+24)/48)[2:] def p(s):print s a,b=i(),i();h=len(B(b));p('P1 %i %i'%(b-a,h)) [p(' '.join([B(x).zfill(h)[y] for x in R(a,b)])) for y in R(h)]

Очень неинтересно, потому что я буду переводить на Пит.

Объяснение будет следующим. Прямо сейчас посмотрите на эквивалентный код Python.

Он использует алгоритм OEIS для вычисления последовательности, а затем преобразует его в двоичный формат, дополняет числа, выполняет поворот матрицы и форматирует ее в i,R,B=input,range,lambda x:bin((x*x+6*x*(x%2)+24)/48)[2:] def F(k,v):i.load()[k]=v a,b=i(),i();h=len(B(b));from PIL import Image;i=Image.new('P',(b-a,h)) [F((x-a,y),int(B(x).zfill(h)[y])) for x in R(a,b) for y in R(h)] i.putpalette([255]*3+[0]*3) i.show() image. Since I'm not using brute force, it is incredibly fast.

A=:[:|:' █'{~[:#:[:([:<.48%~*:+24+6*]*2|])(}.i.) 0 A 100 █ █████████████████████ █ ██████████████████████ █ █ █████ █ ██████████████ █ █ ██████████ █ █ ██████ █ █ ██████████ █ █ ██████ █ █ ████ █ █ ████ █ █ ██ █ █ ██ █ █ █ █ ██████ █ █ ████ █ █ ██ █ █ ██ █ █ █ █ █ █ ██ ██ ██ ██ ██ ██ ██ ██ █ ████ █ █ ██ █ █ █ █ ██ ██ ██ ██ ██ █ █ █ █ ██ █ █ ████ █ █ ██ █ █ ██ ██ ██ █ █ ██ █ █ ██ █ █ ██ ██ ██ █ █ ██ █ █ ██ ██ ██ ██ █ █ ██ ██ ██ ██ █ █ ██ ██ ██ ██ █ █ ██ ██ ██ ██ █ █ 2000 A 2100 ████████████████████████████████████████████████████████████████████████████████████████████████████ ████████████████████████████████████████████████████████████████████████████████████████████████████ █ █████████████████████ █ ██████████████████████████████████████████████ █ █ ██████████████████████ █ █ ██████████████████████ █ █████ █ █ ██████████ █ █ ██████████ █ █ ██████████ █ █ █████████ ████ █ █ ████ █ █ ████ █ █ ████ █ █ ████ █ █ ████ █ █ ████ █ █ ████ █ █ ███ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ ██ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ ██ ██ █ █ ██ ██ ██ ██ ██ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ █ ██ ██ ██ ██ ██ █ █ ██ ██ ██ █ █ ██ ██ ██ █ █ █ █ █ █ █ █ █ █ █ █ █ █ ██ ██ ██ █ █ █ █ ██ █ █ ██ █ ██ █ █ ██ █ █ ██ █ █ ██ █ █ █ █ █ █ █ █ █ █ ██ ██ ██ █ █ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ ██ █ █ █ █ █ █ ██ █ █ ██ █ █ ████ █ █ ██████ █ █ █ █ ████ █ █ ██ █ █ █ █ ██ ██ ██ ██ ██ █ █ █ █ ██ █ █ ████ █ █ ██ █ █ ██ █ █ ██ ██ ██ █ █ ██ █ █ ██ █ █ ██ ██ ██ █ █ █ ██ ██ ██ █ █ ██ ██ ██ ██ █ █ ██ ██ ██ ██ █ █ ██ ██ ██ ██ █ █ ██ ██

Вот 0000: 5b 3a 7c 3a 27 20 db 27 7b 7e 5b 3a 23 3a 5b 3a [:|:' .'{~[:#:[: 0010: 28 5b 3a 3c 2e 34 38 25 7e 2a 3a 2b 32 34 2b 36 ([:<.48%~*:+24+6 0020: 2a 5d 2a 32 7c 5d 29 28 7d 2e 69 2e 29 *]*2|])(}.i.) example:

Попробуйте здесь онлайн.

 

Aroandotick


Рег
22 Dec, 2013

Тем
75

Постов
205

Баллов
590
  • 26, Oct 2024
  • #5

Р - 127 125

Я не уверен, что это полностью соответствует правилам. Он не выводит изображение в файл, но создает растр и выводит его на устройство вывода.

Я нашел ту же формулу, что и Мартин, но здесь.

Он использует безымянную функцию.

[:|:' █'{~[:#:[:([:<.48%~*:+24+6*]*2|])(}.i.)

Запустите следующим образом

require(raster);(function(m,n)plot(raster(mapply(function(n)rev(as.integer(intToBits(round((n+n%%2*3)^2/48)))),m:n),0,n,0,32)))(0,600)

Производит следующий сюжет

 

Awailliat25


Рег
25 Oct, 2024

Тем
68

Постов
198

Баллов
558
  • 26, Oct 2024
  • #6

J (52 45 (Кодовая страница 437))

Это будет разрешено (я думаю)

require(raster);function(m,n)plot(raster(mapply(function(n)rev(as.integer(intToBits(round((n+n%%2*3)^2/48)))),m:n),0,n,0,32))

Шестнадцатеричный дамп

(Ничего особенного, черный квадрат — это БД.16 или 21910 в кодовой странице 437.)

600,900

Использование

Это выводит следующее (теги кода все портят, добавляя пробелы между строками):

K= m rvzQ Map from eval input to eval input .B Binary rep / 48 Divided by 48 ++ Triple sum 24 Of 24, *dd Square of d ** Triple product 6 6 %d2 Modulo d%2 d Var d J Set J= C Matrix rotation from columns of row to rows of columns m K Map K (This does padding) + String concat * String repeat \0 "0" - ld Subtract the length of the column from eS The max mlkK Of all the column lengths d The column "P1" Print header "P1" l Length of hJ First row lJ Number of columns jb Join by linebreaks m J Map on to J jb Joined columns by linb d

В стандартной J-консоли пробелов между строками нет, поэтому я называю правило «В качестве альтернативы вы можете вывести изображение на экран». (Нигде не сказано, что это изображение должно быть внутренне представлено как разумный формат изображения)

РЕДАКТИРОВАТЬ: Jconsole (в отличие от JQT) использует кодовую страницу 437 по умолчанию и ДЕЙСТВИТЕЛЬНО отображает прямоугольники правильно при использовании их из строки.

 

MineEralfnofton


Рег
20 Oct, 2004

Тем
77

Постов
191

Баллов
596
  • 26, Oct 2024
  • #7

Питон 2 + PIL, 255 184

Моя первая версия использовала PIL для отображения изображения:

pbm

Новая версия просто создает черно-белое изображение PPM на стандартном выводе:

Km.B/++24*dd**6%d2d48rvzQJCm+*\0-eSmlkKlddK"P1"lhJlJjbmjbdJ ||answer||

ЯВАСКРИПТ - 291

Код:

.pbm

Объяснение:

CJam GolfScript Explanation "P1" "P1"\ NetPBM header q~,> ~,> Create array [m .. n-1] {_1&3*+_*24+48/}% {.1&3*+.*24+48/}% Map the sequence calculation _:e>2b,\ .$-1=2base,\ Compute image height H as highest bit in largest number in sequence 2_$#f+2fb {2.$?+2base}% Map sequence to bits, ensuring that each gives H bits by adding 2^H z(,@@ zip(,@@ Transpose and pull off dummy row to use its length as the "width" in the header :~~ {~}/ Flatten double array and dump on stack ]N* ]n* Separate everything with whitespace

Результат:

Да, результат перевернут, но это потому, что "P1"\~,>{.1&3*+.*24+48/}%.$-1=2base,\{2.$?+2base}%zip(,@@{~}/]n* on a "P1"q~,>{_1&3*+_*24+48/}%_:e>2b,\2_$#f+2fbz(,@@:~~]N* находится вверху слева. :3

Демо:

Демо на jsfiddle

 

Елена Герасимова


Рег
23 Oct, 2020

Тем
84

Постов
168

Баллов
618
  • 26, Oct 2024
  • #8

APL (расширенный диалог), 26 25 24 байта

0, 600

Попробуйте онлайн!

Принимает входные данные в обратном порядке (-1 байт).

-1 байт от Bubbler( Image[1-Thread@IntegerDigits[ (* 3. Convert each number to padded binary, transpose invert colours, and render as Image. *) l = Round[ (#+3#~Mod~2)^2/48 ] & /@ Range@##, (* 1. Turn input into a range and get the Alcuin number for each element. *) 2, ⌈2~Log~Max@l⌉ (* 2. Determine the maximum number of binary digits. *) ]] & )

Генерирует последовательность так же, как существующее решение J, за исключением того, что Бабблер сократил ее с помощью некоторых математических вычислений. объяснено здесь.

В качестве отображаемого символа используется '⎕'. Если требуется «█», то он становится 27 байтами (с ним выглядит лучше).

Объяснение

Image[1-Thread@IntegerDigits[l=Round[(#+3#~Mod~2)^2/48]&/@Range@##,2,⌈2~Log~Max@l⌉]]&
 

Psihkakihmalo


Рег
26 Mar, 2011

Тем
59

Постов
206

Баллов
521
Тем
403,760
Комментарии
400,028
Опыт
2,418,908

Интересно