Logo dei giochi olimpici - Free Style Edition [chiuso]


30

In uno spirito simile a questa domanda , la tua missione è quella di creare il logo più bello al massimo in 1K di codice.

Regole:

  1. Al massimo 1K di codice (incluso), nessun dato esterno.

  2. Vince la risposta con il maggior numero di voti.

Divertiti!


6
Bene, ha dichiarato direttamente "in uno spirito simile a questa domanda ", quindi praticamente ha detto "ehi, so che questo è un duplicato": D
Mike Koch,

5
Diversi criteri vincenti. Quindi è una domanda simile, ma non è un duplicato.
Victor Stafusa,

3
Sono davvero contento che qualcun altro abbia creato una versione del concorso di popolarità della mia domanda con meno criteri, dato che sono stato strappato su quale strada andare quando l'ho scritto.
Adam Maras,

@AdamMaras Lieto di sentirlo :)
Chubakueno,

Ho iniziato una discussione di riapertura su Meta , poiché questa domanda non avrebbe dovuto essere votata da vicino.
Adam Maras,

Risposte:


44

SVG

1kB? Lusso. Posso persino stampare piuttosto l'output piuttosto che rimuovere tutti gli spazi bianchi non necessari. (Il rientro, ovviamente, utilizza le schede, che Markdown converte in spazi, quindi è per questo che il conteggio dei caratteri potrebbe sembrare più alto dell'attuale 977. La rimozione di spazi bianchi non necessari lo porta a 861).

Le sovrapposizioni vengono gestite correttamente disegnando gli anelli in una direzione, quindi applicando una clip e disegnandoli nell'altra direzione. I colori e i rapporti sono estratti da un documento ufficiale che per qualche ragione usa curve di Bézier anziché cerchi.

<?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>

Rendering PNG del file SVG


16
PS Se qualcuno vuole sostenere che SVG non è un linguaggio di programmazione (e sarei molto propenso a concordare), considera questo un programma PHP nello stile di molti invii PHP a questo sito che fanno eco al testo letterale.
Peter Taylor,

omg sembra fantastico però. SVG is niceee

39

Javascript (core) - 1000 sul punto. - WebKit (Chrome)

Giocare con la tela.

Non sono sicuro se è 1024 o 1000 K, ma è riuscito a farlo scendere a 1000 982 940: D

Adatto solo per browser WebKit. Chrome OK. Firefox un casino. Potrebbe cercare di renderlo cross-browser.


Codice:

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: Rilasciato avvolgendolo onloade affidandosi allo script inserito alla fine del bodytag + bug di allineamento e correzione di 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)

Violino:

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

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

Carica in Firefox e Chrome, ma è piuttosto pesante per le risorse in FF. L'utilizzo ha requestAnimationFrame()aiutato un po ', ma non abbastanza.

Nota che la neve giace sul fondo, quindi scorri verso il basso per vedere la crescita lenta. Inizialmente aveva un po 'di vernice sul terreno, ma non riusciva a farlo rientrare nel 1024 chr.

Risultato (screencast GIF di bassa qualità):

inserisci qui la descrizione dell'immagine


2
Bello! Funziona anche in IE11.
Danko Durbić,

Funziona perfettamente su Firefox 27.0.1.
Nathan Osman,

32

matematica

Dalla mia risposta nelle domande e risposte Mathematica.SE :

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, ∞}
]

inserisci qui la descrizione dell'immagine

Modifica: nella versione 10 lo stile di illuminazione predefinito è cambiato; per rendere il grafico sopra si dovrà aggiungere l'opzione Lighting -> "Classic"a Graphics3D.

Continuando a giocare con l'illuminazione per produrre un effetto bidimensionale piatto:

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
]

inserisci qui la descrizione dell'immagine


Per Oliver che ha affermato che il mio primo risultato è stato "troppo 3D" ecco un vero rendering 2D tramite il codice di jVincent con il mio refactoring, anche dal thread collegato:

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}}
 ]

inserisci qui la descrizione dell'immagine


@Oliver Aggiornato solo per te.
Mr.Wizard

Wow! Puoi dirmi dove è possibile scaricare Mathmatica?
Oliver Ni

@Oliver È un prodotto commerciale e piuttosto costoso anche per un uso individuale e non commerciale, ma se sei ancora interessato puoi ottenere una versione di prova di 15 giorni da: wolfram.com/mathematica/trial
Mr.Wizard

1
@Oliver ora puoi ottenere una versione gratuita di Mathematica se hai un lampone pi
trichoplax,

@trichoplax Now Open Cloud consente di eseguire liberamente programmi modesti in un'interfaccia del browser: develop.open.wolframcloud.com/app/view/newNotebook
Mr.Wizard

28

Ruby, 321

Purtroppo, un certo capo di stato sembra essere l'oggetto principale della maggior parte delle notizie olimpiche finora. Quindi, ecco il mio logo freestyle (mascotte?) Per i Giochi del 2014.

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

Output: (Backup e strabismo. Ci scusiamo per il rendering primitivo ma non merita di meglio.)

Mettere in


6
$$$, triste ma vero: D
ybeltukov il

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:

Uscita campione:

logo di giochi olimpici


23

FreePascal

Olimpiadi invernali? Che ne dici di alcuni fiocchi di neve frattali invece di anelli regolari.

La ricorsione per il ramo centrale è abbastanza ovvia: (dx, dy) = 0,5 (dx, dy). I rami sinistro e destro si basano sulla rotazione per moltiplicazione di matrici:

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

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

1/4 = 0,5 cos (60) e 7/16 è una buona approssimazione di 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.

. .

Immagine


Bello. Se puoi aggiungere una buona dose di casualità all'algoritmo, puoi riutilizzarlo in Simuliamo un fiocco di neve casuale .
arte

16

Giava

Simile alla mia risposta SVG, ma

  • Utilizza due clip, per evitare lievi discrepanze dovute al doppio disegno con anti-alias.
  • Poiché Java ha dei veri e propri loop, la struttura è un po 'più bella.

Nota che non ho provato a giocare a golf, nonostante la possibilità di alcuni trucchi interessanti (come -57*~dirinvece di 57*(1+dir). È a 923 caratteri, ma i golf fino a 624 abbastanza facilmente.

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 reso dal programma Java


16

Commodore 64 BASIC

Ancora una volta, una risposta C64, ma questa volta mi è permesso usare gli sprite ! Sìì!

Ricordo che se volessi usare gli sprite, avresti iniziato il tuo programma con molte DATAaffermazioni noiose . Per definire un modello di sprite monocromatico "alta risoluzione" (24x21 pixel) sono necessari 63 byte. In realtà esiste un editor di sprite online che calcola i DATI per te, quindi:

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

Avrò anche bisogno di altri DATI per i colori e le posizioni. L'ho appena copiato dalla mia risposta alla domanda originale sul logo dei Giochi Olimpici :

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

Quindi, di solito hai impostato V=53248. Questo 53248deve essere un numero importante, perché lo ricordo ancora 25 anni dopo :) Si scopre che è l'indirizzo di base di VIC-II (Controller di interfaccia video):

50 V=53248

Poi ho letto il modello sprite in memoria a partire dall'indirizzo 832. È strano scrivere in una posizione di memoria, non allocare, no new, niente del genere :) L'indirizzo iniziale deve essere un multiplo di 64.

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

Userò lo stesso schema per tutti gli sprite.

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

Cè il codice colore Xe Ysono posizioni orizzontali e verticali dei cerchi.

POKESono necessari alcuni altri s:

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

V+0, V+2, V+4, Ecc ... sono le posizioni orizzontali di ogni sprite, mentre V+1, V+3, V+5... sono verticali. I colori dello sprite iniziano dal registro V+39:

130 POKE V+39+I,C

I puntatori di dati sprite iniziano da 2040e, poiché i dati iniziano da 832, otteniamo 832/64= 13, quindi:

140 POKE 2040+I,13
150 NEXT I

Per attivare gli sprite ho impostato i bit 0-4del registro V+21. Ho anche cambiato lo sfondo in bianco, in modo da poter vedere il cerchio blu.

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

Questo è tutto!

Sprite olimpiche


Grande! Non so se ricordo bene, ma forse puoi raddoppiare (in hardware) la dimensione x / y degli sprite. Sono sicuro che potresti farlo su un C128.
Gabriele D'Antona,

Sì, puoi impostare i bit di V+23per doppia altezza e V+29per doppia larghezza. (bit #x per sprite #x).
Danko Durbić,

11

LaTeX / TikZ

Dimensione: 876 byte (12 righe, riga con 72 caratteri e fine riga)

\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}

inserisci qui la descrizione dell'immagine

Dimensione: 817 byte in una riga e con due ottimizzazioni:

  • Opzione tikzdi classe standalone, vedere il commento di Wheat Wizard.
  • I molteplici usi di soft=blankpossono essere abbreviati definendo uno stile 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 (versione leggibile)

La seguente versione più lunga è probabilmente più facile da capire.

  • La sovrapposizione degli anelli viene gestita disegnando prima gli anelli con segmenti vuoti. Successivamente, gli anelli vengono nuovamente disegnati, ma questa volta i segmenti vuoti vengono riempiti e gli altri segmenti già disegnati degli anelli rimangono intatti. Pertanto il ritaglio non viene utilizzato affatto.

  • L'anello con i margini bianchi è disegnato da un cerchio con una doppia linea. L'area tra le linee è riempita con il colore dell'anello e le doppie linee più sottili formano il margine bianco esterno e interno.

  • I colori e le dimensioni sono presi dalla descrizione della pagina PDF della pagina 5 del documento ufficiale (vedi la risposta di Peter Tayler).

\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}

Per salvare un paio di byte è possibile utilizzare \documentclass[tikz]{standalone}grazie a questo suggerimento .
Wheat Wizard

@WheatWizard Grazie, la risposta viene aggiornata e ulteriormente accorciata definendo lo stile bper evitare il lungo blank=softutilizzo quattro volte.
Heiko Oberdiek,

10

C ++ 1024 byte

Aggiornato: ora con antialiasing. Il codice è stato in qualche modo decodificato mentre si inseriva (esattamente) 1K.

Non utilizza alcuna funzione di libreria tranne le funzioni ostream per scrivere il file di output.

#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);;
}

Emette un file .ppm:

inserisci qui la descrizione dell'immagine


1
Non si tratta di code-golf : puoi sentirti libero di rendere leggibile il tuo codice, a condizione che si adatti a 1kB.
Peter Taylor,

+1 per non includere <cmath>
epidemia il

10

R, 70 caratteri

Utilizzo delle statistiche 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)

Trama R


9

GLSL

Mi sembra di essere un po 'in ritardo alla festa, ma forse posso farcela con la prima presentazione GLSL su questo sito. È pensato per essere usato come shader di frammenti per una primitiva che riempie lo schermo e si aspetta la risoluzione del viewport in iResolutionuniforme.

Colori e posizioni sono "presi in prestito" dalla presentazione di Peter Taylor . Ho dovuto abbreviare alcuni nomi di variabili per arrivare a meno di 1024 caratteri, ma spero che sia ancora leggibile.

Guardalo su Shadertoy (se il tuo browser supporta 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));
    }
}

Rendering risultante


5

matematica

Ho sostituito la mia risposta originale con una che attinge alle regioni e alle loro intersezioni. La dimensione del codice è 973 byte, non modificata.

Le regioni 1-5 sono gli anelli. Gli anelli hanno un raggio interno di 2,5 unità; il raggio esterno è di 3 unità. Il rapporto tra rapporto interno ed esterno e la logica generale dell'approccio si trovano qui .

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}];

Perché non possiamo semplicemente stampare i 5 anelli senza tenere conto dei livelli.

Se tracciamo subito questi anelli, non si incastrano. Si noti che l'anello giallo si trova sopra gli anelli blu e nero; l'anello verde si trova sopra entrambi gli anelli nero e rosso.

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]

in cima


Lanciando i colori a 4 intersezioni di anelli.

Le regioni 6, 8, 10 e 12 sono rettangoli che servono a specificare l'intersezione di due anelli su cui concentrarsi.

Le regioni 7, 9, 11 e 13 sono le "sovrapposizioni dell'anello" in cui l'anello sul fondo dovrebbe essere in cima.

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]

anelli


Quali incroci avevano i loro colori invertiti?

Quanto segue evidenzia le regioni di intersezione in cui i colori sono stati "capovolti". Ciò è stato ottenuto modificando le BoundaryStyleregioni 7, 9, 11 e 13 in White.

mette in risalto


4
Non puoi fare qualcosa di esteticamente migliore in 1k? quegli incroci sono brutti!
Gabriele D'Antona,

1
@friol, ho migliorato le intersezioni usando le regioni.
DavidC,

1
Ci sono voluti un anno e mezzo, ma hai finalmente trovato il modo di creare incrocio grazioso: D
Decadimento beta

Ieri ho visto alcuni anelli olimpici e ho capito che avrei potuto usare le regioni per risolvere il problema dell'incrocio. I precedenti erano troppo brutti per andarsene com'erano.
DavidC,

3

Javascript (three.js) - 910 byte

Dato un elemento html, questa funzione creerà gli anelli come oggetti 3D e quindi renderà un'immagine fissa all'elemento. Funziona con browser che supportano WebGL. VIOLINO

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

gatto (10 byte)

Era così breve che il sito web ha rifiutato di caricarlo fino a quando non ho aggiunto questa descrizione. Il logo rappresenta i giochi olimpici.

$ $ $
 $ $

Fondamentalmente una modifica della risposta
Peter Taylor,

2

C ++ con SFML (1003 incl. Spazi bianchi)

Non piccolo da qualsiasi tratto dell'immaginazione, ma mantenuto il più conciso ma leggibile possibile e ancora inferiore a 1k.

#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;
}

Modifica: colori aggiornati basati sull'invio SVG di @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);

Risultato

inserisci qui la descrizione dell'immagine


0

realizzato una soluzione basata su un'edizione UltraGolfed della GUI di Java Swing (696 caratteri)

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);}}

Semi-non compresso: (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);
    }
}

Potresti aggiungere uno screenshot?
Paŭlo Ebermann,

0

POWERSHELL,
codice 869 e output nell'immagineLogo olimpico di PowerShell


0

SpecBAS

Ogni anello è costituito da un cerchio interno / esterno, quindi riempito.

Ho dovuto trovare le intersezioni manualmente e riempirle singolarmente (in modo da poter ancora vedere alcune delle linee tra loro).

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

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.