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!


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

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!


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!


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


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


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!


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


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


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


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


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)


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}

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

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.


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.


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


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.


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


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


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.


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!


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


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


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

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


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


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

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


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

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.