Desenhe o arco-íris


25

O desafio é simples: desenhe um arco-íris no menor número de bytes possível

As especificações para o arco-íris são as seguintes:

  • A figura deve ter exatamente 400 pixels de largura e 200 pixels de altura (opcional 401x201 se você quiser um único pixel central)
  • O anel vermelho deve tocar todas as bordas da figura (raio externo = 200 pixels)
  • Todos os anéis devem ter a mesma largura (10 pixels)
    • O anel violeta deve ter um raio interno de 130 pixels
  • O arco deve ser a metade superior de um círculo perfeito
  • O fundo deve ser branco (transparente também é aceito)
  • A figura não deve ter bordas (exceção é feita se a borda não puder ser suprimida)
  • Não são permitidas funções internas de criação de arco-íris!

As seguintes cores devem ser usadas no arco-íris:

arco Iris

Este é o código golf, então o código mais curto em bytes vence!

Exemplo:

arco Iris

Relacionado, mas diferente!


26
Builtin do arco-íris fazendo funções não são permitidos Como eu tenho certeza Mathematica tem uma
— Luis Mendo

Quão imperfeito pode ser o arco-íris? De não serrilhado a rasgar? Considere as imagens em esta resposta
— aross

@aross: deve parecer com o arco-íris de amostra (alguns pixels podem variar devido a cálculos imprecisos). Os dois últimos arco-íris são muito "bagunçados", enquanto o primeiro parece ok. Eu não tenho uma regra perfeita, para usá-lo melhor julgamento :-)
— Stewie Griffin

@ StewieGriffin A razão pela qual estou perguntando é que, aparentemente, os gráficos PHP são bastante problemáticos, enquanto a solução está correta na teoria . Bem, o segundo é, o terceiro seria com anti-aliasing (que também não funciona bem)
— aross

Gráficos vetoriais não são permitidos? editar: não importa - eu vejo que já existe uma resposta TikZ, então eu acho que elas são.
— Julian Lobo

Respostas:


15

MATL , 107 95 92 87 84 83 bytes

-200:200 0:200!PYyq10/k12-t8<*t0>*Q7B.561FTh.295Oh.51h4BPFTF6Bl.5hOh4B8$v255*k5M/YG

Isso funciona na versão atual (14.0.0) do idioma / compilador.

EDIT (6 de julho de 2017) : Você pode experimentá-lo no MATL Online! .

Para verificar se as cores estão corretas, remova os últimos cinco caracteres (é necessário aguardar alguns segundos e role para baixo até o final da saída).

insira a descrição da imagem aqui

Explicação

O código possui três etapas principais:

Etapa 1 : Gere uma matriz 201x401 com números de 1até 8. Pixels com valor 1são fundo (branco), pixels com valores 2, ..., 8representam cada banda do arco-íris.

Coordenadas horizontais vão desde -200a 200esquerda para a direita, e coordenadas verticais vão desde 0a 200base ao topo. Portanto, a origem (0,0) é o centro inferior, o canto superior esquerdo é (-200.200), etc.

As diferentes bandas do arco-íris são geradas calculando a distância de cada pixel até a origem e quantizando em etapas de 10 pixels.

Etapa 2 : Gere uma matriz 8x3 definindo o mapa de cores. Cada linha é uma das cores necessárias (branco e as sete cores do arco-íris). Cada valor da matriz 201x401 anterior será interpretado como um índice para uma linha desse mapa de cores.

Geramos a matriz do mapa de cores usando valores entre 0 e 1 para cada componente de cor e, em seguida, multiplicando por 255 e arredondando para baixo. Dessa forma, a maioria dos valores é inicialmente 0 e 1, que mais tarde se tornará 0 e 255. Os valores intermediários são codificados como valores entre 0 e 1 com 2 ou 3 casas decimais, escolhidos para que, quando multiplicados e arredondados, forneçam o valor exato desejado.

Etapa 3 : Exiba a imagem com esse mapa de cores.

               % STEP 1: CREATE MATRIX DEFINING THE RAINBOW BANDS
-200:200       % row vector [-200, -199, ..., 200]
0:200          % row vector [0, 1, ..., 200]
!P             % transpose and flip: convert into column vector [200; 199; ...; 0]
Yy             % hypotenuse function with broadcast: distance from each point to (0,0)
q10/k          % subtract 1, divide by 10, floor (round down). Gives 20 circular bands
               % 10 pixels wide, with values from 0 to 19
12-            % subtract 12
t8<*           % values larger than 7 are set to 0
t0>*           % values less than 0 are set to 0. We now have 7 bands with values
               % 1, ..., 7, and the white background with value 0
Q              % add 1: white becomes 1, bands become 2, ..., 8

               % STEP 2: CREATE MATRIX DEFINING THE COLORMAP
7B             % first row: [1 1 1] (7 converted to binary: color white)
.561FTh        % second row (light purple)
.295Oh.51h     % third row (dark purple)
4BP            % fourth row: [0 0 1] (4 converted to binary and flipped: blue)
FTF            % fifth row (green)
6B             % sixth row: [1 1 0] (6 converted to binary: yellow)
l.5hOh         % seventh row: orange
4B             % eigth row: [1 0 0] (4 converted to binary: red)
8$v            % vertically concatenate the 8 eight rows
255*k          % multiply by 255 and round down. Gives exact color values 
5M/            % push 255 again and divide. This is needed because colors in MATL are
               % defined between 0 and 1, not between 0 and 255

               % STEP 3: DISPLAY
YG             % display image with that colormap

28

Piet , 838 codéis, vários milhares de pixels

Alguém tinha que fazer isso:

Um arco-íris impressionante

Se você salvar esta imagem, poderá experimentá-la online !

O programa Piet atual é apenas o top ~ 125 pixels, que eu criei usando um programa Python que escrevi.

Editar isso depois realmente machucou minha visão, vou ficar tropeçando por dias!

Isso gera a imagem em um formato SVG, porque o SVG é realmente (na minha opinião) a maneira mais simples de fazer isso. Roubei descaradamente o código SVG da maçaneta da porta. Saídas:

saída correta

bem, isso realmente:

<svg viewBox='0 0 400 200'><circle cx='200' cy='200' r='200' fill='red'/><circle cx='200' cy='200' r='190' fill='#ff7f00'/><circle cx='200' cy='200' r='180' fill='yellow'/><circle cx='200' cy='200' r='170' fill='lime'/><circle cx='200' cy='200' r='160' fill='blue'/><circle cx='200' cy='200' r='150' fill='indigo'/><circle cx='200' cy='200' r='140' fill='#8f00ff'/><circle cx='200' cy='200' r='130' fill='white'/></svg>

Boa sorte em vencer esta resposta, usuários que não são da Esolang!


2
Esse script python é público? Eu estou pedindo para um amigo, que é muito preguiçosa ....
— NaCl

Erm, leva literalmente ~ 2 minutos para implementar o xD Você pode encontrar uma versão antiga aqui e ajustá-la, se necessário: mediafire.com/download/0isocsb81n7r2cv/piet.py (observação: eu fiz isso quando tinha 10 anos, o código é embaraçoso para dizer o mínimo) - ele precisa do PyPNG instalado.
— theonlygusti

15

Pitão, 150 149 128 bytes

"<svg viewBox=0,0,400,200>"V8s["<circle cx=200 cy=200 r="-200*TN" fill="@c"red #ff7f00 #ff0 #0f0 #00f indigo #8f00ff #fff"dN" />

Saídas em SVG:

<svg viewBox=0,0,400,200>
<circle cx=200 cy=200 r=200 fill=red />
<circle cx=200 cy=200 r=190 fill=#ff7f00 />
<circle cx=200 cy=200 r=180 fill=#ff0 />
<circle cx=200 cy=200 r=170 fill=#0f0 />
<circle cx=200 cy=200 r=160 fill=#00f />
<circle cx=200 cy=200 r=150 fill=indigo />
<circle cx=200 cy=200 r=140 fill=#8f00ff />
<circle cx=200 cy=200 r=130 fill=#fff />

arco Iris

Obrigado a @MamaFunRoll por 16 bytes e a @PatrickRoberts por mais 6!


2
Você provavelmente poderia economizar muitos bytes compactando as strings.
— a spaghetto

@AquaTart Tudo o que faz é adicionar bytes. O_o
— Maçaneta da porta

3
Acho que você não precisa de nenhuma das aspas, barras finais ou a última </svg>tag final .
— Mama Fun Roll

4
Duas sugestões: red #ff7f00 #ff0 #0f0 #00f #8f00ff #fffpara a lista de cores e tomar aspas simples fora todos os valores de parâmetros que não têm espaços neles ( cx, cy, re fill), mas certifique-se de deixar um espaço entre o valor do preenchimento e do /assim que a cor não ficar mal interpretado . Remova também o </svg>como sugerido acima.
— Patrick Roberts

1
Desculpe, eu quis dizer red #ff7f00 #ff0 #0f0 #00f indigo #8f00ff #fff. Além disso, se você substituir os espaços por vírgulas, viewBoxtambém poderá remover aspas simples para esse parâmetro.
— Patrick Roberts

14

Minecraft 1.10 (quase), 2677 caracteres com um comando, 868 blytes

Bem, eu com certeza escolhi uma linguagem detalhada.

summon FallingSand ~ ~1 ~ {Block:log,Time:1,Passengers:[{id:FallingSand,Block:redstone_block,Time:1,Passengers:[{id:FallingSand,Block:activator_rail,Time:1,Passengers:[{id:MinecartCommandBlock,Command:"summon ArmorStand ~ ~ ~ {Tags:[\"b\"]}"},{id:MinecartCommandBlock,Command:"summon Pig ~ ~ ~ {NoAI:1b}"},{id:MinecartCommandBlock,Command:setblock ~-1 ~-2 ~6 chain_command_block 3 replace {auto:1,Command:"execute @e[tag=b] ~ ~ ~ execute @e[rm=200] ~ ~ ~ tp @e[c=1] ~ -99 ~"}},{id:MinecartCommandBlock,Command:setblock ~-1 ~-2 ~5 chain_command_block 3 replace {auto:1,Command:"execute @e[tag=b] ~ ~ ~ execute @e[rm=190,r=200] ~ ~ ~ setblock ~ ~ ~ wool 14"}},{id:MinecartCommandBlock,Command:setblock ~-1 ~-2 ~4 chain_command_block 3 replace {auto:1,Command:"execute @e[tag=b] ~ ~ ~ execute @e[rm=180,r=190] ~ ~ ~ setblock ~ ~ ~ wool 1"}},{id:MinecartCommandBlock,Command:setblock ~ ~-2 ~4 chain_command_block 4 replace {auto:1,Command:"execute @e[tag=b] ~ ~ ~ execute @e[rm=170,r=180] ~ ~ ~ setblock ~ ~ ~ wool 4"}},{id:MinecartCommandBlock,Command:setblock ~ ~-2 ~5 chain_command_block 2 replace {auto:1,Command:"execute @e[tag=b] ~ ~ ~ execute @e[rm=160,r=170] ~ ~ ~ setblock ~ ~ ~ wool 13"}},{id:MinecartCommandBlock,Command:setblock ~ ~-2 ~6 chain_command_block 2 replace {auto:1,Command:"execute @e[tag=b] ~ ~ ~ execute @e[rm=150,r=160] ~ ~ ~ setblock ~ ~ ~ wool 11"}},{id:MinecartCommandBlock,Command:setblock ~ ~-2 ~7 chain_command_block 2 replace {auto:1,Command:"execute @e[tag=b] ~ ~ ~ execute @e[rm=140,r=150] ~ ~ ~ setblock ~ ~ ~ wool 10"}},{id:MinecartCommandBlock,Command:setblock ~ ~-2 ~8 chain_command_block 2 replace {auto:1,Command:"execute @e[tag=b] ~ ~ ~ execute @e[rm=130,r=140] ~ ~ ~ setblock ~ ~ ~ wool 2"}},{id:MinecartCommandBlock,Command:setblock ~1 ~-2 ~8 chain_command_block 4 replace {auto:1,Command:"tp @e[type=Cow] ~1 ~ ~"}},{id:MinecartCommandBlock,Command:setblock ~1 ~-2 ~7 chain_command_block 3 replace {auto:1,Command:"tp @e[type=Bat] ~-1 ~ ~"}},{id:MinecartCommandBlock,Command:setblock ~1 ~-2 ~6 chain_command_block 3 replace {auto:1,Command:"execute @e[type=Pig] ~ ~ ~ summon Bat ~ ~ ~ {NoAI:1b}"}},{id:MinecartCommandBlock,Command:setblock ~1 ~-2 ~5 chain_command_block 3 replace {auto:1,Command:"execute @e[type=Pig] ~ ~ ~ summon Cow ~ ~ ~ {NoAI:1b}"}},{id:MinecartCommandBlock,Command:setblock ~1 ~-2 ~4 repeating_command_block 3 replace {auto:1,Command:"tp @e[type=Pig] ~ ~1 ~"}},{id:MinecartCommandBlock,Command:setblock ~ ~ ~1 command_block 0 replace {Command:fill ~ ~-3 ~-1 ~ ~ ~ air}},{id:MinecartCommandBlock,Command:setblock ~ ~-1 ~1 redstone_block},{id:MinecartCommandBlock,Command:kill @e[type=MinecartCommandBlock,r=1]}]}]}]}

Crie um novo mundo Superflat, cole essa bagunça em um bloco de comando Impulse, defina sua distância de renderização bastante alta e execute-a. Quebre a armadura quando o computador parar de ficar.

O resultado tem 400 blocos de largura e 200 de altura, conforme solicitado.

Eu costumava gerador de um comando de MrGarretto para embalar tudo juntos, e depois modificado o resultado de que um pouco para salvar um casal mais bytes. Aqui está a entrada para isso:

INIT:summon ArmorStand ~ ~ ~ {Tags:["b"]}
INIT:summon Pig ~ ~ ~ {NoAI:1b}
tp @e[type=Pig] ~ ~1 ~
execute @e[type=Pig] ~ ~ ~ summon Cow ~ ~ ~ {NoAI:1b}
execute @e[type=Pig] ~ ~ ~ summon Bat ~ ~ ~ {NoAI:1b}
tp @e[type=Bat] ~-1 ~ ~
tp @e[type=Cow] ~1 ~ ~
execute @e[tag=b] ~ ~ ~ execute @e[rm=130,r=140] ~ ~ ~ setblock ~ ~ ~ wool 2
execute @e[tag=b] ~ ~ ~ execute @e[rm=140,r=150] ~ ~ ~ setblock ~ ~ ~ wool 10
execute @e[tag=b] ~ ~ ~ execute @e[rm=150,r=160] ~ ~ ~ setblock ~ ~ ~ wool 11
execute @e[tag=b] ~ ~ ~ execute @e[rm=160,r=170] ~ ~ ~ setblock ~ ~ ~ wool 13
execute @e[tag=b] ~ ~ ~ execute @e[rm=170,r=180] ~ ~ ~ setblock ~ ~ ~ wool 4
execute @e[tag=b] ~ ~ ~ execute @e[rm=180,r=190] ~ ~ ~ setblock ~ ~ ~ wool 1
execute @e[tag=b] ~ ~ ~ execute @e[rm=190,r=200] ~ ~ ~ setblock ~ ~ ~ wool 14
execute @e[tag=b] ~ ~ ~ execute @e[rm=200] ~ ~ ~ tp @e[c=1] ~ -99 ~

No total, são mais de 15 1,9+ blocos de comando e 838 bytes, então 15 * 2 + 838 = 868 blytes .

Aqui está a parte (quase): falta um canto e uma borda. Logicamente não deveria - o bug do Minecraft? Seriam exatamente blocos de 400x200 se não fosse por isso. Não posso fazer muito.

Rainboom


4
Yay, um gerador de arco-íris baseado em porco! +1
— TuxCrafting

Se são 2677 caracteres, como podem ser apenas 868 "blytes"? De como eu entendo que página os blytes reais deve ser 2677 + 4
— theonlygusti

É 868 se você construir, no mundo, 2.677 se você usar fallingsand para criá-lo (que tem um monte de sobrecarga)
— quat

12

Mathematica 152 144 126 bytes

Graphics@MapIndexed[{#,Disk[{0,0},4-#/5&@@#2,{Pi,0}]}&,RGBColor/@TextWords@"#f00 #ff7f00 #ff0 #0f0 #00f #4b0082 #8f00ff #fff"]

insira a descrição da imagem aqui

Obrigado @CatsAreFluffy por cortar 8 bytes e @njpipeorgan por mais 18 :)


3
Use #vs #[[1]], #2vs #[[2]], e @@@vs /@.
— CalculatorFeline

1
Além disso, Threadfunciona em vez de Transpose.
— precisa

1
Graphics@MapIndexed[{#,Disk[{0,0},4-#/5&@@#2,{Pi,0}]}&,RGBColor/@TextWords@"#f00 #ff7f00 #ff0 #0f0 #00f #4b0082 #8f00ff #fff"]salva outros 18 bytes, mas a ideia é a mesma.
— Njpipeorgan 14/03

1
Apenas curioso ... é lá um "builtin arco-íris"?
— mbomb007

@ mbomb007 não que eu saiba!
— martin

8

vim, 165 142 139

i<svg viewBox=0,0,400,200><cr><circle cx=2<C-n> cy=2<C-n> r=2<C-n> fill=red<cr>#ff7f00<cr>#ff0<cr>#0f0<cr>#00f<cr>indigo<cr>#8f00ff<cr>#fff<esc>2Gqq0y4f=jPBB10<C-x>@qq@qV2G:norm A /><cr>

Sim, isso é desajeitado. Tem que haver melhorias que podem ser feitas.

Saídas como SVG, como minha resposta Pyth .

Obrigado a @MyHamDJ por cortar 3 bytes!


Você pode cortar 2 bytes (ou pressionamentos de tecla) se substituir o último comando ex porkv3G:norm A'/><cr>
— DJMcMayhem

Você também pode retirar mais 3 se inserir a <circle cx...sequência na linha 2 pela primeira vez, em vez de digitar todas as cores e inseri-la depois.
— DJMcMayhem

8

HTML + SVG + ES6, 169

<svg width=400 viewBox=0,0,40,20 onload="this.innerHTML=`f00
ff7f00
ff0
0f0
00f
4b0082
8f00ff
fff`.replace(/.+/g,c=>`<circle cx=20 cy=20 r=${--r} fill=#${c} />`,r=21)"/>


use height=200e em cx=200 cy=200 r=${--r}0vez de viewBox='0 0 40 20'. Isso deve economizar 7 bytes.
— Patrick Roberts

Espero que seja tudo bem que eu pedi emprestado a sua ideia com o .replacemétodo ...
— Patrick Roberts

@PatrickRoberts Claro que é ok, eu peguei emprestado alguns de vocês
— edc65

5
Eu certamente não esperava ver r-=1no golfe código ...
— Neil

@Neil bah! foi - = 10 em alguns iteração antes do lançamento final
— edc65

7

Rubi com Sapatos, 155 bytes

Shoes.app(width:400,height:200){background'fff'
8.times{|i|stroke fill %w{f00 ff7f00 ff0 0f0 00f 4b0082 8f00ff fff}[i]
oval left:i*=10,top:i,radius:200-i}}

Saída de amostra:

arco-íris por Ruby com sapatos


6

JavaScript (ES6), 171 158 bytes

document.write`<svg width=400 height=200>${`f00
ff7f00
ff0
0f0
00f
4b0082
8f00ff
fff`.replace(/.+/g,c=>`<circle cx=200 cy=200 r=${i--}0 fill=#${c} />`,i=20)}`

Crédito para @ edc65 pela idéia de converter

`[...].map((c,i)=>...)`

para

`...`.replace(/.+/g,c=>...,i=20)

Pode parecer mais longo, mas a quantidade de bytes salvos na compactação da matriz em uma cadeia vale bem a conversão. (Ele salva 13 bytes neste caso)

Demo

document.write`<svg width=400 height=200>${`f00
ff7f00
ff0
0f0
00f
4b0082
8f00ff
fff`.replace(/.+/g,c=>`<circle cx=200 cy=200 r=${i--}0 fill=#${c} />`,i=20)}`


6

HTML (162) + CSS (146)

body{height:200px;width:400px}div{height:100%;box-sizing:border-box;border-radius:50% 50% 0 0/100% 100% 0 0;border:solid;border-width:10px 10px 0}
<div style=color:red><div style=color:#FF7F00><div style=color:#FF0><div style=color:#0F0><div style=color:#00F><div style=color:#4B0082><div style=color:#8F00FF>


HTML (224) + CSS (128)

body{height:200px;width:400px}div{height:100%;box-sizing:border-box;border-radius:50% 50% 0 0/100% 100% 0 0;padding:10px 10px 0}
<div style=background:red><div style=background:#FF7F00><div style=background:#FF0><div style=background:#0F0><div style=background:#00F><div style=background:#4B0082><div style=background:#8F00FF><div style=background:#FFF>


5

SpecBAS - 318 254 bytes

Se estamos desenhando arco-íris, parece um bom lugar para usar o sucessor do ZX Spectrum BASIC.

1 p,k=20,x1=0,x2=400,y=200
2 FOR EACH s IN [16711680,16744192,16776960,65280,255,4915330,9371903]: PALETTE p,s: INC p: NEXT s
3 CLS 15: DRAW 0,200 TO 70,200: DRAW 330,200 TO 400,200
4 FOR i=1 TO 7
5 INK k: DRAW x1,y TO x2,y,-PI: DRAW x1+10,y TO x2-10,y,-PI: FILL x1+5,190
6 x1+=10,x2-=10,k+=1
7 NEXT i

A linha 2 configura a paleta para os valores RGB específicos necessários (e provavelmente não está ajudando na contagem de bytes), pois as cores padrão do Spectrum não coincidem.

O DRAWcomando pode usar um parâmetro extra que faz girar vários graus radianos entre x1, y1 e x2, y2. Por fim, encontra uma lacuna nos semicírculos que acabamos de desenhar e a cor atual é preenchida.

insira a descrição da imagem aqui


5

Tcl / Tk , 263 bytes

canvas .c -bg #FFF -bo 0 -highlightt 0;pack .c -e 1 -f both;wm ge . 400x200;foreach {r c} {200 #FF0000 190 #FF7F00 180 #FFFF00 170 #00FF00 160 #0000FF 150 #4B0082 140 #8F00FF 130 #FFF} {.c cr o -$r -$r $r $r -outline $c -f $c};after 100 {.c x s -5 u;.c y s -10 u}

Infelizmente, esse tipo de pergunta sempre favorece algumas linguagens esotéricas ... Dito isso, o Tcl / Tk realmente faz operações gráficas: fácil, curto e legíveis .

Dito isso, sacrifiquei a legibilidade para reduzir as opções até o mínimo de caracteres possível. Eu não imagino triturar a lista de cores ajudará muito em comparação com o código para descompactá-lo ...

Para comparação, aqui está o código não criptografado (380 bytes):

canvas .c -bg #FFF -borderwidth 0 -highlightthickness 0
pack .c -expand yes -fill both
wm geometry . 400x200
foreach {r c} {
  200 #FF0000 
  190 #FF7F00 
  180 #FFFF00 
  170 #00FF00 
  160 #0000FF 
  150 #4B0082 
  140 #8F00FF 
  130 #FFFFFF
} {
  .c create arc -$r -$r $r $r -extent 180 -outline $c -fill $c
}
after 100 {
  .c xview scroll -5 units
  .c yview scroll -10 units
}

o after comando foi infelizmente necessário, pois não rolagem (de origem de coordenadas do canvas) pode ser feito antes que a janela é mapeada para a tela.

Além disso, o código crunched realmente desenha um completo arco-íris (usando um círculo em vez de um arco) e depende apenas do recorte da janela ...

Enfim, espero que gostem. : O)


Você pode usar em lmapvez de foreachencurtar.
— sergiol

E você pode colocar a primeira linha dentro da segunda como:pack [canvas .c -bg #FFF -bo 0 -highlightt 0] -e 1 -f both
— sergiol

Há uma incoerência entre as duas versões do seu código. Golfed faz create oval; não destruído faz create arc. Você pode explicar, por favor?
— Sergiol

Obrigado pelo comentário. A versão ungolfed é para legibilidade, não exatidão na implementação. E, infelizmente, não vou voltar e consertar todo o meu foreach -> lmap; que pode ser deixado para o leitor ...: O)
— Dúthomhas

5

LaTeX, 290 bytes

\documentclass{proc}\input tikz\begin{document}\def\z#1!#2!#3!#4!{\definecolor{t}{rgb}{#1,#2,#3}\fill[color=t](200pt,0)circle(#4pt);}\tikz{\clip(0,0)rectangle(400pt,200pt);\z1!0!0!200!\z1!.5!0!190!\z1!1!0!180!\z0!1!0!170!\z0!0!1!160!\z.29!0!.51!150!\z.56!0!1!140!\z1!1!1!130!}\end{document}

Experimente aqui .

Explicações

\documentclass{proc}
\input tikz
\begin{document}

    %Define macro "\z" with 4 arguments.         
    % The first 3 arguments are rgb values for the color
    % Last argument is the radius in pt that we draw a full circle with

    \def\z#1!#2!#3!#4!
        {\definecolor{t}{rgb}{#1,#2,#3}
         \fill[color=t](200pt,0)circle(#4pt);}

    % Start a Tikz figure

    \tikz{

        % We only draw the top half of the circle

        \clip(0,0)rectangle(400pt,200pt);

        % Draw each circle from biggest to smallest

        \z1!0!0!200!
        \z1!.5!0!190!
        \z1!1!0!180!
        \z0!1!0!170!
        \z0!0!1!160!
        \z.29!0!.51!150!
        \z.56!0!1!140!

        % Draw a white circle last

        \z1!1!1!130!
    }
\end{document}

@DonMuesli Obrigado pelo link, adicionado.
— Fatalize 15/03/16

4

Java, 354 bytes

public void r() throws IOException{BufferedImage i=new BufferedImage(400,200,2);Graphics2D g=i.createGraphics();g.setStroke(new BasicStroke(10));int[]c={0xFF0000,0xFF7F00,0xFFFF00,0xFF00,255,0x4B0082,0x8F00FF};for(int v=0;v<7;v ++){g.setColor(new Color(c[v]));g.drawArc(v*10+5,v*10+5,390-v*20,390-v*20,0,360);}ImageIO.write(i,"PNG",new File("a.png"));}}

Apenas usa a Graphics2Dclasse para desenhar 7 arcos, com uma matriz para armazenar as cores. Tenho certeza que pode ser melhorado ainda mais.

Código não destruído:

public void ungolfed() throws IOException {
        BufferedImage i = new BufferedImage(400, 200, 2); // 2 is TYPE_INT_ARGB
        Graphics2D g = i.createGraphics();
        g.setStroke(new BasicStroke(10));
        int[] c = {0xFF0000, 0xFF7F00, 0xFFFF00, 0x00FF00, 0x0000FF, 0x4B0082, 0x8F00FF};
        for(int v = 0; v < 7; v ++) {
            g.setColor(new Color(c[v]));
            g.drawArc(v * 10 + 5, v * 10 + 5, 390 - v * 20, 390 - v * 20, 0, 360);
        }
        ImageIO.write(i, "PNG", new File("a.png"));
    }

2
Você 0x0000ffpode ser justo 0xffou mesmo 255igual ao 0x00ff00ser 0xff00. 0xff0000pode ser 255<<16salvar outro byte. Seu loop poderia ser salvar mais alguns bytes. Você pode salvar mais um byte adicionando a ,qà sua intdeclaração. Você teria que fazê-lo int c[]=em vez de int[] cpor isso qé um inte não um int[]. Isso permite adicionar um q=390-v*20;ao seu loop. e substitua 390-v*20por um q. É muito trabalho para um byte, mas um byte é um byte, certo ?!
— corsiKa

2
Você pode salvar mais dois bytes apenas lançando Exception em vez de IOException.
— corsiKa

Gostaria também de saber se você pode usar drawOvale apenas tornar a metade superior da imagem ... pode ser um pouco embora mais caro ...
— corsiKa

Eu sei que tem sido cerca de 1,5 ano, mas você pode golfe um pouco .. void r()throws Exception{BufferedImage i=new BufferedImage(400,200,2);Graphics2D g=i.createGraphics();g.setStroke(new BasicStroke(10));for(int c[]={255<<16,16744192,16776960,65280,255,4915330,9371903},v=0,t;v<7;g.drawArc(t=v*10+5,t,t=390-v++*20,t,0,360))g.setColor(new Color(c[v]));ImageIO.write(i,"PNG",new File("a.png"));}}( 325 bytes )
— Kevin Cruijssen

4

Chiclete , 139 119 bytes

Hexdump:

00000000: b329 2e4b 5728 cb4c 2d77 caaf b035 d031  .).KW(.L-w...5.1
00000010: d031 3130 d031 3230 b0e3 b249 ce2c 4ace  .110.120...I.,J.
00000020: 4955 48ae b005 f215 922b c154 1198 4ccb  IUH......+.T..L.
00000030: ccc9 b12d 4a4d 51d0 c7ad ced0 12aa 4e39  ...-JMQ.......N9
00000040: 2dcd 3c0d 2884 4fad 0542 2d7e 85e6 3085  -.<.(.O..B-~..0.
00000050: 0604 149a c115 1aa4 e155 680a 5598 9997  .........Uh.U...
00000060: 9299 9e8f 57a9 09cc 4c0b a07f d2f0 1b6b  ....W...L......k
00000070: 8cf0 1148 2100 0a                        ...H!..

Infelizmente, isso é mais curto que minha resposta de Pyth . :(

Gera o mesmo arquivo SVG.


4

CSS, 244 242 240 bytes

body{width:400px;height:200px;background-image:radial-gradient(500px at bottom,#FFF 26%,#8F00FF 26%,#8F00FF 28%,#4B0082 28%,#4B0082 30%,#00F 30%,#00F 32%,#0F0 32%,#0F0 34%,#FF0 34%,#FF0 36%,#FF7F00 36%,#FF7F00 38%,red 38%,red 40%,#FFF 40%)}

Editar: salvou 2 bytes, contornando um bug no Chrome. Economizei mais 2 bytes graças a @TrangOul.

Nota: o trecho usa <div>devido a limitações dos trechos de pilha.


Parece que o fundo do lado de fora do arco-íris está vermelho (pelo menos no meu telefone).
— Stewie Griffin

@StewieGriffin Funciona bem para mim no Firefox para Android. (Eu não poderia trabalhar para fora como para permitir Pilha Snippets no navegador padrão do meu telefone.)
— Neil

Ok, um pouco estranho :-) eu estou usando o chrome 49.0.2623.91 na galaxy s6 edge btw.
— Stewie Griffin

@StewieGriffin Parece que também está quebrado no Chrome para Windows.
— 305 Neil

@StewieGriffin OK Acho que tenho uma solução alternativa e ela salva dois bytes também!
— Neil

4

Javascript 271 251

c=document.body.appendChild(document.createElement('canvas'))
x=c.getContext('2d')
c.width=400
r=c.height=200
for(i=0;i<8;x.beginPath(),x.arc(r,r,r-i*10,0,7),x.fillStyle="#"+"FF0000FF7F00FFFF0000FF000000FF4B00828F00FFFFFFFF".substr(i++*6,6),x.fill());


Obrigado @StewieGriffin Fiz a alteração para 10. Estive tentando fazer a contagem regressiva, mas ainda há maneiras de maçaneta resposta de pyth!
— 11286 wolfhammer

Você pode mover tudo entre for e { ... }para dentro da última seção, separada por ,. por exemplo for(i=0;i<8;x.beginPath(),x.arg(...etc...)). Você provavelmente também pode usar slice/ spliceof substr se não me engano. Também pode ser mais curto usar o <canvas> .innerHTML. Ou até mesmo uma resposta HTML + JS e dar o <canvas> e id ce, em seguida, ele deve ser adicionado automaticamente como uma variável global JS
— Downgoat

O @Downgoat substrtem a vantagem aqui, pois seu segundo parâmetro é um comprimento, não um deslocamento. Quanto ao golfe, document.bodyparece proporcionar uma economia considerável.
— 305 Neil

4

C, 220 217 213 bytes

#define X printf("%c",s<169|s/401?y:s
i=8e4,t,y=255;main(s){for(puts("P6 400 200 255");i--;X/288?y:s<195?143:s<225?75:0),X<256|s/360?0:s/323?127:y),X<225&s/195?130:s<256?y:0))s=i/400,t=i%400-200,s=(s*s+t*t)/100;}

A saída é PPM (o tipo binário).

Editar: salvou alguns bytes graças a @tucuxi.

Editar 2: código reorganizado para economizar ainda mais.


1
você pode raspar um byte com i;s;t;main()-> s;t;main(i)e outro colocando parte do corpo do loop for dentro do for: ;)code1,code2;-> ;code2)code1;(salva uma vírgula!).
— tucuxi

4

Google Blockly , 48 blocos, 75 bytes

Clique no gif abaixo para navegar até a solução, onde você pode ver de perto como ela funciona.
Quanto a uma explicação, acho que uma imagem vale mais que mil palavras e, portanto, um gif vale mais que mil imagens.

link para o grande gif legível

Nota: Não tenho certeza de como contar no Blockly, portanto contei cada bloco como 1 byte e todas as variáveis ​​da maneira regular, de modo que 0== 1 byte, 530== 3 bytes, Arial== 5 bytes e bold== 4 bytes.
Contei o caractere especial que usei para cortar o arco-íris em 2 bytes. Por favor, relate quaisquer erros ou sugestões da contagem de bytes nos comentários


4

Postscript (87 bytes)

Despejo hexagonal:

00000000: 3188 0131 2030 2e35 3631 8800 3120 302e  1..1 0.561..1 0.
00000010: 3237 3888 0030 2e35 3188 0030 8801 3088  278..0.51..0..0.
00000020: 0130 8801 3188 0031 2030 2e35 8800 3188  .0..1..1 0.5..1.
00000030: 0030 87c8 0038 7b34 2031 9287 929d 87c8  .0...8{4 1......
00000040: 0030 2032 9258 3087 b400 9205 9216 9242  .0 2.X0........B
00000050: 880a 92a9 7d92 83                        ....}..

Saída:

insira a descrição da imagem aqui


3

HTML + CSS, 310 307 bytes

<b style=background:red><b style=background:#ff7f00><b style=background:#ff0><b style=background:lime><b style=background:blue><b style=background:indigo><b style=background:#8f00ff><b style=background:#fff;width:260px;height:130px><style>b{float:left;padding:10px 10px 0 10px;border-radius:300px 300px 0 0}

Marcação inválida do superdobrador (pode ou não parecer correta no seu navegador). Só queria ver se era possível.


Você pode cortar dois bytes usando # FF0 em vez de amarelo. Você também pode usar o atributo bgcolor em vez dos atributos de estilo.
— curiousdannii

@curiousdannii Você está certo sobre as cores ( whitetambém pode ser reduzido), é claro - não sei por que não vi isso. Eu tentei bgcolorantes de postar, porém, mas, infelizmente, ele não é mais suportado (aqui no Chrome qualquer maneira)
— Flambino

3

PHP, 285 bytes

<?php $a=imagecreate(400,200);define("b",255);$c=array(b,b,b,b,0,0,b,127,0,b,b,0,0,b,0,0,0,b,75,0,130,143,0,b,b,b,b);for($i=0;$i<9;$i++){imagefilledellipse($a,200,200,420-$i*20,420-$i*20,imagecolorallocate($a,$c[$i*3],$c[$i*3+1],$c[$i*3+2]));}header("Content-type:png");imagepng($a);?>

Saídas:

Taste the rainbow!


1
Bom esforço. Mas observe que fechar a tag PHP no final do arquivo é considerado um mau hábito, mesmo quando não está jogando golfe. Seria mais curto como script CLI, para que você possa poupar essa header()chamada e até a tag PHP de abertura. No Linux, o mais simples é executar php -r '$a=imagecreate(400,200);const b=255;for($c=[b,b,b,b,0,0,b,127,0,b,b,0,0,b,0,0,0,b,75,0,130,143,0,b,b,b,b];$i<9;)imagefilledellipse($a,200,200,$r=420-$i*20,$r,imagecolorallocate($a,$c[$j=$i++*3],$c[$j+1],$c[$j+2]));imagepng($a);' | displayno prompt de comando e contá-lo como 227 caracteres. (Usando PHP 5.6.11.)
— manatwork 14/03

3

Bash + ImageMagick, 159 125 caracteres

eval convert -size 401x201 xc: '-fill \#'{f00,ff7f00,ff0,0f0,00f,4b0082,8f00ff,fff}' -draw "circle 200,200 200,$[i++*10]"' x:

Saída de amostra:

rainbow by Bash + ImageMagick


3

Processamento, 196 186 181 179 169 163 bytes

int d=400,i=0;size(d,d/2);background(-1);int[]c={-65536,-33024,-256,#00ff00,#0000ff,#4b0082,#8f00ff,-1};for(noStroke();i<8;ellipse(200,200,d,d),d-=20)fill(c[i++]);

rainbow

Economizou 10 bytes graças a Kritixi Lithos
... e outros 6 bytes graças a dzaima


2
Pode cortar mais um byte mudando for(int i=0;i<8;i++)para for(int i=0;i++<8;)ou similar
— quat

Eu não acho que você pode usar variáveis ​​enquanto chamasize()
— Kritixi Lithos 4/16/16

@KritixiLithos O ​​que você quer dizer?
— Flambino 04/12/19

Quando chamo tamanho com variáveis ​​como parâmetros,
— ocorre

background(-1)é um byte menor do que background(255), e você pode mudar o 255em ordem cpara -1salvar outro byte
— Kritixi Lithos

2

R, 184 bytes 170

Criar uma imagem com dimensões fixas de pixel é surpreendentemente complicado com R, cujas funções de plotagem são destinadas principalmente a estatísticos. Em particular, R deixa espaço extra para etiquetas e eixos de coordenadas, a menos que você defina explicitamente as margens como largura zero chamandopar .

Por outro lado, algumas das cores necessárias (especificamente vermelho, amarelo e azul) são encontradas na paleta padrão e podem ser referenciadas simplesmente por índices inteiros.

png(,400,200)
par(mar=0*1:4)
plot(as.raster(outer(199:0,-199.5:200,function(y,x)c(rep("white",13),"#8F00FF","#4B0082",4,"green",7,"#FF7F00",2)[1+(x^2+y^2)^.5%%200/10])))

2

Quarto Salão Haiku (184 bytes)

Não posso satisfazer as restrições de dimensão com esse formato, mas achei que valeria a pena compartilhar de qualquer maneira.

: ^ 2 ** ;
: b 0.9 * dup x .5 - ^ y 2.01 / ^
+ sqrt dup rot > swap rot .045
+ < * * + ;
0 .56 .2 b .29 .25 b 1 .4 b
1 .45 b 1 .5 b 0 1 .35 b 1 .4 b
0.5 .45 b 0 1 .2 b .51 .25 b
1 .3 b

enter image description here


2

Excel VBA, 213 202 196 192 172 Bytes

Código

Função de janela imediata VBE anônima que não recebe entrada e gera um arco-íris, como uma imagem vetorial, para o objeto de folhas (1)

For i=0To 7:j=400-20*i:Set s=Sheet1.Shapes.AddShape(20,10*i,10*i,j,j):s.Fill.ForeColor.RGB=Array(255,32767,65535,65280,-31*4^8,8519755,&HE1008F,-1)(i):s.Line.Visible=0:Next

Versão da sub-rotina

Sub a
For i=0To 7
j=400-20*i
set s=Sheet1.Shapes.AddShape(20,10*i,10*i,j,j)
s.Fill.ForeColor.RGB=Array(255,32767,65535,65280,-31*4^8,8519755,&HE1008F,-1)(i)
s.Line.Visible=0
Next
End Sub

-11 bytes para remover .Adjustments(3)=3/80 chamadas e adicionar um oitavo arco branco

-6 bytes para usar -1sobre&HFFFFFF

-3 bytes para usar Sheet1 sobreSheets(1)

-6 bytes para converter a withinstrução emset instrução

-14 bytes para converter de Sub a função VBE anônima

Saída

Pics or it didn't happen


1

DIV Games Studio (184 bytes)

Não é o mais curto, mas é bastante simples. Usa a paleta padrão do DIV

PROGRAM r;
local
c[]=22,26,235,41,54,82,249,15,15;
BEGIN
set_mode(400200);
for(x=-80;x<80;x+=10)
y=399-x;
draw(5,c[abs(x)/10],15,0,x,x,y,y);
x+=70*(x<0);END
LOOP;FRAME;END
END

Rainbow in div games studio

Explicação

Defina o início do programa (chamado "r" para economizar espaço)

PROGRAM r;

pesquisa na paleta de configuração

local
c[]=22,26,235,41,54,82,249,15,15;

Código de programa BEGIN

BEGIN

Defina o modo de vídeo para 400.200

set_mode(400200);

loop x (variável predefinida) de -80 (que bg hack) a 80 (7 cores + centro branco)

for(x=-80;x<80;x+=10)

definir restrições elipse

y=399-x;

draw elipse - na primeira iteração, desenha um círculo maior que a tela em branco total (índice -8)

draw (tipo (5 = elipse preenchida), cor, opacidade, x0, y0, x1, y1)

draw(5,c[abs(x)/10],15,0,x,x,y,y);

uma vez feito o primeiro, bata x até zero para começar a desenhar a faixa vermelha

x+=70*(x<0);

fim para loop

END

loop infinito, tela de desenho.

LOOP;FRAME;END

fim (corresponde a COMEÇAR no início do programa)

END

1

Perl, 175 + 1 = 176 bytes

perl -MSVG -E '$z=SVG->new(width=>4e2,height=>2e2);@x=qw/#fff #8f00ff indigo #00f #0f0 #ff0 #ff7f00 red/;$z->circle(cx=>200,cy=>200,r=>200-10*$a++,style=>{fill=>pop@x})for 1..8;say$z->xmlify'

enter image description here


1

PHP, 190 bytes

imagefill($a=imagecreatetruecolor($r=400,200),0,0,$w=0xffffff);foreach([255<<16,0xff7f00,$w-255,65280,255,4915330,9371903,$w]as$i)imagefilledellipse($a,200,200,$r,20+$r-=20,$i);imagepng($a);

Execute-o assim:

php -r 'imagefill($a=imagecreatetruecolor($r=400,200),0,0,$w=0xffffff);foreach([255<<16,0xff7f00,$w-255,65280,255,4915330,9371903,$w]as$i)imagefilledellipse($a,200,200,$r,20+$r-=20,$i);imagepng($a);' | display

Resulting image 1

Também trabalhando teoricamente em 179 bytes (mas a imagem parece um pouco bagunçada, GD ruim):

php -r '$r=410;imagesetthickness($a=imagecreatetruecolor(400,200),10);foreach([255<<16,0xff7f00,0xffff00,65280,255,4915330,9371903]as$i)imagearc($a,200,200,$r-=20,$r,1,0,$i);imagepng($a);' | display

Resulting image 2

Também não é uma imagem perfeita, mas muito melhor que a anterior (e @ 166 bytes):

php -d error_reporting=30709 -r '$a=imagecreatetruecolor($r=400,200);foreach([255<<16,0xff7f00,0xffff00,65280,255,4915330,9371903]as$i)for(;++$$i<21;)imageellipse($a,200,200,$r,$r--,$i);imagepng($a);' | display

Resulting image 3

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.