Gambar pelangi

25

Tantangannya sederhana: Gambar pelangi sesedikit mungkin byte

Spesifikasi untuk pelangi adalah sebagai berikut:

  • Angka harus persis 400 piksel lebar dan 200 piksel tinggi (opsional 401x201 jika Anda ingin satu piksel tengah)
  • Cincin merah harus menyentuh semua batas gambar (jari-jari luar = 200 piksel)
  • Semua dering harus memiliki lebar yang sama (10 piksel)
    • Cincin ungu akan memiliki jari-jari dalam 130 piksel
  • Busur harus menjadi bagian atas dari lingkaran yang sempurna
  • Latar belakang harus putih (transparan juga diterima)
  • Angka tidak boleh memiliki batas, (pengecualian dibuat jika perbatasan tidak dapat ditekan)
  • Fungsi pelangi bawaan tidak diizinkan!

Warna-warna berikut harus digunakan dalam pelangi:

Pelangi

Ini kode golf, jadi kode terpendek dalam byte menang!

Contoh:

Pelangi

Terkait, tetapi berbeda!

Stewie Griffin
sumber
26
Fungsi membuat pelangi bawaan tidak diizinkan Karena saya yakin Mathematica memilikinya
Luis Mendo
Seberapa tidak sempurna pelangi itu? Dari tidak anti alias merobek? Perhatikan gambar-gambar dalam jawaban ini
aross
@ aross: seharusnya terlihat seperti sampel pelangi (beberapa piksel mungkin bervariasi karena perhitungan yang tidak akurat). Dua pelangi terakhir terlalu "berantakan", sedangkan yang pertama terlihat ok. Saya tidak memiliki aturan yang sempurna, jadi gunakan penilaian terbaik Anda :-)
Stewie Griffin
@StewieGriffin Alasan yang saya tanyakan adalah karena rupanya grafik PHP cukup buggy, sedangkan solusinya benar secara teori . Nah, yang kedua adalah, yang ketiga adalah dengan anti-aliasing (yang juga tidak berfungsi dengan baik)
aross
Apakah grafik vektor tidak diperbolehkan? sunting: tidak apa-apa — saya melihat bahwa sudah ada jawaban TikZ, jadi saya kumpulkan jawabannya.
Julian Wolf

Jawaban:

15

MATL , 107 95 92 87 84 83 byte

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

Ini berfungsi dalam rilis saat ini (14.0.0) dari bahasa / kompiler.

EDIT (6 Juli 2017) : Anda dapat mencobanya di MATL Online! .

Untuk memeriksa apakah warnanya benar, hapus lima karakter terakhir (Anda perlu menunggu beberapa detik dan gulir ke bawah ke akhir output).

masukkan deskripsi gambar di sini

Penjelasan

Kode ini memiliki tiga langkah utama:

Langkah 1 : Hasilkan matriks 201x401 dengan angka dari 1hingga 8. Pixel dengan nilai 1adalah latar belakang (putih), piksel dengan nilai 2, ..., 8mewakili setiap pita pelangi.

Koordinat horisontal berkisar dari -200ke 200kiri ke kanan, dan koordinat vertikal berkisar dari 0ke 200bawah ke atas. Jadi asal (0,0) adalah pusat bawah, sudut kiri atas (-200,200), dll.

Pita pelangi yang berbeda dihasilkan dengan menghitung jarak dari setiap piksel ke titik asal dan menghitungnya dalam langkah 10 piksel.

Langkah 2 : Hasilkan matriks 8x3 yang mendefinisikan colormap. Setiap baris adalah salah satu warna yang diperlukan (putih dan tujuh warna pelangi). Setiap nilai dari matriks 201x401 sebelumnya akan ditafsirkan sebagai indeks ke deretan colormap ini.

Kami menghasilkan matriks colormap menggunakan nilai antara 0 dan 1 untuk setiap komponen warna, dan kemudian mengalikannya dengan 255 dan membulatkan ke bawah. Dengan cara ini, sebagian besar nilai awalnya 0 dan 1, yang nantinya akan menjadi 0 dan 255. Nilai menengah dikodekan sebagai nilai antara 0 dan 1 dengan 2 atau 3 desimal, dipilih sehingga ketika dikalikan dan dibulatkan memberikan nilai yang diinginkan tepat.

Langkah 3 : Tampilkan gambar dengan colormap itu.

               % 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
sumber
28

Piet , 838 kode, beberapa ribu piksel

Seseorang harus melakukannya:

Pelangi yang luar biasa

Jika Anda menyimpan gambar ini, Anda dapat mencobanya secara online !

Program Piet sebenarnya hanya bagian atas ~ 125 piksel, yang saya buat menggunakan program Python yang saya tulis.

Mengedit ini setelah itu benar-benar melukai penglihatanku, aku akan tersandung berhari-hari!

Ini menampilkan gambar dalam format SVG, karena SVG benar-benar (menurut saya) adalah cara paling sederhana untuk melakukan ini. Tanpa malu-malu aku mencuri kode SVG Doorknob. Output:

hasil yang benar

baik, ini benar-benar:

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

Semoga berhasil mengalahkan jawaban ini, pengguna non-Esolang!

theonlygusti
sumber
2
Apakah skrip python ini publik? Saya meminta seorang teman, yang sangat malas ....
NaCl
Erm, butuh harfiah ~ 2 menit untuk mengimplementasikan xD Anda dapat menemukan versi lama di sini dan menyesuaikannya jika perlu: mediafire.com/download/0isocsb81n7r2cv/piet.py (catatan: Saya membuat ini ketika saya berusia 10 tahun, kodenya memalukan untuk mengatakan paling tidak) - perlu PyPNG diinstal.
theonlygusti
15

Pyth, 150 149 128 byte

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

Output dalam 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 />

Pelangi

Terima kasih kepada @MamaFunRoll untuk 16 byte dan @PatrickRoberts untuk 6 lebih!

Gagang pintu
sumber
2
Anda mungkin bisa menghemat banyak byte dengan mengemas string.
spaghetto
@ AquaTart Semua yang dilakukan adalah menambah byte. O_o
Gagang Pintu
3
Saya tidak berpikir Anda membutuhkan tanda kutip, tanda garis miring, atau </svg>tag tanda terakhir .
Mama Fun Roll
4
Dua saran: red #ff7f00 #ff0 #0f0 #00f #8f00ff #fffuntuk daftar warna dan mengambil tanda kutip tunggal dari semua nilai-nilai parameter yang tidak memiliki ruang di dalamnya ( cx, cy, rdan fill) tapi pastikan untuk meninggalkan ruang antara nilai mengisi dan /sehingga warna tidak mendapatkan disalahartikan . Hapus juga </svg>seperti yang disarankan di atas.
Patrick Roberts
1
Maaf, maksud saya red #ff7f00 #ff0 #0f0 #00f indigo #8f00ff #fff. Juga jika Anda mengganti spasi dengan koma di viewBoxAnda dapat menghapus tanda kutip tunggal untuk parameter itu juga.
Patrick Roberts
14

Minecraft 1.10 (hampir), 2677 karakter satu perintah, 868 blytes

Yah saya yakin memilih bahasa verbose.

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

Buat dunia Superflat baru, rekatkan itu ke dalam blok perintah Impuls, atur jarak render Anda cukup tinggi, dan jalankan. Hancurkan dudukan pelindung saat komputer Anda berhenti tertinggal.

Hasilnya adalah 400 blok dan tinggi 200 blok, seperti yang diminta.

Saya menggunakan satu generator perintah MrGarretto untuk mengemas semuanya, dan kemudian memodifikasi hasil itu sedikit untuk menghemat beberapa byte lagi. Inilah input untuk itu:

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 ~

Itu total 15 1,9+ blok perintah, dan 838 byte, jadi 15 * 2 + 838 = 868 blytes .

Inilah bagian (hampir), itu kehilangan sudut dan tepi. Secara logis seharusnya tidak - Minecraft bug? Tepatnya 400x200 blok jika bukan karena itu. Tidak banyak yang bisa saya lakukan.

Rainboom

quat
sumber
4
Yay, generator pelangi berbasis babi! +1
TuxCrafting
Jika 2677 karakter, bagaimana mungkin hanya 868 "blytes"? Dari bagaimana saya memahami halaman itu, blytes yang sebenarnya seharusnya 2677 + 4
theonlygusti
Ini 868 jika Anda membangunnya di dunia, 2677 jika Anda menggunakan fallings dan untuk membuatnya (yang memiliki banyak overhead)
quat
12

Mathematica 152 144 126 byte

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

masukkan deskripsi gambar di sini

Terima kasih @CatsAreFluffy untuk mencukur 8 byte & @njpipeorgan untuk 18 lebih lanjut :)

martin
sumber
3
Gunakan #vs #[[1]], #2vs #[[2]], dan @@@vs /@.
CalculatorFeline
1
Juga, Threadberfungsi sebagai ganti Transpose.
LegionMammal978
1
Graphics@MapIndexed[{#,Disk[{0,0},4-#/5&@@#2,{Pi,0}]}&,RGBColor/@TextWords@"#f00 #ff7f00 #ff0 #0f0 #00f #4b0082 #8f00ff #fff"]menyimpan 18 byte lagi, tetapi idenya sama.
njpipeorgan
1
Hanya ingin tahu ... apakah ada "pelangi builtin"?
mbomb007
@ mbomb007 tidak saya sadari!
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>

Ya, ini kikuk. Harus ada perbaikan yang bisa dilakukan.

Output sebagai SVG, seperti jawaban Pyth saya .

Terima kasih kepada @MyHamDJ karena telah mengurangi 3 byte!

Gagang pintu
sumber
Anda dapat mengurangi 2 byte (atau penekanan tombol) jika Anda mengganti perintah ex terakhir Anda dengankv3G:norm A'/><cr>
DJMcMayhem
Anda juga bisa melepas 3 lagi jika Anda memasukkan <circle cx...string pada baris 2 pertama kali, alih-alih mengetik semua warna kemudian memasukkannya setelah itu.
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
sumber
gunakan height=200dan cx=200 cy=200 r=${--r}0bukannya viewBox='0 0 40 20'. Itu akan menghemat 7 byte.
Patrick Roberts
Saya harap tidak apa-apa jika saya meminjam ide Anda dengan .replacemetode ini ...
Patrick Roberts
@ PatrickRoberts tentu saja tidak apa-apa, saya meminjam beberapa milik Anda
edc65
5
Saya pasti tidak berharap melihat r-=1dalam kode golf ...
Neil
@Neil bah! itu - = 10 dalam beberapa iterasi sebelum rilis final
edc65
7

Ruby with Shoes, 155 byte

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

Output sampel:

pelangi oleh Ruby dengan Shoes

manatwork
sumber
6

JavaScript (ES6), 171 158 byte

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

Kredit ke @ edc65 untuk ide untuk dikonversi

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

untuk

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

Ini mungkin terlihat lebih lama tetapi jumlah byte yang disimpan dalam mengompresi array ke sebuah string layak konversi. (Ini menghemat 13 byte dalam kasus ini)

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
sumber
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
sumber
5

SpecBAS - 318 254 byte

Jika kita menggambar pelangi, maka sepertinya tempat yang bagus untuk menggunakan penerus 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

Baris 2 mengatur palet untuk nilai RGB spesifik yang diperlukan (dan mungkin tidak membantu jumlah byte) karena warna Spectrum standar tidak cocok.

The DRAWperintah dapat mengambil parameter tambahan yang membuatnya berubah melalui sejumlah derajat radian antara x1, y1 dan x2, y2. Akhirnya ia menemukan celah di setengah lingkaran yang baru saja digambar dan banjir mengisi dengan warna saat ini.

masukkan deskripsi gambar di sini

Brian
sumber
5

Tcl / Tk , 263 byte

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}

Sayangnya, pertanyaan semacam ini selalu mendukung beberapa bahasa esoterik ... Yang mengatakan, Tcl / Tk benar-benar membuat operasi grafis semuanya: mudah, pendek, dan mudah dibaca .

Yang mengatakan, saya telah mengorbankan keterbacaan untuk mengerahkan opsi ke karakter sesedikit mungkin. Saya tidak membayangkan memecahkan daftar warna akan banyak membantu dibandingkan dengan kode untuk membukanya ...

Sebagai perbandingan, berikut ini kode yang belum dibuka (380 byte):

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
}

Itu after perintah sayangnya diperlukan karena tidak ada bergulir (dari kanvas koordinat asal) dapat dilakukan sebelum jendela dipetakan ke layar.

Juga, kode berderak benar-benar menarik penuh pelangi (menggunakan lingkaran, bukan busur) dan hanya bergantung pada kliping jendela ...

Bagaimanapun, saya harap kalian semua menikmati. :HAI)

Dúthomhas
sumber
Anda dapat menggunakan lmapsebagai ganti foreachmempersingkat.
sergiol
Dan Anda dapat meletakkan baris pertama di dalam baris kedua seperti:pack [canvas .c -bg #FFF -bo 0 -highlightt 0] -e 1 -f both
sergiol
Ada perbedaan antara dua versi kode Anda. Golf tidak create oval; ungolfed tidak create arc. Bisakah Anda jelaskan?
sergiol
Terima kasih atas komentarnya. Versi ungolfed adalah untuk keterbacaan, bukan ketepatan dalam implementasi. Dan, sayangnya, saya tidak akan kembali dan memperbaiki semua foreach saya -> lmap; yang dapat dibiarkan bagi pembaca ...: O)
Dúthomhas
5

LaTeX, 290 byte

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

Coba di sini .

Penjelasan

\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}
Fatalisasi
sumber
@DonMuesli Terima kasih atas tautannya, ditambahkan.
Fatalkan
4

Java, 354 byte

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

Cukup gunakan Graphics2Dkelas untuk menggambar 7 busur, dengan array untuk menyimpan warna. Saya yakin itu bisa diperbaiki lebih lanjut.

Kode tidak dikunci:

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
sumber
2
Anda 0x0000ffbisa saja 0xffatau bahkan adil 255, sama dengan 0x00ff00menjadi 0xff00. 0xff0000bisa 255<<16untuk menyimpan byte lain. Simpul Anda bisa menyimpan beberapa byte lagi. Anda dapat menyimpan satu byte lagi dengan menambahkan a ,qke intdeklarasi Anda . Anda harus membuatnya int c[]=bukannya int[] cjadi qadalah intdan bukan int[]. Melakukan itu memungkinkan Anda menambahkan a q=390-v*20;ke loop Anda. dan ganti 390-v*20dengan q. Ini banyak pekerjaan untuk satu byte, tetapi satu byte adalah byte, kan ?!
corsiKa
2
Anda dapat menyimpan dua byte lagi hanya dengan melemparkan Exception daripada IOException.
corsiKa
Saya juga bertanya-tanya apakah Anda dapat menggunakan drawOvaldan hanya membuat bagian atas gambar ... mungkin sedikit lebih mahal ...
corsiKa
Saya tahu ini sudah sekitar 1,5 tahun, tetapi Anda dapat bermain golf dengan cukup banyak .. 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

Bubblegum , 139 119 byte

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

Sayangnya, ini lebih pendek dari jawaban Pyth saya . :(

Menghasilkan file SVG yang sama.

Gagang pintu
sumber
4

CSS, 244 242 240 byte

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

Sunting: Disimpan 2 byte dengan mengatasi bug di Chrome. Menyimpan 2 byte lebih lanjut berkat @TrangOul.

Catatan: snippet menggunakan <div>karena keterbatasan dari Stack Snippets.

Neil
sumber
Sepertinya latar di luar pelangi berwarna merah (setidaknya di ponsel saya).
Stewie Griffin
@StewieGriffin Bekerja dengan baik untuk saya di Firefox untuk Android. (Saya tidak tahu cara mengaktifkan Stack Snippets di browser default ponsel saya.)
Neil
Ok, agak aneh :-) Saya menggunakan chrome 49.0.2623.91 pada galaxy s6 edge btw.
Stewie Griffin
@StewieGriffin Sepertinya rusak di Chrome untuk Windows juga.
Neil
@StewieGriffin OK Saya pikir saya punya solusi, dan menghemat dua byte juga!
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());

wolfhammer
sumber
Terima kasih @StewieGriffin Saya telah membuat perubahan untuk 10. Sudah mencoba untuk mendapatkan hitungan mundur tapi masih jauh dari jawaban gagang pintu gagang pintu!
wolfhammer
Anda dapat memindahkan semuanya antara untuk { ... }ke dalam bagian terakhir untuk, dipisahkan oleh ,. mis for(i=0;i<8;x.beginPath(),x.arg(...etc...)). Anda mungkin juga dapat menggunakan slice/ splicedari substr jika saya tidak salah. Mungkin juga lebih pendek untuk menggunakan <canvas> .innerHTML. Atau bahkan HTML + JS jawaban dan berikan <canvas> dan id cdan kemudian secara otomatis akan ditambahkan sebagai variabel global JS
Downgoat
@Downgoat substrmemiliki kelebihan di sini karena parameter kedua adalah panjang, bukan offset. Sedangkan untuk bermain golf, document.bodysepertinya akan memberikan penghematan yang cukup besar.
Neil
4

C, 220 217 213 byte

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

Outputnya adalah PPM (jenis biner).

Sunting: Disimpan beberapa byte berkat @tucuxi.

Sunting 2: Menyusun ulang kode untuk menyimpan lebih banyak lagi.

Rubah
sumber
1
Anda dapat mencukur byte dengan i;s;t;main()-> s;t;main(i), dan yang lainnya dengan menempatkan bagian dari for loop body Anda di dalam for: ;)code1,code2;-> ;code2)code1;(menyimpan koma!).
tucuxi
4

Google Blockly , 48 blok, 75 byte

Klik gif di bawah ini untuk menavigasi ke solusi, di mana Anda bisa melihat lebih dekat cara kerjanya.
Adapun penjelasan, saya pikir gambar bernilai seribu kata, dan dengan demikian gif bernilai seribu gambar.

tautan ke gif yang bisa dibaca besar

Catatan: Saya tidak yakin bagaimana cara menghitung di Blockly, jadi saya menghitung setiap blok sebagai 1 byte, dan setiap variabel dengan cara biasa, sehingga 0== 1 byte, 530== 3 byte, Arial== 5 byte dan bold== 4 byte.
Saya menghitung karakter khusus yang saya gunakan untuk memotong pelangi sebagai 2 byte. Silakan laporkan kesalahan atau saran dari jumlah byte dalam komentar

Bassdrop Cumberwubwubwub
sumber
4

Postscript (87 byte)

Hex dump:

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

Keluaran:

masukkan deskripsi gambar di sini

angsa121
sumber
3

HTML + CSS, 310 307 byte

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

Super-duper markup tidak valid (mungkin atau mungkin tidak terlihat benar di browser Anda). Hanya ingin melihat apakah itu mungkin.

Flambino
sumber
Anda dapat memotong dua byte dengan menggunakan # FF0 alih-alih kuning. Anda mungkin dapat menggunakan atribut bgcolor alih-alih atribut style juga.
curiousdannii
@curiousdannii Anda benar tentang warna ( whitejuga bisa disingkat) tentu saja - tidak tahu mengapa saya tidak melihat itu. Saya sudah mencoba bgcolorsebelum memposting, tapi sayangnya itu tidak lagi didukung (di sini di Chrome pula)
Flambino
3

PHP, 285 byte

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

Output:

Cicipi pelangi!

bobbel
sumber
1
Usaha yang bagus. Tetapi harap dicatat bahwa penutupan tag PHP di akhir file dianggap kebiasaan buruk bahkan ketika tidak bermain golf. Ini akan lebih pendek sebagai skrip CLI, dengan begitu Anda dapat menyayangkan header()panggilan itu dan bahkan tag PHP pembuka. Di Linux yang paling sederhana adalah dijalankan 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);' | displaydari command prompt dan hitung sebagai 227 karakter. (Menggunakan PHP 5.6.11.)
manatwork
3

Bash + ImageMagick, 159 125 karakter

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

Output sampel:

pelangi oleh Bash + ImageMagick

manatwork
sumber
3

Memproses, 196 186 181 179 169 163 byte

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

Pelangi

Disimpan 10 byte berkat Kritixi Lithos
... dan 6 byte lainnya berkat dzaima

Flambino
sumber
2
Dapat mencukur satu byte lagi dengan mengubahnya for(int i=0;i<8;i++)menjadi for(int i=0;i++<8;)atau serupa
quat
Saya tidak berpikir Anda dapat menggunakan variabel saat memanggilsize()
Kritixi Lithos
@KritixiLithos Apa maksudmu?
Flambino
Ketika saya memanggil ukuran dengan variabel sebagai parameter, itu memberi saya kesalahan (sebelum menjalankan) bahwa saya tidak dapat menggunakan variabel untuk mengatur dimensi pada layar
Kritixi Lithos
background(-1)adalah salah satu byte lebih pendek dari background(255), dan Anda dapat mengubah 255dalam array cuntuk -1menyimpan byte lain
Kritixi Lithos
2

R, 184 170 byte

Membuat gambar dengan dimensi piksel tetap ternyata sangat rumit dengan R, yang fungsi plotnya sebagian besar ditujukan untuk ahli statistik. Secara khusus R meninggalkan ruang ekstra untuk label dan mengkoordinasikan sumbu kecuali jika Anda secara eksplisit menetapkan margin sebagai lebar nol dengan menelepon par.

Di sisi lain beberapa warna yang diperlukan (khususnya merah, kuning dan biru) ditemukan dalam palet default, dan dapat dirujuk hanya dengan indeks integer.

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
sumber
2

Forth Salon Haiku (184 bytes)

Saya tidak dapat memenuhi batasan dimensi dengan format ini, tetapi saya pikir itu layak untuk dibagikan.

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

masukkan deskripsi gambar di sini

boomlinde
sumber
2

Excel VBA, 213 202 196 192 172 Bytes

Kode

Fungsi jendela langsung VBE anonim yang tidak mengambil input dan mengeluarkan pelangi, sebagai gambar vektor, ke objek lembar (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 Subrutin

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 byte untuk menghapus .Adjustments(3)=3/80panggilan dan menambahkan busur putih ke-8

-6 byte untuk menggunakan -1lebih dari&HFFFFFF

-3 byte untuk menggunakan Sheet1lebih dariSheets(1)

-6 byte untuk mengubah withpernyataan ke setpernyataan

-14 byte untuk mengkonversi dari Subke fungsi VBE anonim

Keluaran

Foto atau tidak terjadi

Taylor Scott
sumber
1

DIV Games Studio (184 bytes)

Bukan yang terpendek tapi cukup sederhana. Menggunakan palet default 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

Pelangi di studio game div

Penjelasan

Tentukan awal program (beri nama "r" untuk menghemat ruang)

PROGRAM r;

setup lookup palette

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

BEGIN kode program

BEGIN

Atur mode video ke 400.200

set_mode(400200);

loop x (variabel yang ditentukan sebelumnya) dari -80 (yang bg hack) ke 80 (7 warna + pusat putih)

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

mendefinisikan batasan elipse

y=399-x;

draw elipse - pada iterasi pertama ini menggambar lingkaran yang lebih besar dari layar dalam warna putih penuh (indeks -8)

draw (type (5 = elipse filled), warna, opacity, x0, y0, x1, y1)

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

setelah pertama kali selesai, tekan x hingga nol untuk mulai menggambar pita merah

x+=70*(x<0);

end untuk loop

END

loop tak terbatas, menggambar layar.

LOOP;FRAME;END

end (cocok BEGIN di atas program)

END
MikeDX
sumber
1

Perl, 175 + 1 = 176 byte

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'

masukkan deskripsi gambar di sini

steve
sumber
1

PHP, 190 byte

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

Jalankan seperti ini:

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

Juga bekerja dalam teori pada 179 byte (tetapi gambar terlihat agak berantakan, GD buruk):

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

Juga bukan gambar yang sempurna, tetapi jauh lebih baik daripada yang di atas (dan @ 166 byte):

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
sumber