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!

Stewie Griffin
fonte
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
Luis Mendo
fonte
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!

theonlygusti
fonte
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!

Maçaneta da porta
fonte
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

quat
fonte
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 :)

Martin
fonte
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!

Maçaneta da porta
fonte
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)"/>

edc65
fonte
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

homem a trabalhar
fonte
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)}`

Patrick Roberts
fonte
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>

Qwertiy
fonte
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

Brian
fonte
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)

Dúthomhas
fonte
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}
Fatalizar
fonte
@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"));
    }
FlyingPiMonster
fonte
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.

Maçaneta da porta
fonte
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.

Neil
fonte
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());

martelo de lobo
fonte
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.

Raposa
fonte
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

Bassdrop Cumberwubwubwub
fonte
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

goose121
fonte
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.

Flambino
fonte
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!

bobina
fonte
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

homem a trabalhar
fonte
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

Flambino
fonte
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])))
han
fonte
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

boomlinde
fonte
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

Taylor Scott
fonte
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
MikeDX
fonte
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

Steve
fonte
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

aross
fonte