Логотип Олімпійських ігор - Безкоштовне видання стилю [закрито]


30

У такому ж дусі, як це питання , ваша місія полягає у створенні найкращого вигляду логотипу з максимум 1К коду.

Правила:

  1. Максимум 1 К код (включно), без зовнішніх даних.

  2. Відповідь з найбільшою кількістю результатів виграє.

Веселіться!


6
Що ж, він заявив безпосередньо "в подібному дусі, як це питання ", тому він практично сказав "ей, я знаю, це дублікат": D
Майк Кох

5
Різні критерії виграшу. Тож це подібне питання, але не є дублікатом.
Віктор Стафуса

3
Я насправді радий, що хтось інший створив версію мого питання на популярність на конкурс із меншими критеріями, тому що, коли я писав це, мені було розірвано, куди йти.
Адам Марас

@AdamMaras Радий почути це :)
chubakueno

Я розпочав повторну дискусію про Meta , оскільки це питання не повинно було бути закритим.
Адам Марас

Відповіді:


44

SVG

1кБ? Розкіш. Я навіть можу сильно роздрукувати вихід, а не видаляти всі зайві пробіли. (Відступ, звичайно, використовує вкладки, які Маркдаун перетворює на пробіли, тому число лічильників може здатися більшим, ніж фактичне 977. Видалення непотрібного простору зменшує його до 861).

Перекриття обробляються правильно, малюючи кільця в одному напрямку, потім накладаючи затискач і малюючи їх в іншому напрямку. Кольори та співвідношення витягуються з офіційного документа, який чомусь використовує криві Безьє, а не кола.

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" width="504" height="228">
    <defs>
        <clipPath id="t">
            <rect width="504" height="114" />
        </clipPath>
    </defs>
    <g fill="none" stroke-width="12">
        <g id="u" transform="translate(82,82)" stroke="#0b8ed8">
            <g id="O">
                <circle r="72" stroke="#fff" stroke-width="20" />
                <circle r="72" />
            </g>
        </g>
        <g id="y" transform="translate(167,146)" stroke="#f9a91f">
            <use xlink:href="#O" />
        </g>
        <g id="k" transform="translate(252,82)" stroke="#231f20">
            <use xlink:href="#O" />
        </g>
        <g id="g" transform="translate(337,146)" stroke="#009e59">
            <use xlink:href="#O" />
        </g>
        <g transform="translate(422,82)" stroke="#ee2049">
            <use xlink:href="#O" />
        </g>
        <g clip-path="url(#t)">
            <use xlink:href="#g" />
            <use xlink:href="#k" />
            <use xlink:href="#y" />
            <use xlink:href="#u" />
        </g>
    </g>
</svg>

PNG візуалізація файлу SVG


16
PS Якщо хтось хоче заперечити, що SVG не є мовою програмування (і я дуже схильний погодитись), розгляньте цю програму PHP у стилі багатьох подань PHP на цей сайт, які просто перегукуються з буквальним текстом.
Пітер Тейлор

OMG це виглядає дивовижно, хоча. SVG is niceee

39

Javascript (core) - 1000 на крапку. - WebKit (Chrome)

Гра з полотном.

Не впевнений, що це 1024 або 1000, Kце для, але вдалося зменшити його до 1000 982 940: D

Підходить лише для веб-переглядачів WebKit. Chrome OK. Firefox безлад. Можливо, перегляньте, як зробити його перехресним браузером.


Код:

var w=window;w.onload=function(){function e(e,t){return r()*(t-e+1)+e}function d(e,t){function r(e,t,r,i){c.beginPath();c[u]="xor";c.strokeStyle="#"+e;c.arc(t,r,66,n*i[0],n*i[1]);c.stroke();c[u]="destination-atop";c.arc(t,r,66,n*i[1],n*i[0]);c.stroke()}var i=79+e,s=66+t,o=158,a=[2,1.2],f=[1.8,.8];c.lineWidth=13;r("007a9c",e,t,f);r("ffa100",i,s,a);r("000",e+=o,t,f);r("009b3a",i+=o,s,a);r("e10e49",e+=o,t,f)}var t=Math,n=t.PI,r=t.random,i,s,o=0,u="globalCompositeOperation",a=document.getElementById("c"),f=w.innerWidth,l=w.innerHeight,c=a.getContext("2d"),h=9,p=[];a.width=f;a.height=l;for(i=0;i<l;++i){p.push({x:r()*f,y:r()*l,r:e(1,3),d:e(1,l)})}setInterval(function(){c.clearRect(0,0,f,l-h);d(f/2-200,l-200);c[u]="xor";c.fillStyle="#fff";c.beginPath();o+=e(0,7)?.01:-.01;for(i=0;i<l-h;++i){s=p[i];c.moveTo(s.x,s.y);c.arc(s.x,s.y,s.r,0,n*2);s.y+=t.cos(o+s.d)+1+s.r/9;s.x+=(i%2?1:-1)*t.sin(o)*.4;if(s.x>f+7||s.x<-7||s.y>l-(h-1.2)){p[i]={x:r()*f,y:-9,r:s.r,d:s.d}}}c.fill();if(h<l/1.7)h+=l/9e3},32)}

940: Упаковане обгортання onloadі покладається на те, що сценарій буде вставлений в кінці bodyтега + помилка вирівнювання та виправлення Firefox

function e(e,t){return r()*(t-e+1)+e}function d(e,t){function r(e,t,r,i){c.beginPath();c[u]="xor";c.strokeStyle="#"+e;c.arc(t,r,66,n*i[0],n*i[1]);c.stroke();c[u]="destination-over";c.arc(t,r,66,n*i[1],n*i[0]);c.stroke()}var i=79+e,s=66+t,o=158,a=[2,1.2],f=[1.8,.8];c.lineWidth=13;r("007a9c",e,t,f);r("ffa100",i,s,a);r("000",e+=o,t,f);r("009b3a",i+=o,s,a);r("e10e49",e+=o,t,f)}var w=window,t=Math,n=t.PI,r=t.random,i,s,o=0,u="globalCompositeOperation",a=document.getElementById("c"),f=w.innerWidth,l=w.innerHeight,c=a.getContext("2d"),h=9,p=[];a.width=f;a.height=l;for(i=0;i<l;++i,p.push({x:r()*f,y:r()*l,r:e(1,3),d:e(1,l)}));setInterval(function(){c.clearRect(0,0,f,l-h);d(f/2-158,l-200);c[u]="xor";c.fillStyle="#fff";c.beginPath();o+=e(0,7)?.01:-.01;for(i=0;i<l-h;++i){s=p[i];c.moveTo(s.x,s.y);c.arc(s.x+=(i%2?.4:-.4)*t.sin(o),s.y+=t.cos(o+s.d)+1+s.r/9,s.r,0,n*2);if(s.y>l-(h-1.2)){p[i].x=r()*f;p[i].y=-9}}c.fill();if(h<l/1.7)h+=l/9e3},32)

Fiddle:

http://jsfiddle.net/Ifnak/XSBLg/embedded/result/

http://jsfiddle.net/Ifnak/4fSWm/5/embedded/result/

Навантаження як у Firefox, так і в Chrome, але досить важка для ресурсів у FF. Використання requestAnimationFrame()допомогло трохи, але недостатньо.

Зауважте, що сніг лежить на дні, таким чином прокручуйте вниз, щоб побачити повільний ріст. Спочатку мав деякий перефарбовування на землі, але не міг зробити його вмістом у 1024 chr.

Результат (низька якість GIF'ed скріншот):

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


2
Приємно! Він також працює в IE11.
Данько Дурбич

Працює абсолютно чудово на Firefox 27.0.1.
Натан Осман,

32

Математика

З моєї відповіді в Mathematica.SE Q&A :

ring[x_, y_, v_, t_] := 
  Table[
    {1.2 y, -v x, 0} + {Cos@i, Sin@i}.{{0, -1, 0}, {1, 0, 1/4 - v/2}},
    {i, 0, 2 π, π/200}
  ] ~Tube~ t

Graphics3D[
  Riffle[
    {Cyan, Yellow, Darker @ Gray, Green, Red},
    Array[ring[Sqrt@3/2, #, # ~Mod~ 2, 0.17] &, 5, 0] ],
  Boxed -> False,
  ViewPoint -> {0, 0, ∞}
]

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

Редагувати: у версії 10 змінився стиль освітлення за замовчуванням; щоб візуалізувати графіку вище однієї, потрібно додати Варіант Lighting -> "Classic"до Graphics3D.

Подальша гра з освітленням для отримання плоского двовимірного впливу:

Graphics3D[
  Riffle[
    Glow /@ {Hue[.59], Hue[.13], Black, Hue[.3, 1, .7], Hue[0, 1, .85]},
    Array[ring[Sqrt@3/2, #, # ~Mod~ 2, 0.13] &, 5, 0] ],
  Boxed -> False,
  ViewPoint -> {0, 0, ∞},
  Lighting -> None
]

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


Для Олівера, який сказав, що мій перший результат був "занадто 3D-результатом", ось фактична 2D-рендерінг через код jVincent з моїм рефакторингом, також із пов'язаного потоку:

ringSegment[mid_, deg_, color_] := {CapForm["Butt"],
  Thickness[0.042], White,                   Circle[mid, 1, deg],
  Thickness[0.03],  RGBColor @@ (color/255), Circle[mid, 1, deg + {-0.1, 0.1}]}

blue   = {  0, 129, 188};
yellow = {255, 177,  49};
black  = { 35,  34,  35};
green  = {  0, 157,  87};
red    = {238,  50,  78};

Graphics @ GraphicsComplex[
  {{2.5, 0}, {1.3, -1}, {0, 0}, {5, 0}, {3.8, -1}},
  ringSegment @@@
   {{1, {0, 5/4 π},      black},
    {2, {0, π},          yellow},
    {3, {0, 2 π},        blue},
    {2, {-π 9/8, 1/4 π}, yellow},
    {4, {0, 5/4 π},      red},
    {5, {0, 7/8 π},      green},
    {1, {5/4 π, 5/2 π},  black},
    {5, {7/8 π, 2 π},    green},
    {4, {-3/4 π, 1/4 π}, red}}
 ]

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


@Oliver Оновлено лише для вас.
Mr.Wizard

Оце Так! Чи можете ви сказати мені, де ви можете завантажити Mathmatica?
Олівер Ні

@Oliver Це комерційний продукт і досить дорогий навіть для індивідуального некомерційного використання, але якщо ви все-таки зацікавлені, ви можете отримати 15-денну пробну версію від: wolfram.com/mathematica/trial
Mr.Wizard

1
@Oliver тепер ви можете отримати безкоштовну версію Mathematica, якщо у вас є малинова пі
trichoplax

@trichoplax Тепер Open Cloud дозволяє один вільно запускати скромні програми в інтерфейсі браузера: develop.open.wolframcloud.com/app/view/newNotebook
Mr.Wizard

28

Рубі, 321

На жаль, певний глава держави є головним предметом більшості олімпійських новин досі. Таким чином, ось мій логотип фрістайлу (талісман?) Для Ігор 2014 року.

w=?$;"UW[NASY_LAQVgKAPSlKAOKGLnHAOIHMnHAOHILpHANHJLqFAOFLKAVMAVMAWKAWLAWKAMIHFGK
NFMLAMGOFFGAGJPGFIAHGFFOWPPAIGFFKQFOKMJHAIJJQGNLGFMAJIJNFIGHFHSGASMMFHHASHGGPK
MFJHTKARJSKAMGFOPJAPPOJAPRKLAQRJLAQTHLAR^LFARaARaAR]HFASZAS[FFRGAT_QGAUZGFFG
U]AQGITAPHKPANKKSALMNSGGAJPOP".codepoints{|r|r-=69;$><<(r<0??\n:(w=w==?$?' ':?$)*r)}

Вихід: (Резервне копіювання та косіння. Вибачте за примітивне відображення, але він не заслуговує кращого.)

Путін


6
$$$, сумно, але правда: D
ybeltukov

25

Bash + ImageMagick

convert \
  -size 330x150 xc:white -strokewidth 10 -fill none \
  -stroke \#0885c2 -draw 'arc 100,100 10,10 0,360' \
  -stroke black -draw 'arc 210,100 120,10 0,360' \
  -stroke \#ed334e -draw 'arc 320,100 230,10 0,360' \
  -stroke \#fbb132 -draw 'arc 155,140 65,50 0,360' \
  -stroke \#1c8b3c -draw 'arc 265,140 175,50 0,360' \
  -stroke \#0885c2 -draw 'arc 100,100 10,10 -20,10' \
  -stroke black -draw 'arc 210,100 120,10 -20,10' -draw 'arc 210,100 120,10 90,120' \
  -stroke \#ed334e -draw 'arc 320,100 230,10 90,120' \
  x:

Вибірка зразка:

Олімпійські ігри логотип


23

FreePascal

Зимові Олімпійські ігри? А як щодо фрактальних сніжинок замість звичайних кілець.

Рекурсія для центральної гілки досить очевидна: (dx, dy) = 0,5 (dx, dy). Ліва і права гілки засновані на обертанні шляхом матричного множення:

x = x cos (a) - y sin (a)

y = x sin (a) + y cos (a)

1/4 = 0,5 cos (60) і 7/16 - це гарне наближення 0,5 sin (60).

uses graph;
var gd, gm : integer;
var n:integer;

Procedure tree(x,y,dx,dy: integer);
begin
  if dx*dx+dy*dy>0 then begin
    line(x, y, x+dx, y+dy);
    tree(x+dx, y+dy, dx div 2, dy div 2);
    tree(x+dx, y+dy, dx div 4 + dy*7 div 16, dy div 4 - dx*7 div 16);
    tree(x+dx, y+dy, dx div 4 - dy*7 div 16, dy div 4 + dx*7 div 16);
  end;
end;

begin
  gd := D4bit;
  gm := m640x480;
  initgraph(gd,gm,'');
  setbkcolor(white); clearviewport;
  setbkcolor(black); setlinestyle(0,0,3);

  For n:=-1 to 1  do  begin
    setColor(yellow);
    tree(215,240-120*n,0,120*n);
    setColor(lightgreen);
    tree(425,240-120*n,0,120*n);
    setColor(black);
    tree(320,120-120*n,0,120*n);
    setColor(lightred);
    tree(530,120-120*n,0,120*n);
    setColor(lightblue);
    tree(110,120-120*n,0,120*n);
  end;
  readln;
  closegraph;
end.

. .

зображення


Приємно. Якщо ви можете додати в алгоритм велику кількість випадковості, ви можете повторно використовувати його в Давайте моделюємо випадкову сніжинку .
манатура

16

Java

Схожий на мою відповідь SVG, але

  • Використовує два кліпи, щоб уникнути незначних розбіжностей через подвійне малювання з псевдонімом.
  • Оскільки у Java є фактичні петлі, структура трохи приємніша.

Зауважте, що я не намагався пограти в гольф, незважаючи на можливість деяких цікавих трюків (наприклад, -57*~dirзамість цього 57*(1+dir). Це 923 символи, але гольфи до 624 досить легко.

import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.File;
import javax.imageio.ImageIO;

public class Rings {
    public static void main(String[] args) throws Exception {
        int[] pal = new int[] {0x0b8ed8, 0xf9a91f, 0x231f20, 0x009e59, 0xee2049};
        BufferedImage img = new BufferedImage(505, 229, BufferedImage.TYPE_INT_ARGB);
        Graphics2D g = img.createGraphics();
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        for (int dir = -1; dir < 2; dir += 2) {
            g.setClip(0, 57 * (1 + dir), 520, 114);
            for (int ring = 2 - 2 * dir; ring != 2 + 3 * dir; ring += dir) {
                for (int subring = 0; subring < 2; subring++) {
                    g.setColor(new Color(pal[ring] | (subring - 1)));
                    g.setStroke(new BasicStroke(20 - 8 * subring));
                    g.drawOval(10 + 85 * ring, 10 + 64 * (ring & 1), 144, 144);
                }
            }
        }
        ImageIO.write(img, "PNG", new File("rings.png"));
    }
}

PNG, що надається програмою Java


16

Commodore 64 BASIC

Знову відповідь С64, але цього разу мені дозволено використовувати спрайти ! Так!

Я пам'ятаю, якби ви хотіли використовувати спрайти, ви почали б свою програму з великою кількістю нудних DATAтверджень. Для визначення монохроматичного візерунка спрайту «високої роздільної здатності» (24x21 пікселів) потрібно 63 байти. Насправді є онлайн- редактор спрайт, який обчислює дані для вас, тому:

10 DATA 0,254,0,3,255,128,7,255,192,15,131,224,30,0,240,60,0,120,56,0,56,120,0
20 DATA 60,112,0,28,112,0,28,112,0,28,112,0,28,112,0,28,120,0,60,56,0,56,60,0
30 DATA 120,30,0,240,15,131,224,7,255,192,3,255,128,0,254,0

Також мені знадобляться ще деякі ДАНІ для кольорів та позицій. Я щойно скопіював це з моєї відповіді на питання оригінального логотипу Олімпійських ігор :

40 DATA 6,0,0,0,2,0,2,4,0,7,1,1,5,3,1 

Тоді ви зазвичай встановлюєте V=53248. Це 53248повинно бути важливим числом, тому що я все ще пам’ятаю його через 25 років :) Виявляється, це базова адреса VIC-II (контролер відеоінтерфейсу):

50 V=53248

Потім я читаю спрайт-шаблон у пам'яті, починаючи з адреси 832. Дуже дивно просто писати в місце пам'яті, не виділяючи, ні new, нічого подібного :) Початкова адреса повинна бути кратною 64.

60 FOR I=0 TO 62
70 READ D:POKE 832+I,D
80 NEXT I

Я буду використовувати однаковий зразок для всіх спрайтів.

90 FOR I=0 TO 4
100 READ C,X,Y

Cє кольоровим кодом Xі Yє горизонтальним і вертикальним положенням кіл.

Потрібно ще кілька POKEs:

110 POKE V+I*2,150+X*11
120 POKE V+I*2+1,130+Y*10

V+0, V+2, V+4, І т.д. ... є горизонтальним розташуванням кожного спрайту, а V+1, V+3, V+5... є вертикальними. Кольори спрайтів починаються в регістрі V+39:

130 POKE V+39+I,C

Спрайтові дані спрайту починаються 2040, і оскільки дані починаються з 832, ми отримуємо 832/64= 13, значить:

140 POKE 2040+I,13
150 NEXT I

Для включення спрайтів я встановлюю біти 0-4регістра V+21. Я також змінив фон на білий, щоб ми могли побачити синє коло.

160 POKE 53281,1
170 POKE V+21,31

Це воно!

Олімпійські спрати


Чудово! Не знаю, чи правильно я пам’ятаю, але, можливо, ви можете подвоїти (апаратно) розмір спрайтів x / y. Я впевнений, що ви могли це зробити на C128.
Габріеле Д'Антона

Так, ви можете встановити біти як V+23для подвійної висоти, так і V+29для подвійної ширини. (біт #x для спрайту # x).
Данко Дурбич

11

LaTeX / TikZ

Розмір: 876 байт (12 рядків, рядок із 72 символами та кінець рядка)

\documentclass{standalone}\usepackage{tikz}\def\W{3.762bp}\def\R{71.682
bp}\def\D{12.9041bp}\usetikzlibrary{calc,hobby}\def\Y{-71.7013bp}\def\X
{169.5538bp}\begin{document}\tikz[use Hobby shortcut,every path/.style=
{line width=\W,double distance=\D, white}]{\def\Z{coordinate}\path(0,0)
\Z(A)++(\X,0)\Z(C)++(\X,0)\Z(E)($(A)!.5!(C)$)++(0,\Y)\Z(B)++(\X,0)\Z(D)
;\def~#1#2{\definecolor{#1}{cmyk}{#2}} ~A{1,.25,0,0}~B{0,.342,.91,0}~C{
0,0,0,1}~D{1,0,.91,.06}~E{0,.94,.65,0}\def~#1#2#3#4{\draw[save Hobby p%
ath={#1},double=#1,overlay](#1)+([closed] 225:\R)..+([#2]315:\R)..+([#3
]45:\R)..+([#4]135:\R); \path let\n!={\R+\D/2}in(#1)+(-\n!,0)+(\n!,0)+(
0,-\n!)+(0,\n!);}\def\0#1{\draw[double=#1,restore and use Hobby path={%
#1}{disjoint,invert soft blanks}];}~A{}{blank=soft}{}~B{}{}{blank=soft}
~C{}{blank=soft}{}\0B\0A~E{blank=soft}{}{}~D{}{}{}\0C\0E}\end{document}

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

Розмір: 817 байт в одному рядку та з двома оптимізаціями:

  • Варіант tikzкласу standalone, дивіться коментар пшеничного майстра.
  • Багаторазове використання soft=blankможна скоротити, визначивши стиль b.
\documentclass[tikz]{standalone}\def\W{3.762bp}\def\R{71.682bp}\def\D{12.9041bp}\usetikzlibrary{calc,hobby}\def\Y{-71.7013bp}\def\X{169.5538bp}\begin{document}\tikz[use Hobby shortcut,every path/.style={line width=\W,double distance=\D,white},b/.style={blank=soft}]{\def\Z{coordinate}\path(0,0)\Z(A)++(\X,0)\Z(C)++(\X,0)\Z(E)($(A)!.5!(C)$)++(0,\Y)\Z(B)++(\X,0)\Z(D);\def~#1#2{\definecolor{#1}{cmyk}{#2}} ~A{1,.25,0,0}~B{0,.342,.91,0}~C{0,0,0,1}~D{1,0,.91,.06}~E{0,.94,.65,0}\def~#1#2#3#4{\draw[save Hobby path={#1},double=#1,overlay](#1)+([closed]225:\R)..+([#2]315:\R)..+([#3]45:\R)..+([#4]135:\R); \path let\n!={\R+\D/2}in(#1)+(-\n!,0)+(\n!,0)+(0,-\n!)+(0,\n!);}\def\0#1{\draw[double=#1,restore and use Hobby path={#1}{disjoint,invert soft blanks}];}~A{}b{}~B{}{}b~C{}b{}\0B\0A~E b{}{}~D{}{}{}\0C\0E}\end{document}

LaTeX / TikZ (версія для читання)

Наступна довша версія, мабуть, простіша для розуміння.

  • Перекриття кілець обробляється, попередньо намалювавши кільця з порожніми сегментами. Потім на більш пізньому етапі кільця малюються знову, але цього разу порожні сегменти заповнюються, а інші вже намальовані сегменти кілець залишаються недоторканими. Тому відсікання взагалі не використовується.

  • Кільце з білими полями намальовано колом подвійною лінією. Область між лініями заповнена кольором кільця, а більш тонкі подвійні лінії утворюють зовнішній і внутрішній білий край.

  • Кольори та розміри взяті з опису сторінки PDF на сторінці 5 офіційного документа (див. Відповідь Пітера Тейлера).

\nofiles % .aux file is not needed
\documentclass[tikz]{standalone}
\usetikzlibrary{calc}
\usetikzlibrary{hobby}

\newcommand*{\xshift}{169.5538bp}
\newcommand*{\yshift}{-71.7013bp}
\newcommand*{\radius}{71.6821bp}
\newcommand*{\whitelinewidth}{3.762bp}
\newcommand*{\colorlinewidth}{12.9041bp}

\definecolor{color@A}{cmyk}{1, .25, 0, 0}
\definecolor{color@B}{cmyk}{0, .342, .91, 0}
\definecolor{color@C}{cmyk}{0, 0, 0, 1}
\definecolor{color@D}{cmyk}{1, 0, .91, .06}
\definecolor{color@E}{cmyk}{0, .94, .65, 0}

\begin{document}
  \begin{tikzpicture}[
    use Hobby shortcut,
    every path/.style = {
      line width      = \whitelinewidth,
      double distance = \colorlinewidth,
      white,
    },
  ]
    % define center coordinates for the five rings
    \path
      (0,0) coordinate (center@A)
      ++(\xshift, 0) coordinate (center@C)
      ++(\xshift, 0) coordinate (center@E)
      ($(center@A)!.5!(center@C)$) ++(0, \yshift) coordinate (center@B)
      ++(\xshift, 0) coordinate (center@D)
    ;
    % \drawring draws the first part of the ring with blank parts
    \newcommand*{\drawring}[4]{%
      \draw[
        save Hobby path = {path@#1},
        double          = {color@#1},
        overlay,
      ]
        (center@#1)
        +([closed] 225:\radius) .. +([#2] 315:\radius) ..
        +([#3] 45:\radius) .. +([#4] 135:\radius)
      ;
    }
    % \finishring draws the blank parts of the rings
    \newcommand*{\finishring}[1]{%
      \draw[
        double                     = {color@#1},
        restore and use Hobby path = {path@#1}{
          disjoint, 
          invert soft blanks
        },
      ];
    }
    \drawring{A}{}{blank=soft}{}
    \drawring{B}{}{}{blank=soft}
    \drawring{C}{}{blank=soft}{}
    \finishring{B}
    \finishring{A}
    \drawring{E}{blank=soft}{}{}
    \drawring{D}{}{}{}
    \finishring{C}
    \finishring{E}
    % set calculated bounding box
    \useasboundingbox
      let \n{r} = {\radius + \colorlinewidth/2}
      in
        (center@A) +(-\n{r}, \n{r}) % upper left corner
        (center@B -| center@E) +(\n{r}, -\n{r}) % lower right corner
    ;
  \end{tikzpicture}
\end{document}

Щоб зберегти пару байтів, ви можете використовувати \documentclass[tikz]{standalone}завдяки цій підказці .
Пшеничний майстер

@WheatWizard Спасибі, відповідь оновлюється та додатково скорочується шляхом визначення стилю, bщоб уникнути тривалості, blank=softяка використовується чотири рази.
Хайко Обердік

10

C ++ 1024 байти

Оновлено: Зараз з антиалізінг. Код був де-де-гольф, поки все ще вкладається в (точно) 1К.

Не використовує жодної функції бібліотеки, крім функцій потоку, для запису вихідного файлу.

#include <fstream>

namespace {
typedef double d;

int w=512;
d a=1./6,g=1./w,h=1./72,j=h+g,k=h-g,r=5./36;

struct p{d x,y;}ps[]={{5*a,a},{4*a,2*a},{3*a,a},{2*a,2*a},{a,a}};
struct c{unsigned char r,g,b;}cs[]={{237,51,78},{28,139,60},{0,0,0},{251,177,50},{8,133,194}};

d abs(d x) {return x<0?-x:x;}

d sqrt(d x) {
    d e=1e-6,y=1;
    for(;abs(y*y-x)>e;y=.5*(y+x/y));
    return y;
}

d dist(p c,p z) {
    d u=z.x-c.x,v=z.y-c.y; 
    return abs(r-sqrt(u*u+v*v));
}

c lerp(c a,c b,d t) {
    auto l=[=](d a,d b){return a+(b-a)*t;}; 
    return {l(a.r,b.r),l(a.g,b.g),l(a.b,b.b)};
}

d smoothstep(d z) {
    z=(z-j)/(k-j);
    z=z<0?0:z>1?1:z;
    return z*z*(3-2*z);
}

c color(p z) {
    c o{255,255,255};
    for(int i=0,j;i<5;++i){
        j=z.y<.25?i:4-i;
        o=lerp(o,cs[j],smoothstep(dist(ps[j],z)));
    }
    return o;
}
}

int main() {
    std::ofstream o("r.ppm",std::ofstream::binary);
    o<<"P6 "<<w<<" "<<w/2<<" 255\n";
    for(int y=0;y<w/2;++y)
        for(int x=0;x<w;++x)
            o.write((char*)&color(p{x*g,y*g}),3);;
}

Виводить файл .ppm:

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


1
Це не гольф з кодом : ви можете зробити свій код розбірливим і надайте йому розмір в 1 КБ.
Пітер Тейлор

+1, навіть не включаючи <cmath>
епідемія

10

R, 70 символів

Використання статистики CRAN-R.

l=c(1,9);plot(3:7,c(6,4,6,4,6),col=c(4,7,1,3,2),cex=10,ylim=l,xlim=l)

R сюжет


9

GLSL

Я відчуваю, що я трохи спізнююся на вечірку, але, можливо, я можу компенсувати це з першим поданням GLSL на цьому сайті. Він призначений для використання як шейдер фрагмента для примітиву, що заповнює екран, і очікує дозволу вікна перегляду в iResolutionмундирі.

Кольори та позиції "запозичені" з подання Пітера Тейлора . Мені довелося скоротити кілька змінних імен, щоб отримати менше 1024 символів, але я сподіваюся, що це все ще читається.

Перегляньте це на Shadertoy (якщо ваш браузер підтримує WebGL).

uniform vec3 iResolution;

float circle(vec2 pos, float r) {
    return clamp(r - distance(gl_FragCoord.xy, pos), 0., 1.);
}

float ring(vec2 pos, float r, float d) {
    return circle(pos, r + d) * (1. - circle(pos, r - d));
}

void paint(vec3 color, float a) {
    gl_FragColor.rgb = mix(gl_FragColor.rgb, color, a);
}

void main() {
    struct r_t {
        vec2 pos;
        vec3 col;
    } rs[5];
    rs[0] = r_t(vec2( 82, 146), vec3(.04, .56, .85));
    rs[1] = r_t(vec2(167,  82), vec3(.98, .66, .12));
    rs[2] = r_t(vec2(252, 146), vec3(.14, .12, .13));
    rs[3] = r_t(vec2(337,  82), vec3(.00, .62, .35));
    rs[4] = r_t(vec2(422, 146), vec3(.93, .13, .29));

    float s = min(iResolution.x / 504., iResolution.y / 228.);
    vec2 b = (iResolution.xy - vec2(504, 228) * s) * .5;
    bool rev = gl_FragCoord.y > iResolution.y * .5;

    gl_FragColor.rgb = vec3(1);

    for (int i = 0; i < 5; ++i) {
        r_t r = rev ? rs[4 - i] : rs[i];
        paint(vec3(1), ring(r.pos * s + b, 72. * s, 11. * s));
        paint(r.col,   ring(r.pos * s + b, 72. * s,  6. * s));
    }
}

Результат надання


5

Математика

Я замінив свою оригінальну відповідь на той, який спирається на регіони та їхні перехрестя. Розмір коду - 973 байтів, без вогонь.

Регіони 1-5 - це кільця. Кільця мають внутрішній радіус 2,5 одиниці; зовнішній радіус - 3 одиниці. Ставлення внутрішнього до зовнішнього відношення, а загальна логіка підходу можна знайти тут .

i = Implicit Region;
R1 = i[6.25 <= (x + 6.4)^2 + y^2 <= 9 , {x, y}];
R2 = i[6.25 <= x^2 + y^2 <= 9 , {x, y}];
R3 = i[6.25 <= (x - 6.4)^2 + y^2 <= 9 , {x, y}];
R4 = i[6.25 <= (x + 3.2)^2 + (y + 3)^2 <= 9 , {x, y}];
R5 = i[6.25 <= (x - 3.2)^2 + (y + 3)^2 <= 9 , {x, y}];

Чому ми не можемо просто роздрукувати 5 кілець, не враховуючи шари.

Якщо ми відразу побудуємо ці кільця, вони не замикаються. Зауважте, що жовте кільце лежить на вершині синього та чорного кілець; зелене кільце лежить на вершині як чорного, так і червоного кільця.

Show[{RegionPlot[R1, PlotStyle -> Blue, BoundaryStyle -> Blue],
  RegionPlot[R2, PlotStyle -> Black, BoundaryStyle -> Black],
  RegionPlot[R3, PlotStyle -> Red, BoundaryStyle -> Red],
  RegionPlot[R4, PlotStyle -> Yellow, BoundaryStyle -> Yellow],
  RegionPlot[R5, PlotStyle -> Green, BoundaryStyle -> Green]
  }, PlotRange -> All, PerformanceGoal -> "Quality", 
 ImageSize -> Large, AspectRatio -> 1/2,
 Frame -> False]

зверху


Перегортання кольорів у 4 перетинах кілець.

Регіони 6, 8, 10 і 12 - це прямокутники, які служать для визначення, на якому перетині двох кілець слід зосередити увагу.

Регіони 7, 9, 11 і 13 - це "перекриття кільця", де кільце внизу повинне бути зверху.

R6 = Rectangle[{-5, -1}, {-2, 1}];
R7 = RegionIntersection[R1, R4, R6];    
R8 = Rectangle[{2, -1}, {4, 1}];
R9 = RegionIntersection[R2, R5, R8]; 
R10 = Rectangle[{-2, -3}, {2, -2}];
R11 = RegionIntersection[R2, R4, R10];  
R12 = Rectangle[{5, -3}, {7, -2}];
R13 = RegionIntersection[R3, R5, R12];

Show[{RegionPlot[R1, PlotStyle -> Blue, BoundaryStyle -> Blue],
  RegionPlot[R2, PlotStyle -> Black, BoundaryStyle -> Black],
  RegionPlot[R3, PlotStyle -> Red, BoundaryStyle -> Red],
  RegionPlot[R4, PlotStyle -> Yellow, BoundaryStyle -> Yellow],
  RegionPlot[R5, PlotStyle -> Green, BoundaryStyle -> Green],
  RegionPlot[R7, PlotStyle -> Blue, BoundaryStyle -> Blue],
  RegionPlot[R9, PlotStyle -> Black, BoundaryStyle -> Black],
  RegionPlot[R11, PlotStyle -> Black, BoundaryStyle -> Black],
  RegionPlot[R13, PlotStyle -> Red, BoundaryStyle -> Red]}, 
PlotRange -> All, PerformanceGoal -> "Quality", 
 ImageSize -> Large, AspectRatio -> 1/2,
 Frame -> False]

кільця


На яких перехрестях були перекинуті їх кольори?

Далі висвітлюються області перетину, де кольори були «перекинуті». Це було досягнуто шляхом зміни BoundaryStyleрегіонів 7, 9, 11 та 13 на White.

основні моменти


4
Ви не можете зробити щось естетично краще за 1 к? ці перехрестя потворні!
Габріеле Д'Антона

1
@friol, я покращив перехрестя, використовуючи регіони.
DavidC

1
Минуло півтора року, але ви нарешті знайшли, як зробити гарні перехрестя: D
бета-розпад

Вчора я побачив кілька олімпійських кілець і зрозумів, що можу використовувати регіони для вирішення питання перехрестя. Попередні були занадто некрасивими, щоб залишити їх, як вони були.
DavidC

3

Javascript (three.js) - 910 байт

Враховуючи елемент html, ця функція створить кільця у вигляді 3D-об'єктів, а потім надасть нерухоме зображення елементу. Працює в браузерах, які підтримують WebGL. ПІДТВОРЕННЯ

function Logo(l){
    var s, c, r;
    s = new THREE.Scene();
    c = new THREE.PerspectiveCamera(45, 4/3, 1, 500);
    c.position.set(75,0,300);
    c.lookAt(new THREE.Vector3(0,0,0));
    var rings = [
        new THREE.Mesh(ring(), mat(0x0885c2)),
        new THREE.Mesh(ring(), mat(0xfbb132)),
        new THREE.Mesh(ring(), mat(0x000000)),
        new THREE.Mesh(ring(), mat(0x1c8b3c)),
        new THREE.Mesh(ring(), mat(0xed334e))
    ];
    for(var i = 0; i < rings.length; i++){
        s.add(rings[i]);
        rings[i].position.set(i*55-125,-(i%2)*50,0);
        rings[i].rotation.set(0,(i%2*2-1)*.18,0,'xyz');
    }
    r = new THREE.WebGLRenderer();
    r.setSize(400, 300);
    l.appendChild(r.domElement);
    r.render(s, c);
}
function ring(){ return new THREE.TorusGeometry(50, 8, 16, 32); }
function mat(color){ return new THREE.MeshBasicMaterial({color: color}); }


2

C ++ w / SFML (1003 включно з пробілом)

Не малий на будь-якій ділянці уяви, але зберігається як можна більш чітким, але читається, і все ще не перевищує 1 к.

#include <SFML/Graphics.hpp>

using namespace sf;

int main() {
    CircleShape circles[5];
    Color backcolor(255,255,255);
    Color colors[5] = {
        Color(0x0b,0x8e,0xd8),
        Color(0xf9,0xa9,0x1f),
        Color(0x23,0x1f,0x20),
        Color(0x00,0x9e,0x59),
        Color(0xee,0x20,0x49),
    };

    for (int i = 0; i < 5; i++) {
        circles[i] = CircleShape(144, 60);
        circles[i].setPosition(15+160*i, 46+160*(i&1));
        circles[i].setFillColor(Color::Transparent);
        circles[i].setOutlineColor(colors[i]);
        circles[i].setOutlineThickness(-16);
    }

    RenderWindow window(VideoMode(960, 540), L"Olympic Logo", Style::Close);

    while (window.isOpen()) {
        Event event;

        while (window.pollEvent(event))
            if (event.type == Event::Closed)
                window.close();

        window.clear(backcolor);

        for (int i = 0; i < 5; i++)
            window.draw(circles[i]);

        window.display();
    }

    return 0;
}

Редагувати: оновлені кольори на основі подання SVG @Peter Taylor


1

Delphi

  Canvas.Pen.Width := 10;
  Canvas.Brush.Style:=bsClear;//To prevent solid background
  Canvas.Pen.Color:=clBlue; Canvas.Ellipse(20,30,220,230);
  Canvas.Pen.Color:=clBlack; Canvas.Ellipse(240,30,440,230);
  Canvas.Pen.Color:=clRed; Canvas.Ellipse(460,30,660,230);
  Canvas.Pen.Color:=clYellow; Canvas.Ellipse(130,130,330,330);
  Canvas.Pen.Color:=clGreen; Canvas.Ellipse(350,130,550,330);

Результат

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


0

прийняв рішення на основі видання Java Swing GUI UltraGolfed (696 годин)

import java.awt.Color;import java.awt.Graphics;import javax.swing.JFrame;import javax.swing.JPanel;class A extends JFrame{public A(){JPanel j=new JPanel(){protected void paintComponent(Graphics g){;((java.awt.Graphics2D)g).setStroke(new java.awt.BasicStroke(3));g.setColor(new Color(0xb,0x8e,0xd8));g.drawOval(10, 10, 80, 80);g.setColor(new Color(0xf9,0xa9,0x1f));g.drawOval(50,40,80,80);g.setColor(new Color(0x23,0x1f,0x20));g.drawOval(90, 10, 80, 80);g.setColor(new Color(0,0x9e,0x59));g.drawOval(130,40,80,80);g.setColor(new Color(0xee,0x20,0x49));g.drawOval(170, 10, 80, 80);}};j.setBounds(0,0,600,400);setSize(600,400);add(j);}public static void main(String[]a){new A().setVisible(true);}}

Напівкомпресований: (971)

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
class A extends JFrame
{
    public A()
    {
        JPanel j = new JPanel(){
        protected void paintComponent(Graphics g)
        {;
            ((java.awt.Graphics2D)g).setStroke(new  java.awt.BasicStroke(3));
            g.setColor(new Color(0xb,0x8e,0xd8));
            g.drawOval(10, 10, 80, 80);
            g.setColor(new Color(0xf9,0xa9,0x1f));
            g.drawOval(50,40,80,80);
            g.setColor(new Color(0x23,0x1f,0x20));
            g.drawOval(90, 10, 80, 80);
            g.setColor(new Color(0,0x9e,0x59));
            g.drawOval(130,40,80,80);
            g.setColor(new Color(0xee,0x20,0x49));
            g.drawOval(170, 10, 80, 80);}};
        j.setBounds(0,0,600,400);
        setSize(600,400);
        add(j);
    }
    public static void main(String[]a)
    {
        new A().setVisible(true);
    }
}

Чи можете ви додати скріншот?
Paŭlo Ebermann


0

SpecBAS

Кожне кільце складається з внутрішнього / зовнішнього кола, а потім заповнене заливом.

Довелося знаходити перехрестя вручну і заповнювати їх окремо (щоб ви все ще могли бачити деякі рядки між ними).

1 INK 0: PAPER 15: CLS: LET r=50
2 FOR x=1 TO 3
3 CIRCLE x*100,100,r: CIRCLE x*100,100,r-10
4 IF x<3 THEN CIRCLE (x*100)+50,150,r: CIRCLE (x*100)+50,150,r-10
5 NEXT x
6 INK 0: FILL 165,130: FILL 195,145: FILL 200,55: FILL 215,145: FILL 245,105
7 INK 9: FILL 100,55: FILL 130,130: FILL 145,105
8 INK 10: FILL 270,135: FILL 295,145: FILL 300,55
9 INK 12: FILL 205,145: FILL 215,120: FILL 250,195: FILL 255,105: FILL 280,120
10 INK 14: FILL 105,145: FILL 110,125: FILL 150,195: FILL 155,105: FILL 190,130

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.