Narysuj tęczę

25

Wyzwanie jest proste: narysuj tęczę w jak najmniejszej liczbie bajtów

Dane techniczne tęczy są następujące:

  • Liczba musi mieć dokładnie 400 pikseli szerokości i 200 pikseli wysokości (opcjonalnie 401 x 201, jeśli chcesz mieć pojedynczy piksel środkowy)
  • Czerwony pierścień powinien dotykać wszystkich granic figury (promień zewnętrzny = 200 pikseli)
  • Wszystkie pierścienie powinny mieć tę samą szerokość (10 pikseli)
    • Fioletowy pierścień ma wewnętrzny promień 130 pikseli
  • Łuk powinien stanowić górną połowę idealnego koła
  • Tło powinno być białe (przezroczyste jest również akceptowane)
  • Liczba nie może mieć granic (wyjątek występuje, jeśli nie można znieść granicy)
  • Wbudowane funkcje tworzenia tęczy są niedozwolone!

W tęczy należy zastosować następujące kolory:

rainbow

To jest kod golfowy, więc wygrywa najkrótszy kod w bajtach!

Przykład:

Rainbow

Powiązane, ale różne!

Stewie Griffin
źródło
26
Wbudowane funkcje tworzenia tęczy nie są dozwolone. Jestem pewien, że Mathematica ma taką funkcję
Luis Mendo
Jak niedoskonała może być tęcza? Od antyaliasingu po łzawienie? Rozważ obrazy w tej odpowiedzi
aross
@aross: powinien wyglądać jak próbka tęczy (niektóre piksele mogą się różnić z powodu niedokładnych obliczeń). Dwie ostatnie tęcze są zbyt „niechlujne”, podczas gdy pierwsza wygląda dobrze. Nie mam idealnej zasady, więc skorzystaj z najlepszej oceny :-)
Stewie Griffin
@StewieGriffin Powód, o który pytam, ponieważ najwyraźniej grafika PHP jest dość błędna, a rozwiązanie jest poprawne teoretycznie . Cóż, po drugie, trzeci z antyaliasingiem (który również nie działa dobrze)
aross
Czy grafika wektorowa jest niedozwolona? edycja: nieważne - widzę, że jest już odpowiedź TikZ, więc rozumiem, że tak.
Julian Wolf,

Odpowiedzi:

15

MATL , 107 95 92 87 84 83 bajtów

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

Działa to w bieżącej wersji (14.0.0) języka / kompilatora.

EDYCJA (6 lipca 2017 r.) : Możesz spróbować w MATL Online! .

Aby sprawdzić, czy kolory są poprawne, usuń pięć ostatnich znaków (musisz poczekać kilka sekund i przewinąć w dół do końca wydruku).

enter image description here

Wyjaśnienie

Kod składa się z trzech głównych kroków:

Krok 1 : Wygeneruj macierz 201x401 z liczbami od 1do 8. Pikselami z wartością 1są tło (białe), piksele z wartościami2 ... 8reprezentują każde pasmo tęczy.

Współrzędne poziome wynosić od -200do 200lewej do prawej, jak i pionowe współrzędne wahają się od0 do 200dołu ku górze. Tak więc początek (0,0) to dolny środkowy środek, lewy górny róg to (-200,200) itd.

Różne pasma tęczy są generowane przez obliczenie odległości od każdego piksela do początku i kwantyzację w krokach co 10 pikseli.

Krok 2 : Wygeneruj macierz 8x3 definiującą mapę kolorów. Każdy rząd jest jednym z niezbędnych kolorów (biały i siedem kolorów tęczy). Każda wartość poprzedniej macierzy 201x401 będzie interpretowana jako indeks wiersza tej mapy kolorów.

Generujemy macierz mapowania kolorów, używając wartości od 0 do 1 dla każdego składnika koloru, a następnie mnożąc przez 255 i zaokrąglając w dół. W ten sposób większość wartości to początkowo 0 i 1, które później staną się 0 i 255. Wartości pośrednie są kodowane jako wartości od 0 do 1 z 2 lub 3 miejscami po przecinku, wybranymi tak, że po pomnożeniu i zaokrągleniu dają dokładnie pożądaną wartość.

Krok 3 : Wyświetl obraz z tą mapą kolorów.

               % 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
źródło
28

Piet , 838 kodów, kilka tysięcy pikseli

Ktoś musiał to zrobić:

An awesome rainbow

Jeśli zapiszesz ten obraz, możesz spróbować online !

Rzeczywisty program Piet to tylko górne ~ 125 pikseli, które utworzyłem za pomocą napisanego przeze mnie programu w języku Python.

Edytowanie tego później naprawdę zaszkodziło mojej wizji, będę się potykał przez kilka dni!

Powoduje to wyświetlenie obrazu w formacie SVG, ponieważ SVG jest (moim zdaniem) najprostszym sposobem na zrobienie tego. Bezwstydnie ukradłem kod SVG Doorknoba. Wyjścia:

correct output

cóż, to naprawdę:

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

Powodzenia pokonując tę ​​odpowiedź, użytkownicy spoza Esolang!

theonlygusti
źródło
2
Czy ten skrypt Pythona jest publiczny? Proszę o przyjaciela, który jest bardzo leniwy ....
NaCl
Eee, wdrożenie xD zajmuje dosłownie ~ 2 minuty. Możesz tu znaleźć starą wersję i w razie potrzeby ją zmienić: mediafire.com/download/0isocsb81n7r2cv/piet.py (uwaga: zrobiłem to, gdy miałem 10 lat, kod jest zawstydzający co najmniej) - wymaga zainstalowanego PyPNG.
theonlygusti
15

Pyth, 150 149 128 bajtów

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

Dane wyjściowe w 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 />

rainbow

Dzięki @MamaFunRoll za 16 bajtów i @PatrickRoberts za 6 kolejnych!

Klamka
źródło
2
Prawdopodobnie można zaoszczędzić wiele bajtów, pakując ciągi.
spaghetto
@AquaTart Wszystko, co robi, to dodawanie bajtów. O_o
Klamka
3
Nie sądzę, żebyś potrzebował żadnego cudzysłowu, kończących się ukośników lub ostatniego </svg>znacznika końcowego .
Mama Fun Roll
4
Dwie propozycje: red #ff7f00 #ff0 #0f0 #00f #8f00ff #fffna liście kolorów i wziąć apostrofów wyłączyć wszystkie wartości parametrów, które nie mają miejsca w nich ( cx, cy, ri fill), ale upewnij się, aby pozostawić przestrzeń pomiędzy wartością wypełnienia, a /więc kolor nie zostanie błędnie zinterpretowane . Usuń także </svg>jak sugerowano powyżej.
Patrick Roberts,
1
Przepraszam, miałem na myśli red #ff7f00 #ff0 #0f0 #00f indigo #8f00ff #fff. Również, jeśli zastąpisz spacje przecinkami, viewBoxmożesz również usunąć pojedyncze cudzysłowy dla tego parametru.
Patrick Roberts,
14

Minecraft 1.10 (prawie), 2677 znaków jednym poleceniem, 868 blytów

Cóż, na pewno wybrałem pełny język.

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

Stwórz nowy świat Superflat, wklej ten bałagan do bloku poleceń Impulse, ustaw dość wysoką odległość renderowania i uruchom go. Zniszcz podstawkę na zbroję, gdy komputer przestanie być opóźniony.

Wynik to 400 bloków w poprzek i 200 bloków wysokości, zgodnie z życzeniem.

Kiedyś MrGarretto za jedno polecenie generator zapakować wszystko razem, a następnie zmodyfikowany wynik to trochę zaoszczędzić kilka bajtów więcej. Oto dane wejściowe:

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 ~

To w sumie 15 1.9+ bloków poleceń i 838 bajtów, więc 15 * 2 + 838 = 868 blytów .

Oto (prawie) część, brakuje jej rogu i krawędzi. Logicznie nie powinno - błąd Minecraft? Byłoby dokładnie 400 x 200 bloków, gdyby nie to. Niewiele mogę zrobić.

Rainboom

quat
źródło
4
Tak, oparty na świni generator tęczy! +1
TuxCrafting
Jeśli ma 2677 znaków, to może to być tylko 868 „blytes”? Z tego, jak rozumiem tę stronę, rzeczywiste blyty powinny wynosić 2677 + 4
theonlygusti
Jest 868, jeśli zbudujesz go na świecie, 2677, jeśli użyjesz Fallingsa i go stworzysz (co ma duże koszty ogólne)
quat
12

Mathematica 152 144 126 bajtów

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

enter image description here

Dzięki @CatsAreFluffy za zgolenie 8 bajtów i @njpipeorgan na kolejne 18 :)

jaskółka oknówka
źródło
3
Zastosowanie #vs #[[1]], #2vs #[[2]], i @@@vs /@.
CalculatorFeline
1
Również Threaddziała zamiast Transpose.
LegionMammal978
1
Graphics@MapIndexed[{#,Disk[{0,0},4-#/5&@@#2,{Pi,0}]}&,RGBColor/@TextWords@"#f00 #ff7f00 #ff0 #0f0 #00f #4b0082 #8f00ff #fff"]oszczędza kolejne 18 bajtów, ale pomysł jest taki sam.
njpipeorgan
1
Po prostu ciekawy ... jest tam „rainbow wbudowane”?
mbomb007
@ mbomb007 nie jestem tego świadomy!
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>

Tak, to jest niezgrabne. Muszą być usprawnienia, które można wprowadzić.

Dane wyjściowe jako SVG, jak moja odpowiedź w języku Pyth .

Dzięki @MyHamDJ za zgolenie 3 bajtów!

Klamka
źródło
Możesz zgolić 2 bajty (lub naciśnięcia klawiszy), jeśli kv3G:norm A'/><cr>
zastąpisz
Możesz również wziąć 3 dodatkowe zniżki, jeśli wprowadzisz <circle cx...ciąg w linii 2 za pierwszym razem, zamiast wpisywać wszystkie kolory, a następnie wprowadzać go później.
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
źródło
użyj height=200i cx=200 cy=200 r=${--r}0zamiast viewBox='0 0 40 20'. To powinno zaoszczędzić 7 bajtów.
Patrick Roberts,
Mam nadzieję, że to w porządku, że pożyczyłem twój pomysł .replacemetodą ...
Patrick Roberts
@PatrickRoberts oczywiście jest ok, pożyczyłem trochę twoich
edc65
5
Na pewno nie spodziewałem się, że zobaczę r-=1w golfie z kodem ...
Neil
@Neil bah! to było - = 10 w pewnej iteracji przed ostatecznym wydaniem
edc65
7

Rubin z butami, 155 bajtów

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

Przykładowe dane wyjściowe:

rainbow by Ruby with Shoes

człowiek w pracy
źródło
6

JavaScript (ES6), 171 158 bajtów

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

Kredyt @ edc65 za pomysł konwersji

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

do

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

Może wyglądać dłużej, ale ilość bajtów zaoszczędzonych na kompresji tablicy do łańcucha jest warta konwersji. (W tym przypadku oszczędza 13 bajtów)

Próbny

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
źródło
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
źródło
5

SpecBAS - 318 254 bajtów

Jeśli rysujemy tęcze, to wydaje się, że jest to dobre miejsce do korzystania z następcy 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

Linia 2 ustawia paletę dla potrzebnych określonych wartości RGB (i prawdopodobnie nie pomaga w liczeniu bajtów), ponieważ standardowe kolory widma nie pasują.

DRAWPolecenie może wziąć dodatkowy parametr, który czyni go włączyć poprzez szereg stopni radianach między X1, Y1 i X2, Y2. Wreszcie znajduje przerwę w właśnie narysowanych półkolach i wypełnia się bieżącym kolorem.

enter image description here

Brian
źródło
5

Tcl / Tk , 263 bajtów

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}

Niestety, tego rodzaju pytania zawsze faworyzują niektóre ezoteryczne języki ... To powiedziawszy, Tcl / Tk naprawdę sprawia, że ​​operacje graficzne są wszystkie: łatwe, krótkie i czytelne .

To powiedziawszy, poświęciłem czytelność ograniczania opcji do jak najmniejszej liczby znaków. Nie wyobrażam sobie, by przeglądanie listy kolorów znacznie pomogło w porównaniu do kodu do rozpakowania ...

Dla porównania, oto niekontrolowany kod (380 bajtów):

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
}

afterPolecenie było niestety konieczne, ponieważ bez przewijania (od współrzędnych pochodzenia płótna za) może być wykonane przed okno jest odwzorowany na ekranie.

Ponadto, kod crunched w rzeczywistości rysuje a pełną tęczę (używając koła zamiast łuku) i polega tylko na przycinaniu okien ...

W każdym razie mam nadzieję, że wam się spodoba. : O)

Dúthomhas
źródło
Możesz użyć lmapzamiast foreachskrócić.
sergiol
I możesz wstawić pierwszą linię do drugiej w następujący sposób:pack [canvas .c -bg #FFF -bo 0 -highlightt 0] -e 1 -f both
sergiol
Występuje niespójność między dwiema wersjami kodu. Gra w golfa create oval; nie ma golfa create arc. Czy możesz wyjaśnić?
sergiol
Dziękuję za komentarz. Wersja bez golfa ma na celu czytelność, a nie dokładność implementacji. I, niestety, nie zamierzam wracać i naprawiać wszystkich moich foreach -> lmap; które można pozostawić czytelnikowi ...: O)
Dúthomhas
5

LaTeX, 290 bajtów

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

Wypróbuj tutaj .

Objaśnienia

\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}
Fatalizować
źródło
@DonMuesli Dzięki za link, dodano.
Fatalize
4

Java, 354 bajty

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

Wykorzystuje Graphics2Dklasę do narysowania 7 łuków, z tablicą do przechowywania kolorów. Jestem pewien, że można go jeszcze ulepszyć.

Nieskluczony kod:

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
źródło
2
Twój 0x0000ffmoże być sprawiedliwy 0xfflub nawet taki 255sam z 0x00ff00bytem 0xff00. 0xff0000może być 255<<16zapisanie kolejnego bajtu. Twoją pętlą może być zapisanie kilku dodatkowych bajtów. Możesz zapisać jeszcze jeden bajt, dodając ,qdo swojej intdeklaracji. Trzeba by to zrobić int c[]=zamiast int[] ctak qjest inti nie jest int[]. Dzięki temu możesz dodać a q=390-v*20;do swojej pętli. i zamień na 390-v*20q. To dużo pracy dla jednego bajtu, ale bajt jest bajtem, prawda ?!
corsiKa
2
Możesz zapisać jeszcze dwa bajty, po prostu rzucając wyjątek zamiast wyjątku IOException.
corsiKa
Zastanawiam się również, czy możesz użyć drawOvali po prostu renderować górną połowę obrazu ... może być trochę droższy ...
corsiKa
Wiem, że minęło około 1,5 roku, ale można trochę golfa .. 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 bajtów )
Kevin Cruijssen
4

Bubblegum , 139 119 bajtów

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

Niestety jest to krótsze niż moja odpowiedź w Pythonie . :(

Generuje ten sam plik SVG.

Klamka
źródło
4

CSS, 244 242 240 bajtów

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

Edycja: Zapisano 2 bajty, omijając błąd w Chrome. Zaoszczędź kolejne 2 bajty dzięki @TrangOul.

Uwaga: fragment korzysta z <div>powodu ograniczeń fragmentów stosu.

Neil
źródło
Wygląda na to, że tło na zewnątrz tęczy jest czerwone (przynajmniej na moim telefonie).
Stewie Griffin
@StewieGriffin Działa dobrze w przeglądarce Firefox dla Androida. (Nie mogłem wymyślić, jak włączyć fragmenty stosu w domyślnej przeglądarce mojego telefonu.)
Neil
Ok, trochę dziwne :-) Używam Chrome 49.0.2623.91 na Galaxy S6 Edge BTW.
Stewie Griffin
@StewieGriffin Wygląda na to, że jest również uszkodzony w Chrome na Windows.
Neil,
@StewieGriffin OK Wydaje mi się, że mam obejście, które pozwala zaoszczędzić dwa bajty!
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
źródło
Dzięki @StewieGriffin Wprowadziłem zmianę na 10. Próbowałem uzyskać odliczanie, ale wciąż jest wiele sposobów na odpowiedź na pytanie od klamki!
wolfhammer
Możesz przenieść wszystko między forami { ... }do wewnątrz ostatniej sekcji, oddzielone przez ,. np for(i=0;i<8;x.beginPath(),x.arg(...etc...)). Prawdopodobnie możesz również użyć slice/ splicesubstr, jeśli się nie mylę. Może być również krótszy, aby użyć <canvas> .innerHTML. Lub nawet odpowiedź HTML + JS i podać <canvas> i identyfikator, ca następnie należy ją automatycznie dodać jako zmienną globalną JS
Downgoat
@Downgoat substrma tę zaletę, że jego drugim parametrem jest długość, a nie przesunięcie. Jeśli chodzi o golfa, document.bodywydaje się , że zapewnia znaczne oszczędności.
Neil,
4

C, 220 217 213 bajtów

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

Dane wyjściowe to PPM (binarny).

Edycja: Zapisano kilka bajtów dzięki @tucuxi.

Edytuj 2: Zmieniono kod, aby zaoszczędzić jeszcze więcej.

Lis
źródło
1
możesz ogolić bajt za pomocą i;s;t;main()-> s;t;main(i), a drugi, umieszczając część ciała pętli for wewnątrz: ;)code1,code2;-> ;code2)code1;(zapisano przecinek!).
tucuxi
4

Google Blockly , 48 bloków, 75 bajtów

Kliknij gif poniżej, aby przejść do rozwiązania, w którym możesz dokładniej przyjrzeć się, jak to działa.
Jeśli chodzi o wyjaśnienie, myślę, że obraz jest wart tysiąca słów, a zatem gif jest wart tysiąca obrazów.

link do dużego czytelnego gif

Uwaga: Nie jestem pewien, jak liczyć w trybie Blockly, więc policzyłem każdy blok jako 1 bajt i każdą zmienną w zwykły sposób, tak że 0== 1 bajt, 530== 3 bajty, Arial== 5 bajtów i bold== 4 bajty.
Policzyłem znak specjalny, którego użyłem do odcięcia tęczy, jako 2 bajty. Proszę zgłaszać wszelkie błędy lub sugestie dotyczące liczby bajtów w komentarzach

Bassdrop Cumberwubwubwub
źródło
4

Postscript (87 bajtów)

Zrzut szesnastkowy:

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

Wydajność:

enter image description here

gęś121
źródło
3

HTML + CSS, 310 307 bajtów

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

Nieprawidłowy znacznik superduperowania (może wyglądać lub nie w przeglądarce poprawnie). Chciałem tylko sprawdzić, czy to w ogóle możliwe.

Flambino
źródło
Możesz wyciąć dwa bajty, używając # FF0 zamiast żółtego. Możesz być w stanie użyć atrybutu bgcolor zamiast atrybutów stylu.
curiousdannii
@curiousdannii Oczywiście masz rację co do kolorów ( whitemożna je również skrócić) - nie wiem, dlaczego tego nie widziałem. Próbowałem jednak bgcolorprzed opublikowaniem, ale niestety nie jest już obsługiwany (w każdym razie w Chrome)
Flambino
3

PHP, 285 bajtów

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

Wyjścia:

Taste the rainbow!

Bobbel
źródło
1
Niezły wysiłek. Pamiętaj jednak, że zamykanie znaczników PHP na końcu pliku jest uważane za zły nawyk, nawet jeśli nie grasz w golfa. Byłby krótszy niż skrypt CLI, w ten sposób można oszczędzić tego header()wywołania, a nawet otwierającego tagu PHP. W systemie Linux najprostszym jest uruchomienie 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);' | displayz wiersza polecenia i policzenie go jako 227 znaków. (Przy użyciu PHP 5.6.11.)
manatwork
3

Bash + ImageMagick, 159 125 znaków

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

Przykładowe dane wyjściowe:

rainbow by Bash + ImageMagick

człowiek w pracy
źródło
3

Przetwarzanie, 196 186 181 179 169 163 bajtów

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

rainbow

Zaoszczędź 10 bajtów dzięki Kritixi Lithos
... i kolejne 6 bajtów dzięki dzaima

Flambino
źródło
2
Może ogolić jeszcze jeden bajt, zmieniając się for(int i=0;i<8;i++)w for(int i=0;i++<8;)podobny lub podobny
quat
Nie sądzę, że możesz używać zmiennych podczas dzwonieniasize()
Kritixi Lithos
@KritixiLithos Co masz na myśli?
Flambino,
Kiedy nazywam rozmiar ze zmiennymi jako parametrami, pojawia się błąd (przed uruchomieniem), że nie mogę używać zmiennych do ustawiania wymiarów na ekranie
Kritixi Lithos
background(-1)jest krótszy niż jeden bajt background(255), a można zmienić 255w tablicy caby -1zapisać kolejny bajt
Kritixi Lithos
2

R 18470 170 bajtów

Tworzenie obrazu ze stałymi wymiarami pikseli okazuje się zaskakująco trudne w przypadku R, którego funkcje drukowania są przeznaczone głównie dla statystyków. W szczególności R pozostawia dodatkowe miejsce na etykiety i osie współrzędnych, chyba że jawnie ustawisz marginesy jako zerową szerokość przez wywołaniepar .

Z drugiej strony niektóre wymagane kolory (szczególnie czerwony, żółty i niebieski) znajdują się w domyślnej palecie i można do nich odwoływać się po prostu za pomocą wskaźników liczb całkowitych.

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
źródło
2

Forth Salon Haiku (184 bajty)

Nie mogę spełnić ograniczeń wymiarów w tym formacie, ale pomyślałem, że i tak warto to udostępnić.

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

enter image description here

boomlinde
źródło
2

Excel VBA, 213 202 196 192 172 bajtów

Kod

Anonimowa funkcja bezpośredniego okna VBE, która nie pobiera danych wejściowych i wysyła tęczę jako obraz wektorowy do obiektu arkusza (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

Wersja podprogramu

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 bajtów do usunięcia .Adjustments(3)=3/80połączenia i dodania ósmego białego łuku

-6 bajtów dla użycia -1ponad&HFFFFFF

-3 bajty za użycie Sheet1overSheets(1)

-6 bajtów do konwersji withinstrukcji na setinstrukcję

-14 bajtów do konwersji z Subanonimowej funkcji VBE

Wydajność

Pics or it didn't happen

Taylor Scott
źródło
1

DIV Games Studio (184 bajty)

Nie najkrótszy, ale dość prosty. Używa domyślnej palety 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

Wyjaśnienie

Zdefiniuj początek programu (o nazwie „r”, aby zaoszczędzić miejsce)

PROGRAM r;

wyszukiwanie palety konfiguracji

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

BEGIN kod programu

BEGIN

Ustaw tryb wideo na 400,200

set_mode(400200);

pętla x (predefiniowana zmienna) od -80 (który hack hg) do 80 (7 kolorów + biały środek)

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

zdefiniuj ograniczenia elipse

y=399-x;

narysuj elipsę - przy pierwszej iteracji rysuje koło większe niż ekran w kolorze białym (indeks -8)

rysuj (typ (5 = wypełniona elipsa), kolor, krycie, x0, y0, x1, y1)

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

po zakończeniu najpierw uderz x do zera, aby rozpocząć rysowanie czerwonego paska

x+=70*(x<0);

koniec pętli

END

nieskończona pętla, ekran do rysowania.

LOOP;FRAME;END

koniec (dopasowuje POCZĄTEK na początku programu)

END
MikeDX
źródło
1

Perl, 175 + 1 = 176 bajtów

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

enter image description here

Steve
źródło
1

PHP, 190 bajtów

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

Uruchom tak:

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

Teoretycznie działa również przy 179 bajtach (ale obraz wygląda na nieco pomieszany, zły 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

Resulting image 2

Również nie jest to idealny obraz, ale znacznie lepszy niż powyższe (i @ 166 bajtów):

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
źródło