Vẽ cầu vồng


25

Thách thức rất đơn giản: Vẽ cầu vồng bằng càng ít byte càng tốt

Thông số kỹ thuật cho cầu vồng như sau:

  • Con số phải chính xác rộng 400 pixel và cao 200 pixel (tùy chọn 401x201 nếu bạn muốn một pixel ở giữa)
  • Vòng màu đỏ sẽ chạm vào tất cả các viền của hình (bán kính ngoài = 200 pixel)
  • Tất cả các vòng sẽ có cùng chiều rộng (10 pixel)
    • Vòng màu tím có bán kính trong là 130 pixel
  • Cung phải là nửa trên của một vòng tròn hoàn hảo
  • Nền sẽ là màu trắng (trong suốt cũng được chấp nhận)
  • Hình sẽ không có viền, (ngoại lệ được tạo nếu đường viền không thể bị triệt tiêu)
  • Chức năng làm cầu vồng dựng sẵn không được phép!

Các màu sau sẽ được sử dụng trong cầu vồng:

cầu vồng

Đây là mã golf, vì vậy mã ngắn nhất tính bằng byte sẽ thắng!

Thí dụ:

cầu vồng

Liên quan, nhưng khác nhau!


26
Các chức năng tạo cầu vồng tích hợp không được phép Vì tôi chắc chắn Mathicala có một
Luis Mendo

Làm thế nào không hoàn hảo có thể cầu vồng? Từ không chống răng cưa đến rách? Hãy xem xét những hình ảnh trong câu trả lời này
từ

@aross: nó sẽ trông giống như cầu vồng mẫu (một số pixel có thể thay đổi do tính toán không chính xác). Hai cầu vồng cuối cùng quá "lộn xộn", trong khi cái đầu tiên trông ổn. Tôi không có một quy tắc hoàn hảo, vì vậy hãy sử dụng phán đoán tốt nhất của bạn :-)
Stewie Griffin

@StewieGriffin Lý do tôi hỏi là vì rõ ràng đồ họa PHP khá lỗi, trong khi giải pháp là đúng về mặt lý thuyết . Chà, cái thứ hai là, cái thứ ba sẽ chống khử răng cưa (cái này cũng không hoạt động tốt)
khoảng

Là đồ họa vector không được phép? chỉnh sửa: không bao giờ để tâm đến tôi Tôi thấy rằng đã có câu trả lời TikZ, vì vậy tôi tập hợp chúng lại.
Julian Wolf

Câu trả lời:


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

Điều này hoạt động trong bản phát hành hiện tại (14.0.0) của ngôn ngữ / trình biên dịch.

EDIT (ngày 6 tháng 7 năm 2017) : Bạn có thể dùng thử tại MATL Online! .

Để kiểm tra xem màu sắc có chính xác không, hãy xóa năm ký tự cuối cùng (bạn cần đợi trong vài giây và cuộn xuống cuối đầu ra).

nhập mô tả hình ảnh ở đây

Giải trình

Mã này có ba bước chính:

Bước 1 : Tạo ma trận 201x401 với các số từ 1đến 8. Điểm ảnh có giá trị 1là nền (màu trắng), pixel có giá trị 2, ..., 8đại diện cho từng dải của cầu vồng.

Tọa độ ngang dao động từ -200để 200trái sang phải, và tọa độ thẳng đứng dao động từ 0để 200dưới lên trên. Vì vậy, gốc (0,0) là trung tâm dưới cùng, góc trên bên trái là (-200,200), v.v.

Các dải khác nhau của cầu vồng được tạo ra bằng cách tính khoảng cách từ mỗi pixel đến gốc và định lượng theo các bước 10 pixel.

Bước 2 : Tạo ma trận 8x3 xác định bản đồ màu. Mỗi hàng là một trong những màu cần thiết (trắng và bảy màu của cầu vồng). Mỗi giá trị của ma trận 201x401 trước đó sẽ được hiểu là một chỉ mục cho một hàng của bản đồ màu này.

Chúng tôi tạo ma trận colormap bằng cách sử dụng các giá trị từ 0 đến 1 cho mỗi thành phần màu, sau đó nhân với 255 và làm tròn xuống. Bằng cách này, hầu hết các giá trị ban đầu là 0 và 1, sau này sẽ trở thành 0 và 255. Các giá trị trung gian được mã hóa thành các giá trị từ 0 đến 1 với 2 hoặc 3 số thập phân, được chọn sao cho khi nhân và làm tròn cho giá trị mong muốn chính xác.

Bước 3 : Hiển thị hình ảnh với bản đồ màu đó.

               % 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 codel, vài nghìn pixel

Ai đó đã phải làm điều đó:

Cầu vồng tuyệt vời

Nếu bạn lưu hình ảnh này, bạn có thể thử nó trực tuyến !

Chương trình Piet thực tế chỉ có đỉnh ~ 125 pixel mà tôi đã tạo bằng chương trình Python tôi đã viết.

Chỉnh sửa điều này sau đó thực sự làm tổn thương tầm nhìn của tôi, tôi sẽ bị vấp ngã trong nhiều ngày!

Điều này xuất ra hình ảnh ở định dạng SVG, bởi vì thực sự SVG là (theo tôi) là cách đơn giản nhất để làm điều này. Tôi xấu hổ lấy trộm mã SVG của Doorknob. Đầu ra:

đầu ra đúng

tốt, điều này thực sự:

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

Chúc may mắn đánh bại câu trả lời này, người dùng không phải là người Esolang!


2
Là kịch bản python công khai? Tôi đang hỏi một người bạn, người rất lười biếng ....
NaCl

Erm, phải mất khoảng 2 phút để thực hiện xD Bạn có thể tìm thấy một phiên bản cũ ở đây và điều chỉnh nó nếu cần: mediafire.com/doad/0isocsb81n7r2cv/piet.py (lưu ý: Tôi đã thực hiện điều này khi tôi 10 tuổi, mã bị lúng túng để nói rằng ít nhất) - nó cần cài đặt PyPNG.
theonlygusti 14/03/2016

15

Bình thường, 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" />

Đầu ra trong 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 />

cầu vồng

Cảm ơn @MamaFunRoll cho 16 byte và @PatrickRoberts để biết thêm 6!


2
Bạn có thể có thể tiết kiệm rất nhiều byte bằng cách đóng gói các chuỗi.
một spaghetto

@AquaTart Tất cả những gì làm là thêm byte. O_o
Doorknob

3
Tôi không nghĩ rằng bạn cần bất kỳ dấu ngoặc kép, dấu gạch chéo hoặc </svg>thẻ kết thúc cuối cùng .
Mama Fun Roll

4
Hai gợi ý: red #ff7f00 #ff0 #0f0 #00f #8f00ff #fffđể xem danh sách màu sắc và mất dấu nháy đơn tắt tất cả các giá trị tham số mà không có khoảng trống trong đó ( cx, cy, rfill) nhưng hãy chắc chắn để lại một khoảng trống giữa giá trị của điền và /vì vậy các màu sắc không được hiểu sai . Cũng loại bỏ </svg>như đề xuất ở trên.
Patrick Roberts

1
Xin lỗi, ý tôi là vậy red #ff7f00 #ff0 #0f0 #00f indigo #8f00ff #fff. Ngoài ra nếu bạn thay thế dấu cách bằng dấu phẩy, viewBoxbạn cũng có thể xóa các dấu ngoặc đơn cho tham số đó.
Patrick Roberts

14

Minecraft 1.10 (gần như), 2677 ký tự một lệnh, 868 blyte

Vâng, tôi chắc chắn đã chọn một ngôn ngữ dài dòng.

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

Tạo một thế giới Superflat mới, dán mớ hỗn độn đó vào khối lệnh Impulse, đặt khoảng cách kết xuất của bạn khá cao và chạy nó. Phá vỡ giá đỡ áo giáp khi máy tính của bạn ngừng hoạt động.

Kết quả là 400 khối trên và 200 khối, theo yêu cầu.

Tôi đã sử dụng một trình tạo lệnh của MrGarretto để đóng gói mọi thứ lại với nhau và sau đó sửa đổi kết quả của điều đó một chút để tiết kiệm thêm một vài byte. Đây là đầu vào của nó:

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 ~

Đó là tổng cộng 15 1.9+ khối lệnh và 838 byte, vì vậy 15 * 2 + 838 = 868 blyte .

Đây là phần (gần như), nó thiếu một góc và cạnh. Nó không hợp lý - lỗi Minecraft? Sẽ chính xác là 400x200 khối nếu không phải như vậy. Tôi không thể làm được gì nhiều.

Áo mưa


4
Yay, một máy phát điện cầu vồng dựa trên lợn! +1
Thiền lập

Nếu đó là 2677 ký tự thì làm sao chỉ có 868 "blyte"? Từ cách tôi hiểu trang đó, số blyte thực tế phải là 2677 + 4
theonlygusti

Đó là 868 nếu bạn xây dựng nó trên thế giới, 2677 nếu bạn sử dụng fallingsand để tạo ra nó (có rất nhiều chi phí)
quat

12

Toán học 152 144 126 byte

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

nhập mô tả hình ảnh ở đây

Cảm ơn @CatsAreFluffy đã cạo sạch 8 byte & @njpipe Organ để biết thêm 18 :)


3
Sử dụng #vs #[[1]], #2vs #[[2]], và @@@vs /@.
Máy

1
Ngoài ra, Threadlàm việc thay vì Transpose.
LegionMammal978

1
Graphics@MapIndexed[{#,Disk[{0,0},4-#/5&@@#2,{Pi,0}]}&,RGBColor/@TextWords@"#f00 #ff7f00 #ff0 #0f0 #00f #4b0082 #8f00ff #fff"]tiết kiệm thêm 18 byte, nhưng ý tưởng là như nhau.
njpipe Organ 14/03/2016

1
Chỉ cần tò mò ... có một "cầu vồng dựng sẵn"?
mbomb007

@ mbomb007 không phải tôi biết!
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>

Yeesh, đây là clunky. Có những cải tiến có thể được thực hiện.

Đầu ra là SVG, giống như câu trả lời Pyth của tôi .

Cảm ơn @My HamDJ đã cạo sạch 3 byte!


Bạn có thể tắt 2 byte (hoặc tổ hợp phím) nếu bạn thay thế lệnh ex cuối cùng của mình bằngkv3G:norm A'/><cr>
DJMcMayhem

Bạn cũng có thể nghỉ thêm 3 lần nữa nếu bạn nhập <circle cx...chuỗi trên dòng 2 lần đầu tiên, thay vào đó hãy nhập tất cả các màu sau đó nhập chuỗi sau đó.
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)"/>


sử dụng height=200cx=200 cy=200 r=${--r}0thay vì viewBox='0 0 40 20'. Điều đó sẽ tiết kiệm 7 byte.
Patrick Roberts

Tôi hy vọng không sao khi tôi mượn ý tưởng của bạn bằng .replacephương pháp này ...
Patrick Roberts

@PatrickRoberts tất nhiên là ổn, tôi đã mượn một số của bạn
edc65

5
Tôi chắc chắn không mong đợi được nhìn thấy r-=1trong môn đánh gôn ...
Neil

@Neil bah! đó là - = 10 trong một số lần lặp trước khi phát hành cuối cùng
edc65

7

Ruby với Giày, 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}}

Đầu ra mẫu:

cầu vồng của Ruby với giày


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

Tín dụng cho @ edc65 cho ý tưởng chuyển đổi

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

đến

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

Nó có thể trông dài hơn nhưng lượng byte được lưu trong việc nén mảng thành chuỗi rất đáng để chuyển đổi. (Nó tiết kiệm 13 byte trong trường hợp này)

Bản giới thiệu

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 byte

Nếu chúng ta đang vẽ cầu vồng, thì có vẻ như đó là một nơi tốt để sử dụng người kế nhiệm cho 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

Dòng 2 thiết lập bảng màu cho các giá trị RGB cụ thể cần thiết (và có thể không giúp đếm byte) vì màu sắc Spectrum tiêu chuẩn không khớp.

Các DRAWlệnh có thể mất một tham số phụ mà làm cho nó biến thông qua một số độ radian giữa x1, y1 và x2, y2. Cuối cùng, nó tìm thấy một khoảng trống trong hình bán nguyệt vừa vẽ và lấp đầy màu sắc hiện tại.

nhập mô tả hình ảnh ở đây


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}

Than ôi, loại câu hỏi này luôn ưu tiên một số ngôn ngữ bí truyền ... Điều đó nói rằng, Tcl / Tk thực sự làm cho các hoạt động đồ họa tất cả: dễ dàng, ngắn gọn và dễ đọc .

Điều đó nói rằng, tôi đã hy sinh khả năng đọc để giảm bớt các tùy chọn xuống càng ít ký tự càng tốt. Tôi không tưởng tượng việc bẻ khóa danh sách các màu sẽ giúp ích nhiều so với mã để giải nén nó ...

Để so sánh, đây là mã không được mã hóa (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
}

Các afterlệnh đã không may cần thiết vì không di chuyển (có toạ độ gốc của vải) có thể được thực hiện trước khi cửa sổ được ánh xạ tới các màn hình.

Ngoài ra, mã giòn thực sự vẽ một cầu vồng đầy đủ (sử dụng một vòng tròn thay vì một vòng cung) và chỉ dựa vào việc cắt cửa sổ ...

Dù sao, tôi hy vọng bạn sẽ thích. : O)


Bạn có thể sử dụng lmapthay vì foreachrút ngắn.
sergiol

Và bạn có thể đặt dòng đầu tiên bên trong dòng thứ hai như:pack [canvas .c -bg #FFF -bo 0 -highlightt 0] -e 1 -f both
sergiol

Có một sự không thống nhất giữa hai phiên bản mã của bạn. Chơi gôn nào create oval; vô đạo đức nào create arc. Bạn có thể vui lòng giải thích?
sergiol

Cảm ơn đã bình luận. Phiên bản không có bản quyền là để dễ đọc, không chính xác trong việc thực hiện. Và, than ôi, tôi sẽ không quay lại và sửa tất cả các bài giảng của mình -> lmap; có thể để lại cho người đọc ...: 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}

Hãy thử nó ở đây .

Giải thích

\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 Cảm ơn đã liên kết, đã thêm.
Gây tử vong vào

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

Chỉ cần sử dụng Graphics2Dlớp để vẽ 7 cung, với một mảng để lưu trữ màu sắc. Tôi chắc chắn rằng nó có thể được cải thiện hơn nữa.

Mã bị đánh cắp:

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
Bạn 0x0000ffcó thể chỉ 0xffhoặc thậm chí chỉ 255, cùng với 0x00ff00việc 0xff00. 0xff0000có thể 255<<16để lưu một byte khác. Vòng lặp của bạn có thể là để lưu thêm một vài byte. Bạn có thể tiết kiệm một byte hơn bằng cách thêm một ,qđể bạn intkhai. Bạn phải làm cho nó int c[]=thay vì int[] cnhư vậy qlà một intvà không phải là một int[]. Làm điều đó cho phép bạn thêm một q=390-v*20;vòng lặp của bạn. và thay thế 390-v*20bằng một q. Đó là rất nhiều công việc cho một byte, nhưng một byte là một byte, phải không?!
corsiKa

2
Bạn có thể lưu thêm hai byte bằng cách ném Exception thay vì IOException.
corsiKa

Tôi cũng tự hỏi nếu bạn có thể sử dụng drawOvalvà chỉ hiển thị nửa trên của hình ảnh ... có thể đắt hơn một chút mặc dù ...
corsiKa

Tôi biết đã khoảng 1,5 năm, nhưng bạn có thể chơi golf khá nhiều .. 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 byte )
Kevin Cruijssen

4

Bong bóng , 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!..

Đáng buồn thay, điều này ngắn hơn câu trả lời Pyth của tôi . :

Tạo cùng một tệp SVG.


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

Chỉnh sửa: Đã lưu 2 byte bằng cách khắc phục lỗi trong Chrome. Đã lưu thêm 2 byte nhờ @TrangOul.

Lưu ý: đoạn mã sử dụng <div>do hạn chế của Stack Snippets.


Có vẻ như nền bên ngoài cầu vồng có màu đỏ (ít nhất là trên điện thoại của tôi).
Stewie Griffin

@StewieGriffin Hoạt động tốt với tôi trong Firefox cho Android. (Tôi không thể tìm ra cách bật Stack Snippets trong trình duyệt mặc định của điện thoại của mình.)
Neil

Ok, hơi lạ một chút :-) Tôi đang sử dụng chrome 49.0.2623.91 trên galaxy s6 edge btw.
Stewie Griffin

@StewieGriffin Có vẻ như nó cũng bị hỏng trong Chrome dành cho Windows.
Neil

@StewieGriffin OK Tôi nghĩ rằng tôi có một cách giải quyết và nó cũng tiết kiệm được hai byte!
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());


Cảm ơn @StewieGriffin Tôi đã thực hiện thay đổi trong 10. Đã cố gắng để đếm ngược nhưng vẫn là một cách từ câu trả lời của tay nắm cửa!
sói

Bạn có thể di chuyển mọi thứ giữa phần for { ... }sang bên trong phần cuối cùng, được phân tách bằng ,. ví dụ for(i=0;i<8;x.beginPath(),x.arg(...etc...)). Bạn cũng có thể sử dụng slice/ splicecủa chất nền nếu tôi không nhầm. Nó cũng có thể ngắn hơn để tạo <canvas> bằng cách sử dụng .innerHTML. Hoặc thậm chí là một câu trả lời HTML + JS và đưa ra <canvas> và id của cnó và sau đó nó sẽ tự động được thêm dưới dạng một biến toàn cục JS
Downgoat

@Downgoat substrcó lợi thế ở đây là tham số thứ hai của nó là độ dài, không phải là độ lệch. Đối với việc chơi golf, document.bodydường như sẽ cung cấp một khoản tiết kiệm đáng kể.
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;}

Đầu ra là PPM (loại nhị phân).

Chỉnh sửa: Đã lưu một vài byte nhờ @tucuxi.

Chỉnh sửa 2: Sắp xếp lại mã để tiết kiệm hơn nữa.


1
bạn có thể cạo một byte bằng i;s;t;main()-> s;t;main(i)và một byte khác bằng cách đặt một phần của thân vòng lặp for của bạn trong for: ;)code1,code2;-> ;code2)code1;(đã lưu dấu phẩy!).
tuc lửa

4

Google Blockly , 48 khối, 75 byte

Nhấp vào gif bên dưới để điều hướng đến giải pháp, nơi bạn có thể xem xét kỹ hơn về cách thức hoạt động của nó.
Đối với một lời giải thích, tôi nghĩ rằng một hình ảnh có giá trị một ngàn từ, và do đó một gif có giá trị một ngàn hình ảnh.

liên kết đến gif lớn có thể đọc được

Lưu ý: Tôi không chắc cách đếm trong Blockly, vì vậy tôi đã đếm mỗi khối là 1 byte và mỗi biến theo cách thông thường, sao cho 0== 1 byte, 530== 3 byte, Arial== 5 byte và bold== 4 byte.
Tôi đếm ký tự đặc biệt mà tôi đã sử dụng để cắt cầu vồng là 2 byte. Vui lòng báo cáo bất kỳ sai lầm hoặc đề xuất về số byte trong các ý kiến


4

Bản ghi (87 byte)

Đổ lục giác:

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

Đầu ra:

nhập mô tả hình ảnh ở đây


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}

Đánh dấu không hợp lệ siêu lừa đảo (có thể có hoặc không chính xác trong trình duyệt của bạn). Chỉ muốn xem nếu nó thậm chí có thể.


Bạn có thể cắt hai byte bằng cách sử dụng # FF0 thay vì màu vàng. Bạn cũng có thể sử dụng thuộc tính bgcolor thay vì thuộc tính style.
tò mò

@cquildannii Tất nhiên, bạn nói đúng về màu sắc ( whitecũng có thể rút ngắn) - không biết tại sao tôi không thấy điều đó. bgcolorMặc dù vậy, tôi đã thử trước khi đăng, nhưng tiếc là nó không còn được hỗ trợ nữa (dù sao trong Chrome cũng vậy)
Flambino 13/03/2016

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

Đầu ra:

Nếm cầu vồng!


1
Nỗ lực tốt đẹp. Nhưng xin lưu ý rằng việc đóng thẻ PHP ở cuối tệp được coi là thói quen xấu ngay cả khi không chơi gôn. Nó sẽ ngắn hơn như tập lệnh CLI, theo cách đó bạn có thể tha thứ cho header()cuộc gọi đó và thậm chí cả thẻ PHP đang mở. Trên Linux, cách đơn giản nhất là chạy 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);' | displaytừ dấu nhắc lệnh và tính nó là 227 ký tự. (Sử dụng PHP 5.6.11.)
thao tác

3

Bash + ImageMagick, 159 125 ký tự

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

Đầu ra mẫu:

cầu vồng của Bash + ImageMagick


3

Đang xử lý, 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++]);

cầu vồng

Đã lưu 10 byte nhờ Kritixi Lithos
... và 6 byte khác nhờ vào dzaima


2
Có thể cạo thêm một byte bằng cách thay đổi for(int i=0;i<8;i++)thành for(int i=0;i++<8;)hoặc tương tự
quat

Tôi không nghĩ bạn có thể sử dụng các biến trong khi gọisize()
Kritixi Lithos

@KritixiLithos Ý bạn là gì?
Flambino

Khi tôi gọi kích thước với các biến là tham số, nó sẽ báo lỗi (trước khi chạy) rằng tôi không thể sử dụng biến để đặt kích thước trên màn hình
Kritixi Lithos

background(-1)là một byte ngắn hơn background(255), và bạn có thể thay đổi 255trong mảng cđể -1lưu một byte
Kritixi Lithos

2

R, 184 170 byte

Tạo một hình ảnh với kích thước pixel cố định hóa ra lại khó hiểu một cách đáng ngạc nhiên với R, có chức năng vẽ đồ thị chủ yếu dành cho các nhà thống kê. Cụ thể R để lại không gian thừa cho nhãn và tọa độ trục trừ khi bạn đặt lề rõ ràng là độ rộng bằng 0 bằng cách gọi par.

Mặt khác, một số màu bắt buộc (cụ thể là đỏ, vàng và xanh) được tìm thấy trong bảng màu mặc định và có thể được tham chiếu đơn giản bởi các chỉ số nguyên.

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

Salon Fku Haiku (184 byte)

Tôi không thể đáp ứng các ràng buộc về kích thước với định dạng này, nhưng tôi nghĩ dù sao nó cũng đáng để chia sẻ.

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

nhập mô tả hình ảnh ở đây


2

VBA Excel, 213 202 196 192 172 byte

Hàm cửa sổ tức thời VBE ẩn danh không nhận đầu vào và xuất cầu vồng, dưới dạng hình ảnh vector, cho đối tượng trang tính (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

Phiên bản chương trình con

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 để loại bỏ .Adjustments(3)=3/80cuộc gọi và thêm một cung thứ 8, trắng

-6 byte để sử dụng -1hơn&HFFFFFF

-3 byte để sử dụng Sheet1hơnSheets(1)

-6 byte để chuyển đổi withcâu lệnh thành setcâu lệnh

-14 byte để chuyển đổi từ Subchức năng VBE ẩn danh

Đầu ra

Bức ảnh hoặc nó đã không xảy ra


1

Studio trò chơi DIV (184 byte)

Không phải ngắn nhất nhưng khá đơn giản. Sử dụng bảng mặc định 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

Cầu vồng trong studio trò chơi div

Giải trình

Xác định bắt đầu chương trình (được đặt tên là "r" để tiết kiệm không gian)

PROGRAM r;

thiết lập bảng tra cứu

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

Mã chương trình BEGIN

BEGIN

Đặt chế độ video thành 400.200

set_mode(400200);

vòng lặp x (biến được xác định trước) từ -80 (bg hack) đến 80 (7 màu + trung tâm trắng)

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

xác định các ràng buộc elipse

y=399-x;

vẽ elipse - trong lần lặp đầu tiên, điều này vẽ một vòng tròn lớn hơn màn hình toàn màu trắng (chỉ số -8)

vẽ (loại (5 = hình elip đầy), màu sắc, độ mờ, x0, y0, x1, y1)

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

khi lần đầu tiên được thực hiện, hãy tăng x lên 0 để bắt đầu vẽ dải màu đỏ

x+=70*(x<0);

kết thúc vòng lặp

END

vòng lặp vô hạn, màn hình vẽ.

LOOP;FRAME;END

kết thúc (khớp BEGIN ở đầu chương trình)

END

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'

nhập mô tả hình ảnh ở đây


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

Chạy nó như thế này:

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

Hình ảnh kết quả 1

Cũng hoạt động trên lý thuyết ở mức 179 byte (nhưng hình ảnh trông có vẻ hơi lộn xộn, GD xấu):

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

Hình ảnh kết quả 2

Cũng không phải là một hình ảnh hoàn hảo, nhưng tốt hơn nhiều so với ở trên (và @ 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

Hình ảnh kết quả 3

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.