Dibuja el arcoiris


25

El desafío es simple: dibuja un arco iris en la menor cantidad de bytes posible

Las especificaciones para el arco iris son las siguientes:

  • La figura debe tener exactamente 400 píxeles de ancho y 200 píxeles de alto (opcionalmente 401x201 si desea un solo píxel central)
  • El anillo rojo debe tocar todos los bordes de la figura (radio exterior = 200 píxeles)
  • Todos los anillos deben tener el mismo ancho (10 píxeles)
    • El anillo violeta tendrá un radio interior de 130 píxeles.
  • El arco debe ser la mitad superior de un círculo perfecto.
  • El fondo debe ser blanco (también se acepta transparente)
  • La figura no tendrá bordes (se hace una excepción si el borde no se puede suprimir)
  • ¡Las funciones de creación de arco iris incorporadas no están permitidas!

Los siguientes colores se utilizarán en el arco iris:

arco iris

Este es el código de golf, por lo que gana el código más corto en bytes.

Ejemplo:

Arco iris

Relacionado, pero diferente!


26
No se permiten funciones de creación de arcoíris incorporadas, ya que estoy seguro de que Mathematica tiene una
Luis Mendo

¿Cuán imperfecto puede ser el arcoíris? ¿De no ser alias a rasgarse? Considere las imágenes en esta respuesta
aross

@aross: debería verse como el arcoíris de muestra (algunos píxeles pueden variar debido a cálculos inexactos). Los dos últimos arcoiris son demasiado "desordenados", mientras que el primero se ve bien. No tengo una regla perfecta, así que usa tu mejor juicio :-)
Stewie Griffin

@StewieGriffin La razón por la que pregunto es porque aparentemente los gráficos PHP son bastante defectuosos, mientras que la solución es correcta en teoría . Bueno, el segundo es, el tercero sería con anti-aliasing (que tampoco funciona bien)
Aross

¿No están permitidos los gráficos vectoriales? editar: no importa, veo que ya hay una respuesta TikZ, así que deduzco que sí.
Julian Wolf

Respuestas:


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

Esto funciona en la versión actual (14.0.0) del lenguaje / compilador.

EDITAR (6 de julio de 2017) : ¡puede probarlo en MATL Online! .

Para verificar que los colores sean correctos, elimine los últimos cinco caracteres (debe esperar unos segundos y desplazarse hacia abajo hasta el final de la salida).

ingrese la descripción de la imagen aquí

Explicación

El código tiene tres pasos principales:

Paso 1 : generar una matriz 201x401 con números de 1a 8. Los píxeles con valor 1son el fondo (blanco), los píxeles con valores 2, ..., 8representan cada banda del arco iris.

Coordenadas horizontales van desde -200a 200izquierda a derecha, y las coordenadas verticales se extienden de 0a 200abajo a arriba. Entonces el origen (0,0) es el centro inferior, la esquina superior izquierda es (-200,200), etc.

Las diferentes bandas del arco iris se generan calculando la distancia desde cada píxel hasta el origen y cuantificando en pasos de 10 píxeles.

Paso 2 : generar una matriz de 8x3 que defina el mapa de colores. Cada fila es uno de los colores necesarios (blanco y los siete colores del arco iris). Cada valor de la matriz 201x401 anterior se interpretará como un índice de una fila de este mapa de colores.

Generamos la matriz de mapa de colores usando valores entre 0 y 1 para cada componente de color, y luego multiplicando por 255 y redondeando hacia abajo. De esta manera, la mayoría de los valores son inicialmente 0 y 1, que luego se convertirán en 0 y 255. Los valores intermedios se codifican como valores entre 0 y 1 con 2 o 3 decimales, elegidos de modo que cuando se multiplican y redondean, se obtiene el valor deseado exacto.

Paso 3 : muestra la imagen con ese mapa de colores.

               % 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 codeles, varios miles de píxeles

Alguien tenía que hacerlo:

Un arcoiris impresionante

Si guarda esta imagen, puede probarla en línea .

El programa real de Piet es solo el top ~ 125 píxeles, que creé usando un programa Python que escribí.

Editar esto después realmente lastimó mi visión, ¡estaré tropezando por días!

Esto genera la imagen en un formato SVG, porque SVG realmente es (en mi opinión) la forma más sencilla de hacer esto. Desvergonzadamente robé el código SVG de Doorknob. Salidas:

salida correcta

bueno, esto 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>

¡Buena suerte superando esta respuesta, no usuarios de Esolang!


2
¿Es público este script de Python? Estoy pidiendo un amigo, que es muy vago ...
NaCl

Erm, lleva literalmente ~ 2 minutos implementar xD. Puedes encontrar una versión anterior aquí y ajustarla si es necesario: mediafire.com/download/0isocsb81n7r2cv/piet.py (nota: hice esto cuando tenía 10 años, el código es vergonzoso por decir lo menos): necesita PyPNG instalado.
theonlygusti

15

Pyth, 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" />

Salidas en 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

¡Gracias a @MamaFunRoll por 16 bytes y a @PatrickRoberts por 6 más!


2
Probablemente podría ahorrar muchos bytes empaquetando las cadenas.
un spaghetto

@AquaTart Todo lo que hace es agregar bytes. O_o
puerta

3
No creo que necesite ninguna de las citas, barras diagonales o la última </svg>etiqueta final .
Mama Fun Roll

44
Dos sugerencias: red #ff7f00 #ff0 #0f0 #00f #8f00ff #fffpara la lista de colores y tomar las comillas simples descuento en todos los valores de los parámetros que no tienen espacios en ellos ( cx, cy, ry fill), pero asegúrese de dejar un espacio entre el valor de llenado y el /lo que el color no quede mal interpretado . También quite el </svg>como se sugirió anteriormente.
Patrick Roberts el

1
Lo siento, quise decir red #ff7f00 #ff0 #0f0 #00f indigo #8f00ff #fff. Además, si reemplaza los espacios con comas, viewBoxtambién puede eliminar las comillas simples para ese parámetro.
Patrick Roberts el

14

Minecraft 1.10 (casi), 2677 caracteres de un comando, 868 blytes

Bueno, seguro que elegí un lenguaje detallado.

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

Cree un nuevo mundo Superflat, pegue ese desorden en un bloque de comando Impulse, establezca una distancia de renderización bastante alta y ejecútelo. Rompa el soporte de la armadura cuando su computadora deje de retrasarse.

El resultado es de 400 bloques de ancho y 200 bloques de alto, según lo solicitado.

Solía generador de un comando de MrGarretto para empacar todo juntos, y luego modificado el resultado de que un poco para guardar un par más bytes. Aquí está la entrada:

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 ~

Eso es un total de 15 1.9+ bloques de comandos y 838 bytes, por lo que 15 * 2 + 838 = 868 blytes .

Aquí está la parte (casi), le falta una esquina y un borde. Lógicamente no debería: ¿error de Minecraft? Sería exactamente 400x200 bloques si no fuera por eso. No hay mucho que pueda hacer.

Rainboom


44
¡Yay, un generador de arcoíris a base de cerdo! +1
TuxCrafting

Si son 2677 caracteres, ¿cómo pueden ser solo 868 "blytes"? Por cómo entiendo esa página, los blytes reales deberían ser 2677 + 4
theonlygusti

Es 868 si lo construyes en el mundo, 2677 si usas fallingsand para crearlo (lo que tiene mucha sobrecarga)
cuat el

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

ingrese la descripción de la imagen aquí

Gracias @CatsAreFluffy por eliminar 8 bytes y @njpipeorgan por otros 18 :)


3
Uso #vs #[[1]], #2vs #[[2]], y @@@vs /@.
CalculatorFeline

1
Además, Threadfunciona en lugar de Transpose.
LegionMammal978

1
Graphics@MapIndexed[{#,Disk[{0,0},4-#/5&@@#2,{Pi,0}]}&,RGBColor/@TextWords@"#f00 #ff7f00 #ff0 #0f0 #00f #4b0082 #8f00ff #fff"]guarda otros 18 bytes, pero la idea es la misma.
njpipeorgan

1
Por curiosidad ... ¿ hay un "arco iris incorporado"?
mbomb007

@ mbomb007 no es que yo sepa!
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>

Sí, esto es torpe. Tiene que haber mejoras que se pueden hacer.

Salidas como SVG, como mi respuesta Pyth .

¡Gracias a @MyHamDJ por reducir 3 bytes!


Puede eliminar 2 bytes (o pulsaciones de teclas) si reemplaza su último comando ex conkv3G:norm A'/><cr>
DJMcMayhem

También podría quitar 3 más si ingresa la <circle cx...cadena en la línea 2 la primera vez, en lugar de escribir todos los colores y luego ingresarlos después.
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)"/>


usar height=200y en cx=200 cy=200 r=${--r}0lugar de viewBox='0 0 40 20'. Eso debería ahorrar 7 bytes.
Patrick Roberts el

Espero que esté bien que tomé prestada tu idea con el .replace método ...
Patrick Roberts

@PatrickRoberts, por supuesto, está bien, tomé prestados algunos de los tuyos
edc65

55
Seguramente no esperaba ver r-=1en el código de golf ...
Neil

@Neil bah! era - = 10 en alguna iteración antes del lanzamiento final
edc65

7

Rubí con zapatos, 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}}

Salida de muestra:

arcoiris de Ruby con zapatos


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 a @ edc65 por la idea de convertir

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

a

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

Puede parecer más largo, pero la cantidad de bytes guardados al comprimir la matriz en una cadena bien vale la conversión. (Ahorra 13 bytes en este caso)

Manifestación

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

Si estamos dibujando arcoíris, entonces parece un buen lugar para usar el sucesor de 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

La línea 2 configura la paleta para los valores RGB específicos necesarios (y probablemente no está ayudando al recuento de bytes) ya que los colores estándar del espectro no coincidían.

El DRAWcomando puede tomar un parámetro adicional que lo hace girar a través de varios grados radianes entre x1, y1 y x2, y2. Finalmente encuentra una brecha en los semicírculos recién dibujados y la inundación se llena con el color actual.

ingrese la descripción de la imagen aquí


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}

Por desgracia, este tipo de preguntas siempre favorece algunos lenguajes esotéricos ... Dicho esto, Tcl / Tk realmente hace que las operaciones gráficas sean: fáciles, cortas y legibles .

Dicho esto, he sacrificado la legibilidad para reducir las opciones a la menor cantidad de caracteres posible. No me imagino que agrupar la lista de colores ayudará mucho en comparación con el código para descomprimirlo ...

A modo de comparación, aquí está el código no truncado (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
}

los after orden fue lamentablemente necesaria ya que ningún movimiento en sentido vertical (de origen de coordenadas del lienzo) se puede hacer frente a la ventana se asigna a la pantalla.

Además, el código descifrado en realidad dibuja un completo arco iris (usando un círculo en lugar de un arco) y solo se basa en el recorte de la ventana ...

De todos modos, espero que lo disfruten. : O)


Puede usar en lmaplugar de foreachacortar.
sergiol

Y puede poner la primera línea dentro de la segunda como:pack [canvas .c -bg #FFF -bo 0 -highlightt 0] -e 1 -f both
sergiol

Existe una incoherencia entre las dos versiones de su código. Golfed hace create oval; no golfista lo hace create arc. ¿Puede usted explicar por favor?
sergiol

Gracias por el comentario. La versión sin golf es de legibilidad, no de exactitud en la implementación. Y, por desgracia, no voy a volver y arreglar todo mi foreach -> lmap; eso puede dejarse para el lector ...: 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}

Pruébalo aquí .

Explicaciones

\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 Gracias por el enlace, agregado.
Fatalize

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

Solo usa el Graphics2D clase para dibujar 7 arcos, con una matriz para almacenar los colores. Estoy seguro de que se puede mejorar aún más.

Código sin golf:

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
Tu 0x0000ffpodría ser justo 0xffo incluso justo 255, lo mismo que 0x00ff00ser 0xff00. 0xff0000podría ser 255<<16guardar otro byte. Su ciclo podría ser guardar algunos bytes más. Puede guardar un byte más agregando un ,qa su intdeclaración. Tendrías que hacerlo en int c[]=lugar de int[] ceso qes un inty no un int[]. Hacer eso te permite agregar un q=390-v*20;a tu bucle. y reemplazar el 390-v*20con una q. Es mucho trabajo para un byte, pero un byte es un byte, ¿verdad?
corsiKa

2
Puede guardar dos bytes más simplemente lanzando Exception en lugar de IOException.
corsiKa

También me pregunto si puede usar drawOvaly renderizar la mitad superior de la imagen ... aunque podría ser un poco más caro ...
corsiKa

Sé que ha pasado aproximadamente un año y medio, pero puedes jugar bastante al golf ... 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

Chicle , 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!..

Lamentablemente, esto es más corto que mi respuesta de Pyth . :(

Genera el mismo archivo 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: ahorró 2 bytes al evitar un error en Chrome. Ahorró otros 2 bytes gracias a @TrangOul.

Nota: el fragmento utiliza <div>debido a las limitaciones de los fragmentos de pila.


Parece que el fondo en el exterior del arco iris es rojo (al menos en mi teléfono).
Stewie Griffin

@StewieGriffin funciona bien para mí en Firefox para Android. (No pude averiguar cómo habilitar Stack Snippets en el navegador predeterminado de mi teléfono).
Neil

Ok, un poco extraño :-) Estoy usando Chrome 49.0.2623.91 en galaxy s6 edge por cierto.
Stewie Griffin

@StewieGriffin Parece que también está roto en Chrome para Windows.
Neil

@StewieGriffin OK Creo que tengo una solución alternativa, ¡y también ahorra dos bytes!
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());


Gracias @StewieGriffin. He realizado el cambio para 10. ¡He estado tratando de hacer la cuenta regresiva pero aún estoy lejos de la respuesta de Pyth de las perillas de las puertas!
Wolfhammer

Puede mover todo entre los for's { ... }dentro de la última sección for, separados por ,. por ej for(i=0;i<8;x.beginPath(),x.arg(...etc...)). Probablemente también pueda usar slice/ spliceof substr si no me equivoco. También podría ser más corto para hacer el <canvas> usando .innerHTML. O incluso una respuesta HTML + JS y dar el <canvas> y la identificación de cy luego debería agregarse automáticamente como una variable global JS
Downgoat

Aquí @Downgoat substrtiene la ventaja de que su segundo parámetro es una longitud, no un desplazamiento. En cuanto al golf, document.bodyparecería proporcionar un ahorro considerable.
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;}

La salida es PPM (el tipo binario).

Editar: guardado un par de bytes gracias a @tucuxi.

Edición 2: código reorganizado para ahorrar aún más.


1
puedes afeitar un byte con i;s;t;main()-> s;t;main(i), y otro colocando parte de tu cuerpo de bucle for dentro de for: ;)code1,code2;-> ;code2)code1;(¡guardaste una coma!).
tucuxi

4

Google Blockly , 48 bloques, 75 bytes

Haga clic en el siguiente gif para navegar a la solución, donde puede ver más de cerca cómo funciona.
En cuanto a una explicación, creo que una imagen vale más que mil palabras, y por lo tanto un gif vale más que mil imágenes.

enlace a gran gif legible

Nota: No estoy seguro de cómo contar en Blockly, así que conté cada bloque como 1 byte y cada variable de la manera regular, de modo que 0== 1 byte, 530== 3 bytes, Arial== 5 bytes y bold== 4 bytes.
Conté el carácter especial que usé para cortar el arco iris como 2 bytes. Informe cualquier error o sugerencia del recuento de bytes en los comentarios.


4

Posdata (87 bytes)

Volcado hexadecimal:

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

Salida:

ingrese la descripción de la imagen aquí


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}

Marcado no válido superdupente (puede o no parecer correcto en su navegador). Solo quería ver si era posible.


Puede cortar dos bytes usando # FF0 en lugar de amarillo. Es posible que también pueda usar el atributo bgcolor en lugar de los atributos de estilo.
curiousdannii

@curiousdannii Tienes razón sobre los colores ( whitetambién podría acortarse), por supuesto, no sé por qué no vi eso. Sin embargo, intenté bgcolorantes de publicar, pero desafortunadamente ya no es compatible (de todos modos, aquí en Chrome)
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);?>

Salidas:

¡Prueba el arcoiris!


1
Buen esfuerzo Pero tenga en cuenta que cerrar la etiqueta PHP al final del archivo se considera un mal hábito incluso cuando no se juega al golf. Sería más corto como script CLI, de esa manera puede ahorrar esa header()llamada e incluso la etiqueta PHP de apertura. En Linux, lo más simple es ejecutarlo 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);' | displaydesde el símbolo del sistema y contarlo como 227 caracteres. (Usando PHP 5.6.11.)
manatwork

3

Bash + ImageMagick, 159125 caracteres

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

Salida de muestra:

arcoiris de Bash + ImageMagick


3

Procesamiento, 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++]);

arco iris

Ahorré 10 bytes gracias a Kritixi Lithos
... y otros 6 bytes gracias a dzaima


2
Puede afeitar de un byte más cambiando for(int i=0;i<8;i++)en for(int i=0;i++<8;)o similares
quat

No creo que puedas usar variables mientras llamassize()
Kritixi Lithos

@KritixiLithos ¿Qué quieres decir?
Flambino

Cuando llamo al tamaño con variables como parámetros, me da un error (antes de ejecutar) de que no puedo usar variables para establecer las dimensiones en la pantalla
Kritixi Lithos

background(-1)es un byte más corto que background(255), y puede cambiar la 255matriz cen -1para guardar otro byte
Kritixi Lithos

2

R, 184 170 bytes

Hacer una imagen con dimensiones fijas de píxeles resulta ser sorprendentemente complicado con R, cuyas funciones de trazado están destinadas principalmente a los estadísticos. En particular, R deja espacio adicional para etiquetas y ejes de coordenadas a menos que establezca explícitamente los márgenes como ancho cero llamando par.

Por otro lado, algunos de los colores requeridos (específicamente rojo, amarillo y azul) se encuentran en la paleta predeterminada y pueden referenciarse simplemente mediante índices enteros.

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

Cuarto Salón Haiku (184 bytes)

No puedo satisfacer las restricciones de dimensión con este formato, pero pensé que valía la pena compartirlo de todos modos.

: ^ 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

ingrese la descripción de la imagen aquí


2

Excel VBA, 213 202 196 192 172 Bytes

Código

Función de ventana inmediata anónima VBE que no toma entrada y genera un arco iris, como imagen vectorial, al objeto de hojas (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

Versión de subrutina

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 eliminar la .Adjustments(3)=3/80llamada y agregar un octavo arco blanco

-6 bytes para usar -1más de&HFFFFFF

-3 bytes para usar Sheet1más deSheets(1)

-6 bytes para convertir una withdeclaración en una setdeclaración

-14 bytes para convertir de Suba anónimo función VBE

Salida

Fotos o no sucedió


1

DIV Games Studio (184 bytes)

No es el más corto pero sí bastante simple. Utiliza la paleta predeterminada 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

Explicación

Definir el inicio del programa (llamado "r" para ahorrar espacio)

PROGRAM r;

configuración de búsqueda de paleta

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

COMIENCE el código del programa

BEGIN

Establecer el modo de video a 400,200

set_mode(400200);

loop x (variable predefinida) de -80 (que bg hack) a 80 (7 colores + centro blanco)

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

definir restricciones de elipse

y=399-x;

dibujar elipse: en la primera iteración esto dibuja un círculo más grande que la pantalla en blanco (índice -8)

dibujar (tipo (5 = elipse relleno), color, opacidad, x0, y0, x1, y1)

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

una vez hecho esto, sube x hasta cero para comenzar a dibujar la banda roja

x+=70*(x<0);

final para loop

END

bucle infinito, pantalla de dibujo.

LOOP;FRAME;END

final (coincide COMIENZA en la parte superior del 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'

ingrese la descripción de la imagen aquí


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

Ejecútelo así:

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

Imagen resultante 1

También funciona en teoría a 179 bytes (pero la imagen se ve un poco desordenada, mal GD):

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

Imagen resultante 2

Tampoco es una imagen perfecta, pero mucho mejor que la anterior (y @ 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

Imagen resultante 3

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.