Отдых Пита Мондриана Композиция


23

Добрый день,

Ваша цель состоит в том, чтобы в наименьшем количестве байтов исходного кода воссоздать любую из картин «Композиции» Пита Мондриана (например, Композиция № 10 ).

Воссоздание может либо использовать фактические цвета, либо заменить их соответствующими цветами из 16-цветовой палитры Windows Default.

Ваш отдых может быть выведен в формате PNG, BMP или NetPBM, либо в файл, либо в STDOUT, либо непосредственно на экран.

Ваш отдых должен быть разрешением 512x512 или выше.

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

Ваша оценка будет размером вашего исходного файла в байтах.

Пожалуйста, укажите в своей записи, какую картину вы воссоздаете, и предоставьте ссылку на оригинал и фотографию вашего отдыха.

Удачи.


Шаг первый: найдите язык со встроенным кодировщиком PNG, BMP или NetPBM.
Джон Дворжак

6
Соответствующий: Пит
Гриффин

4
Это сложный язык для работы ... время от времени я пытаюсь сделать вывод Quine NetPBM ... но да. Я буду очень впечатлен, если кто-нибудь сможет воссоздать Пита Мондриана в Пите!
lochok

2
Можем ли мы вывести символьную графику, используя экранирование терминалов и блокировать рисование символов? (например. ▃▃▌) Или это лучше всего представить как другую проблему?
Tobia

2
@lochok Я бы предложил вознаграждение за ответ Пита, если кто-то серьезно заинтересован в попытках.
Джерри Иеремия

Ответы:


14

Тикз, 175 байт

Композиция III в черном и белом , 175 байтов

\documentclass[tikz]{standalone}\begin{document}\tikz{\def\b{;\draw[line width=}\def\a{)--(}\clip(1,1\a1,5\a5,5\a5,1)\b2mm](0,4\a6,4\a6,3\a4,3)\b1mm](4,0\a4,5);}\end{document}

Проверьте это в блогосфере

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

объяснение

Существует немного обертки, которая связана с каждым ответом tikz. Обертка это:

\documentclass[tikz]{standalone}\begin{document}\tikz{
}\end{document}

Как только вы обойдете оболочку, есть несколько \defоператоров, которые сохраняют байты, но, к сожалению, запутывают код:

\def\b{;\draw[line width=}\def\a{)--(}

Если мы сделаем все правильные замены, наш код будет выглядеть примерно так:

\clip(1,1)--(1,5)--(5,5)--(5,1);
\draw[line width=2mm](0,4)--(6,4)--(6,3)--(4,3);
\draw[line width=1mm](4,0)--(4,5);

Первый бит \clipочень важен, но пока мы его пропустим.

Теперь мы рисуем первую линию на чистом холсте. Эта линия довольно толстая, поэтому мы используем [line width=2mm]для установки толщины 2mm:

\draw[line width=2mm](0,4)--(6,4)--(6,3)--(4,3);

Это соединяет пару узлов и создает эту форму:

Затем мы \drawвыполняем второй штрих, однако этот ход будет тоньше, поэтому мы должны установить толщину линии 1mm:

\draw[line width=1mm](4,0)--(4,5);

Теперь наша картина выглядит так:

Это близко к оригиналу, но не совсем, так что вот где \clipвступает в игру. Мы используем, \clipчтобы удалить все лишние строки с нашего холста и установить правильный размер холста. С измененным размером холста мы получаем изображение:

Композиция III в черно-белом


Композиция с желтой заплатой , 214 байтов

\documentclass[tikz]{standalone}\begin{document}\tikz[line width=2mm]{\clip(1,1)rectangle(7,7);\draw(0,8)rectangle(4,3.5)rectangle(6.5,1.2)rectangle(4,0);\draw[fill=yellow](6.5,3.5)rectangle(8,2.5);}\end{document}

Оцените это в CyberSpace

Объяснение приехать


Композиция II в синем и желтом цвете , 225 байтов

\documentclass[tikz]{standalone}\begin{document}\tikz[line width=2mm]{\clip(1,1)rectangle(7,10);\draw(8,9)rectangle(3,6)rectangle(0,0);\draw[fill=yellow](0,0)rectangle(3,2);\draw[fill=blue](0,11)rectangle(3,9);}\end{document}

Оцените это через Webbernetz!

Объяснение приехать


Композиция B (№ 2) в красном , 232 байта

\documentclass[tikz]{standalone}\begin{document}\tikz[line width=2mm]{\clip(1,1)rectangle(10,13);\draw[line width=1mm](1.2,5)--(1.2,9);\draw[fill=red](0,14)rectangle(5,9);\draw(0,9)rectangle(11,5)(7,0)rectangle(5,14);}\end{document}

Попытайтесь сделать это в Интернете!

объяснение

Сначала приведем код с вставленными переносами строк, чтобы сделать его более читабельным:

\documentclass[tikz]{standalone}
\begin{document}
\tikz[line width=2mm]{
\clip(1,1)rectangle(10,13);
\draw[line width=1mm](1.2,5)--(1.2,9);
\draw[fill=red](0,14)rectangle(5,9);
\draw(0,9)rectangle(11,5)(7,0)rectangle(5,14);
}
\end{document}

Первая интересная команда

\draw[fill=red](0,14)rectangle(5,9);

Это рисует красный прямоугольник с черным контуром. Для верхнего левого угла картины.

Затем мы рисуем еще два прямоугольника с белыми внутренностями и черными контурами, чтобы создать сетку на картине.

\draw(0,9)rectangle(11,5)(7,0)rectangle(5,14);

Затем мы рисуем тонкую линию

\draw[line width=1mm](1.2,5)--(1.2,9);

И обрезать изображение до нужного размера

\clip(1,1)rectangle(10,13);


Композиция II красного, синего и желтого цветов, 251 байт

\documentclass[tikz]{standalone}\begin{document}\tikz[line width=1mm]{\clip(1,1)rectangle(9,9);\draw[fill=yellow](8.5,6)--(0,6)--(8.5,6)--(8.5,2)rectangle(10,0);\draw[fill=red](3,3)rectangle(10,10);\draw[fill=blue](0,0)rectangle(3,3);}\end{document}

Проверьте это на World Wide Web!

объяснение

Сначала я вставлю несколько разрывов строк, чтобы сделать мой код читабельным

\documentclass[tikz]{standalone}
\begin{document}
\tikz[line width=1mm]{
\clip(1,1)rectangle(9,9);
\draw[fill=yellow](8.5,6)--(0,6)--(8.5,6)--(8.5,2)rectangle(10,0);
\draw[fill=red](3,3)rectangle(10,10);
\draw[fill=blue](0,0)rectangle(3,3);
}
\end{document}

Первая линия важности:

\draw[fill=yellow](8.5,6)--(0,6)--(8.5,6)--(8.5,2)rectangle(10,0);

Это рисует следующую форму:

Эта странная форма - желтый прямоугольник в правом нижнем углу и две линии, которые не являются краями цветного прямоугольника. Затем мы вставляем красный квадрат и закрываем дополнительные линии, сделанные последней формой:

\draw[fill=red](3,3)rectangle(10,10);

Это выглядит как:

Теперь мы вставляем наш синий квадрат:

\draw[fill=blue](0,0)rectangle(3,3);

Теперь все, что осталось, это обрезать все ненужные части изображения, используя \clip

\clip(1,1)rectangle(10,10);

Композиция II в красном, синем и желтом


Композиция II , 308 байтов

\documentclass[tikz]{standalone}\begin{document}\tikz[line width=2mm]{\clip(1,1)rectangle(12.6,13);\draw(0,0)rectangle(10,4)rectangle(2,12)--(0,12);\draw[fill=red](10,1.6)rectangle(14,0);\draw[fill=yellow](6,12)rectangle(10,14);\draw[fill=blue](0,4)rectangle(2,8);\fill(10,10)rectangle(14,14);}\end{document}

Проверьте это на Информации-Супер-Шоссе

Объяснение приехать


12

Mathematica 202 287 байт.

Просто для удовольствия! 330 байтов: Мондриан с "Boogie Woogie" в названии

Column[{"Boogie Woogie", Grid[{{"",i["",b->Red],\[SpanFromLeft]},{"",\[SpanFromAbove],\[SpanFromBoth]},{i["",b->Blue],"",""},{\[SpanFromAbove],\[SpanFromAbove],i["",b -> Yellow]}},Dividers->{{2->t@5,3->t@6},{2->t@9,3->t@7,4->t@6}},ItemSize->{{1->3,2->9,3->1},{1->6,2->6,3->2,4->2}}]},Alignment->Center]

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


Фактическая подача [287 байт]

\[SpanFromLeft]и подобные выражения занимают примерно 85 байтов. В mathematica каждое такое выражение имеет свой отдельный символьный символ.

t=Thickness;b=Background;i=Item;
Grid[{{"",i["",b->Red], \[SpanFromLeft]},{"",\[SpanFromAbove],\[SpanFromBoth]},{i["",b->Blue],"",""},{\[SpanFromAbove],\[SpanFromAbove],i[ "",b->Yellow]}},
Dividers->{{2->t@5, 3->t@6},{2->t@9,3->t@7,4->t@6}},ItemSize->{{1->3, 2->9, 3->1},
{1->6, 2->6, 3->2, 4->2}}] 

бок о бок

Выход слева; фотография Пита Мондриана, красно-синяя желтая композиция справа.


3
Хорошая попытка. Вы не получаете награду так легко.
Пшеничный Волшебник

11

Рубин, 112 (111) символов

Пит Мондриан - композиция в си (№ II) с красным

b="0 "*9
w="2 "*9
puts"P3 609 771 2",["1 0 0 "*267,w*8+b*2+w*79,w*89].map{|x|(x+b*3+w*42+b*3+w*66)*249}*(b*2436)

моя постановка слева, увеличенная ссылка справа.

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

Цвета могут быть слегка изменены - с точностью до 1/9 - без потери оценки путем настройки максимального значения в PPM. Я выбрал «подходящий цвет Win16». 8/9 белый, вероятно, ближе к оригинальному цвету холста, но 9/9 ближе к замыслу автора.

Один символ может быть сохранен , если заменить "1 0 0 "с (w+b+b)(# F00 красный). Я считаю, что считается "достаточно близко"

версия файла (не игра в гольф)

File.open "tmp.ppm", ?w do |f|
    b="0 "
    w="2 "
    s=b*27+w*378+b*27+w*594
    f.puts"P3 609 771 2",["1 0 0 "*267,w*72+b*18+w*711,w*801].map{|x|(x+s)*249}*(b*21924)
end

Легко: "0 "->b
Говард

@ Говард, черт возьми. Пропустил этот во время минимизации. Спасибо
Джон Дворжак

И еще, если вы измените w="2 "на w="2 "*9и bтакже.
Говард

хм ... я понимаю (это продолжается вечно)
дверная ручка

@ Doorknob сохраните это как ppmфайл и откройте в графическом редакторе
Джон Дворжак

9

SmileBASIC, 2774 1892 байта

Бродвейские буги-вуги

GCLS-920851D$="w$BȜąr:BȂąr7?Ƣǘy1SƑǘb<?ŵǘw-/ƶvyFMƮeb<<ŶIr:,ėǭy:Sėǘw-LŒƄw7;ėƎrkLćƄrBMĜey26ğ¸bKBē²y,Bć²w<Dđïw+DüïyDÒïw--çvyU8Òpw.1±syBM¨eb;<Iy28¥żrJNůbwN{ůr?@Ǣb3>Sǭw.Fb¤w24D­rMF5¤w,7Nnr[75ny1X=e
FOR I=1TO 36G A(),A(),A(),A(),A()NEXT
D$=" w*+r6,r1+b<*w1+b/+b++r(+w*+w,Br )b+*b()w0,w=+b,,r5+b1+r ,w24-Ȃ  w  w#.r-#-Ǥ  w*+r4,b3+r6*w2+b,-r-,b++r*+b**r(*b(*r*+b<-w@+b -w ,r4+b1+b%-w,5-ǔ  w +r)+w?#-ƹǘ w +r%-b,#-ƭ +w *r +w/,b2,r1-b;-w7+b*.w5+r1+r +-ƒ> w +r'-b*#-ž *r+)w +r?+b:+b1-b2+w:+w*+w3-b4-r4-b6,w2+r--w3+b1+r )w52-ş  w*+r )w ,b>+r7+b :w -b,+r:+w*+w7,r 6w ,r7-r0.w/+bM+b1+b ,w24-ľ *w +r)+r *w5+r9,b7.w++w ,r.+w*+w6*b Dw *r06w -r5+b *w8+w +r1+b ,w *r(7-ü  w*+w )b +w*+r*+bD-rC/r7+b*+r5+bD-r,.b/.w.+b *w8+r +w1+b'+r,4-Ò  w*+b )w+*r+*w +b )w<0wX-w +r*+b /wd-w/.b/*w+-r 7w)+bC+r,3-p *w+)w +b*+w*+b )w@2wU*w+*w++wx-wQ-w.,bT+b,.-* +w +r++r5,w6+w %|üŭ w3+r1*w(+r0+r7*b (w )r3*w+*w,+r-*w +b5+r )w6+w.,r1+w *b*-w +b *w(,r()w ,r+*r :| ȋ+w7*b 1w4)w +r %|şǷ+r,*w)+w.*w*)w ?r -w+'|pǷ)w,)w +b*#| Ƿ+r/+b()w ?r -w+*w),r(*w *b +w *r +| Ǣ w+(w +b1*w(+r0+b7)b *w *r2)w +b *w,+r7+b5+r )w6+b/+b )w1,r7+b.*b9*w +b*8| Ǎ w3+w )b0*w +r4)w +r/+w**w**b +w6+w )r1*b3+w /|üň+b-*w1+w%*r(-w +r *w.+w')r (w5*| ň w3+w )r0*w +b )r5*b/+w3+w *r +w *r,+w9+r3+w-*b (w +r,+b2,w /r3+b0)r *b+-w+*r :| ij w3+b )w)*r 'w +b (w+)w *r1+b0*w.+r6+b )w0)w,)w +b4+w +b0)w'*r1*b))w+*b.*b1(w+*r ;| 3w +b )w*)b 'w +b.)r 'w )b0+r <b,+b6+b.,b=+r 3w ,b +w *b 6w *r);b)+b7+b 1w=9| Z w3+r (w.-w +b1+w +r0+r )w +r (w,+r6+b *w),r8+b?+bJ*w:)w+)w.*r1)w+*r 7| >+r )w6+r2*b1+r6*b1*w +b*(| ,
FOR Q=1TO 27S=A()T=A()R=A()L=A()FOR I=1TO L
R A(),89R A(),A()NEXT
NEXT
DEF A()RETURN-32+ASC(POP(D$))END
DEF R L,C
IF L THEN IF R-13THEN G C,L,11,T,S:T=T+L ELSE G C,11,L,T,S:S=S+L
END
DEF G C,H,W,Y,X
GFILL X,Y,X+W-1,Y+H-1,-1716698*(C>88)-2302505*(C==87)-6080725*(C==82)-14597488*(C<67)END

Скриншот

Каждая из «строк» ​​в изображении хранится в этом формате:

x,y,direction,numberOfSegments,
yellowLength,nextColor,colorLength,
yellowLength,nextColor,colorLength,...

Все числа хранятся как CHR$(number+32), цвета хранятся как один символ; w, y, r, Или b, и направление хранится в виде |или-

Дополнительные прямоугольники просто хранятся как:

x,y,width,height,color,
x,y,width,height,color,...

Точно так же.


Ницца! Я думал о создании QBasic, но нет режима экрана 512x512.
DLosc

Мне очень повезло; Графические страницы SmileBASIC имеют
размер 512х512

7

SVG - 455 480- композиция Мондриана II красного, синего и желтого цветов

Если вы можете встраивать Javascript в SVG и делать его динамичным, это язык программирования. Ergo, это программа. Оказывается, если в SVG отсутствует координата xили yкоордината, по умолчанию используется значение 0. Также redкороче, чем #f00!

<?xml version="1.0" encoding="utf-8"?><svg xmlns="http://www.w3.org/2000/svg"><rect x="145" fill="red" width="455" height="440"/><rect y="432" fill="#00F" width="150" height="168"/><rect x="550" y="517" fill="#FF0" width="50" height="83"/><rect x="140" width="16" height="600"/><rect y="430" width="600" height="16"/><rect y="180" width="140" height="25"/><rect x="550" y="430" width="15" height="170"/><rect x="550" y="515" width="50" height="16"/></svg>

Довольно печатные:

<?xml version="1.0" encoding="utf-8"?>
<svg xmlns="http://www.w3.org/2000/svg">
  <rect x="145" fill="red" width="455" height="440"/>
  <rect y="432" fill="#00F" width="150" height="168"/>
  <rect x="550" y="517" fill="#FF0" width="50" height="83"/>
  <rect x="140" width="16" height="600"/>
  <rect y="430" width="600" height="16"/>
  <rect y="180" width="140" height="25"/>
  <rect x="550" y="430" width="15" height="170"/>
  <rect x="550" y="515" width="50" height="16"/>
</svg>

Подождите, я думал, что Композиция B (№ II) с Красным 1935 была № 2
Джон Дворжак

4
@JanDvorak Я не знаю, я только что посмотрел его в Википедии. Честно говоря, Пит был довольно ленивым художником. Они все выглядят одинаково.

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

@LegoStormtroopr Ленивый? Это довольно богато, происходит от парня, который тусуется на сайте, посвященном написанию коротких программ.
Boothby

1
@ Boothby Touche. Я собирался утверждать, что я многому научился у гольф-кода благодаря его гиперминималистическому подходу. Но ... то же самое можно сказать и о работе Пита.

3

SmileBASIC, 67 байт

GCLS-1GFILL 353,0,367,#R,0GFILL.,121,#R,156,0GFILL 367,266,#R,293,0

Я выбрал легкий: композиция III в черно-белом

К счастью, графическая страница SB имеет размер 512х512 пикселей, но не все умещается на экране 400х240, поэтому я не могу легко получить скриншот.

Разъяснение:

GCLS -1 'fill screen with &HFFFFFFFF (white)
GFILL 353,0,367,511,0 'draw vertical line in &H00000000 (black)
GFILL 0,121,#R,156,0 'draw horizontal line
GFILL 367,266,#R,293,0 'draw small horizontal line

3

Обработка, 15,447 15441 15.439 байт

String i="data:image/jpeg;base64,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";PImage x=loadImage(i);void draw(){image(x);}

Грубая сила, и мне не удалось найти способ удалить функцию рисования.

Это ошибки в основном процессоре, я думаю, потому что он слишком большой для b64. Вы можете проверить это здесь .

JS Fiddles все же обрезает его до 100 * 100px. Мой base64 работает, а онлайн-среда - нет. :(


Вы можете PImage x=loadImage(i);
Kritixi Lithos

1
Вопрос требует разрешения 512x512 или выше, но холст в вашей скрипке - только 100x100. Это причуда JSFiddle?
Деннис

@Dennis Это не только размер холста. Изображение обрезается как справа, так и снизу, что делает результат неправильным.
mbomb007

@ Деннис Да, это так. Ручная установка 512 * 512 px все еще обрезает его до того же размера. Это просто скрипка JS, а b64, который я использовал, больше 512.
Rɪᴋᴇʀ

data:;base64работает так же хорошо
Kritixi Lithos

2

Love2D, 4956 + 395 + 1 = 5351 байт

f=io.open("d","rb")s=f:read("*a"):gsub("(.)(.)",function(a,b)return a:rep(b:byte())end)o=love.image.newImageData(512,512)c={{244,243,248},{173,24,0},{250,209,5},{30,64,164}}o:mapPixel(function(x,y)i=math.floor((x+math.floor(y/4)*512)/4)O=3-i%4 n=s:sub(math.floor(i/4)+1,math.floor(i/4)+1)if n and#n>0 then b=math.floor(n:byte()/(4^O))%4 else b=0 end return unpack(c[b+1])end)o:encode("png","o") 

Файл данных хранится ЗДЕСЬ

Выход:

Выход

Оригинал:

оригинал

объяснение

f = io.open("d","rb")                                                   -- Open the image in raw format.
s = f:read("*a"):gsub("(.)(.)",function(a,b)return a:rep(b:byte())end)  -- And read it's contents. 
o=love.image.newImageData(512,512)                                      -- Make the output image
c = {{244,243,248},{173,24,0},{250,209,5},{30,64,164}}                  -- Build the Pallet
o:mapPixel(function(x,y)                                                -- Fill the image, based on a function
    i = (x+y*512)                                   -- The position this pixel exists on the string, 0 indexed.
    O = 3-i%4                                       -- The offset. The byte stores 4 pixels, so this is the id among a group of 4.
    n = s:sub(math.floor(i/4)+1,math.floor(i/4)+1)  -- And this gets the byte itself.
    if n and #n > 0 then                            -- Sometimes this is null and I don't like it.
        b = math.floor(n:byte()/(4^O))%4            -- /4^offset % 4 gives us the value of the index on the pallet.
    else
        b = 0                                       -- Fallback plan.
    end
    return unpack(c[b+1])                           -- Set the pixel to the colour required.
end)
o:encode("png","o") -- Store it in Appdata as "o", which is a png file.

Энкодер.

Это просто скрипт, который я использовал для кодирования изображения. Gif работал более сжато, но мне не нужно было показывать GIF.

img = love.image.newImageData("mondrian.jpg")
-- white    0
-- blue     3
-- yellow   2
-- red      1

cols = {{244,243,248},{173,24,0},{250,209,5},{30,64,164}}

local s = ""
for y = 0, 511 do
    for x = 0, 511 do
        local r,g,b = img:getPixel(x,y)
        local n = 0
        local D = math.huge
        for k,v in pairs(cols) do
            local d = (v[1]-r)^2 + (v[2]-g)^2 + (v[3]-b)^2
            if d < D then
                n = k-1
                D = d
            end
        end
        s = s .. n
    end
end
-- Convert base 4 to base 256
-- How many digits do we need- Every 4 digits
encd = ""
for str in s:gmatch"...." do
    local n = str:sub(1,1) * 4^3 +
              str:sub(2,2) * 4^2 +
              str:sub(3,3) * 4^1 +
              str:sub(4,4) * 4^0
    encd = encd .. string.char(n)
end

f = io.open("stored.dat","wb")

smlr = ""
lst = ""
c = 0
for s in encd:gmatch"." do
    if s == lst then
        c = c + 1
        while c > 255 do
            smlr = smlr .. lst .. string.char(255)
            c = c - 255
        end
    else
        if c > 0 then
            smlr = smlr .. lst .. string.char(c)
        end
        lst = s
        c = 1
    end
end

f:write(smlr)

В основном соревнуются за награду. Вероятно, есть лучшие способы сделать это, но я подумал, что было бы интересно попробовать использовать простую паллету и расшифровать длину прогона.

РЕДАКТИРОВАТЬ: входное изображение было упрощено, чуть менее точно, но на величину меньше байтов.


2
Почему части вашего вывода выглядят так, как будто они сделаны из кусочков головоломки? Это то, что вы подразумевали под «чуть менее точным, но на величину меньше байтов»? Мне кажется, что получающиеся разрывы в цветных полосах делают это недопустимым отдыхом.
DLosc
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.