Gökkuşağı çizmek


25

Zorluk basittir: Mümkün olduğunca az byteta gökkuşağı çizin

Gökkuşağının özellikleri aşağıdaki gibidir:

  • Şekil tam olarak 400 piksel genişliğinde ve 200 piksel yüksekliğinde olmalıdır (tek merkez piksel istiyorsanız, isteğe bağlı olarak 401x201)
  • Kırmızı halka, şeklin tüm kenarlarına dokunmalıdır (dış yarıçap = 200 piksel)
  • Tüm halkalar aynı genişliğe sahip olmalıdır (10 piksel)
    • Menekşe halkasının iç yarıçapı 130 piksel olmalıdır
  • Yay mükemmel bir dairenin üst yarısı olmalıdır
  • Arka plan beyaz olacaktır (saydam da kabul edilir)
  • Şekilde sınır yoktur, (sınır bastırılamazsa istisna yapılır)
  • Yerleşik gökkuşağı yapma işlevlerine izin verilmez!

Aşağıdaki renkler gökkuşağında kullanılacaktır:

gökkuşağı

Bu kod golf, yani bayttaki en kısa kod kazanıyor!

Örnek:

Gökkuşağı

İlgili, ama farklı!


26
Gökkuşağı yapma işlevlerine izin verilmez. Mathematica'da bir tane olduğundan emin olduğumdan
Luis Mendo

Gökkuşağı ne kadar kusurlu olabilir? Yumuşatma değil, yırtılmaya mı? Bu cevaptaki
15:16

@ aross: örnek gökkuşağı gibi görünmelidir (bazı pikseller yanlış hesaplamalar nedeniyle değişebilir). Son iki gökkuşağı da "dağınık" dır, ilki tamam görünüyor. Mükemmel bir kuralım yok, o yüzden en iyi kararınızı kullanın :-)
Stewie Griffin

@StewieGriffin Sormamın nedeni, görünüşe göre çözüm PHP teorisinde doğru olsa da PHP grafikleri oldukça buggy . İkincisi, üçüncüsü, örtüşme önleyici (aynı zamanda iyi çalışmaz) ile olacak
saat

Vektör grafiklerine izin verilmiyor mu? düzenleme: boşver — Ben zaten bir TikZ cevabı olduğunu görüyorum, o yüzden topladım.
Julian Wolf

Yanıtlar:


15

MATL , 107 95 92 87 84 83 bayt

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

Bu , dilin / derleyicinin geçerli sürümünde (14.0.0) çalışır .

EDIT (6 Temmuz 2017) : MATL Online'da deneyebilirsiniz ! .

Renklerin doğru olup olmadığını kontrol etmek için son beş karakteri kaldırın (birkaç saniye beklemeniz ve çıktının sonuna kadar kaydırmanız gerekir).

görüntü tanımını buraya girin

açıklama

Kodda üç ana adım vardır:

Adım 1 : numaralar ile bir 201x401 matris oluşturmak 1için 8. Değerli 1pikseller arka plandır (beyaz), değerlere sahip pikseller 2, ..., 8gökkuşağının her bandını temsil eder.

Yatay koordinatlar arasında değişir -200için 200soldan sağa ve dikey koordinatlar arasında değişir 0için 200alt üstüne. Yani başlangıç ​​noktası (0,0) alt orta, üst sol köşe (-200,200) vb.

Gökkuşağının farklı bantları, her pikselden kökene kadar olan mesafeyi hesaplayarak ve 10 piksellik adımlarla ölçülerek üretilir.

Adım 2 : Renk haritasını tanımlayan 8x3'lük bir matris oluşturun. Her sıra gerekli renklerden biridir (beyaz ve gökkuşağının yedi rengi). Önceki 201x401 matrisinin her bir değeri, bu renk haritasının bir satırına indeks olarak yorumlanacaktır.

Renk eşlemi matrisini, her renk bileşeni için 0 ile 1 arasındaki değerleri kullanarak ve ardından 255 ile çarparak aşağı yuvarlayarak oluştururuz. Bu şekilde çoğu değer başlangıçta 0 ve 1'dir, bu daha sonra 0 ve 255 olur. Ara değerler, çarpılarak yuvarlandığında istenen değeri verecek şekilde seçilen, 2 veya 3 ondalık basamak ile 0 ve 1 arasındaki değerler olarak kodlanır.

Adım 3 : Görüntüyü o renk haritasına göre görüntüleyin.

               % 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 kodlayıcı, birkaç bin piksel

Birisi yapmak zorundaydı:

Harika bir gökkuşağı

Bu resmi kaydederseniz çevrimiçi deneyebilirsiniz !

Gerçek Piet programı yazdığım bir Python programını kullanarak oluşturduğum sadece ~ 125 piksel.

Bunu sonradan düzenlemek vizyonuma gerçekten zarar verdi, günlerce açıyorum!

Bu görüntüyü SVG biçiminde verir, çünkü SVG gerçekten (bence) bunu yapmanın en kolay yoludur. Utanmadan Doorknob'un SVG kodunu çaldım. Çıktılar:

doğru çıktı

peki, bu gerçekten:

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

Esolang kullanıcısı olmayanlar bu cevabı geçerken iyi şanslar!


2
Bu python betiği herkese açık mı? Çok tembel bir arkadaş arıyorum, ....
NaCl

Hmm, xD'yi uygulamak tam anlamıyla ~ 2 dakika sürer. Eski bir sürümü burada bulabilir ve gerekirse düzeltebilirsiniz: mediafire.com/download/0isocsb81n7r2cv/piet.py (not: Bunu 10 yaşımdayken yaptım, kod utanç verici. en azından söylemek gerekirse) - yüklü PyPNG'ye ihtiyacı var.
theonlygusti

15

Pyth, 150 149 128 bayt

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

SVG'deki çıktılar:

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

gökkuşağı

16 bayt için @MamaFunRoll ve 6 daha fazla @ PatrickRoberts'a teşekkürler !


2
Dizeleri paketleyerek muhtemelen çok fazla bayttan tasarruf edebilirsiniz.
Bir spaghetto

@AquaTart Tüm bunlar bayt eklemek. O_o
Doorknob

3
Hiçbir alıntıya, bitiş çizgisine veya son bitiş </svg>etiketine ihtiyacın olduğunu sanmıyorum .
Mama Fun Roll

4
İki öneriler: red #ff7f00 #ff0 #0f0 #00f #8f00ff #fffBunlardan (boşluk olmayan tüm parametre değerlerinin kapalı tek tırnak almak renk listesi için ve cx, cy, rve filldolgu değeri ve arasında boşluk bırakmak) ama emin olun /renk yanlış yorumlandığını almaz böylece . Ayrıca </svg>yukarıda önerildiği şekilde çıkarın .
Patrick Roberts

1
Üzgünüm, demek istedim red #ff7f00 #ff0 #0f0 #00f indigo #8f00ff #fff. Ayrıca boşlukları virgül ile değiştirirseniz, viewBoxo parametrenin tek tırnaklarını da kaldırabilirsiniz.
Patrick Roberts

14

Minecraft 1.10 (neredeyse), 2677 karakter bir komut, 868 blyte

Tabii ki ayrıntılı bir dil seçtim.

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

Yeni bir Superflat dünyası yarat, bu karışıklığı bir Impulse komut bloğuna yapıştır, render mesafeni oldukça yüksek tut ve çalıştır. Bilgisayarınız durmayı bıraktığında zırh standını kırın.

Sonuç, istenildiği gibi 400 blok ve 200 blok yüksekliğindedir.

Her şeyi bir araya getirmek için MrGarretto'nun bir komut üretecini kullandım ve ardından birkaç bayttan tasarruf etmek için bunun sonucunu biraz değiştirdim. İşte bunun için giriş:

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 ~

Bu toplam 15 1.9+ komut bloğu ve 838 bayt, yani 15 * 2 + 838 = 868 blyte .

İşte (neredeyse) kısım, bir köşe ve kenar eksik. Mantıklı olmamalı - Minecraft hata? Olmasaydı tam olarak 400x200 blok olurdu. Yapabileceğim bir şey yok.

Rainboom


4
Yay, bir domuz tabanlı gökkuşağı üreticisi! +1
TuxCrafting

2677 karakter ise nasıl sadece 868 "blytes" olabilir? Anladığım kadarıyla gerçek blyte'ler 2677 + 4 olmalı
theonlygusti

Dünyada inşa ediyorsanız 868, düşme ve yaratma için kullanıyorsanız 2677 (ek yükü çok
fazladır

12

Mathematica 152 144 126 bayt

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

görüntü tanımını buraya girin

8 baytlık tıraş için @CatsAreFluffy ve 18 yıl boyunca @njpipeorgan için teşekkürler :)


3
#Vs #[[1]], #2vs #[[2]]ve @@@vs'yi kullanın /@.
Hesap MakinesiFeline

1
Ayrıca, Threadyerine çalışır Transpose.
LegionMammal978

1
Graphics@MapIndexed[{#,Disk[{0,0},4-#/5&@@#2,{Pi,0}]}&,RGBColor/@TextWords@"#f00 #ff7f00 #ff0 #0f0 #00f #4b0082 #8f00ff #fff"]başka bir 18 byte kaydeder, ancak fikir aynıdır.
njpipeorgan

1
Sadece merak ... olan bir "gökkuşağı yerleşik" Orada?
mbomb007 14.06

@ mbomb007 Bildiğim kadarıyla değil!
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, bu çok zor. Yapılabilecek iyileştirmeler olmalı.

Pyth cevabım gibi SVG olarak çıktı .

3 byte tıraş için @MyHamDJ teşekkürler !


Son eski komutunuzukv3G:norm A'/><cr>
DJMcMayhem

<circle cx...Dize ilk satır 2'ye girdikten sonra tüm renkleri yazıp ardından girdikten sonra 3 tane daha çıkarabilirsiniz .
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)"/>


kullanın height=200ve cx=200 cy=200 r=${--r}0yerine viewBox='0 0 40 20'. Bu 7 bayt kurtarmalı.
Patrick Roberts

Umarım fikrini .replaceyöntemle ödünç almam tamamdır ...
Patrick Roberts

@PatrickRoberts elbette, sorun değil, senin bazılarını ödünç aldım
edc65

5
Kesinlikle r-=1kod
Neil

@Neil bah! Nihai sürüm önce bazı tekrarında = 10 - öyleydi
edc65

7

Yakutlu Ayakkabı, 155 bayt

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

Örnek çıktı:

Rainbow ile ayakkabı ile Ruby


6

JavaScript (ES6), 171 158 bayt

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

Fikir dönüştürmek için @ edc65

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

için

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

Daha uzun görünebilir, ancak diziyi bir dizgeye sıkıştırırken kaydedilen bayt miktarı, dönüştürmeye değer. (Bu durumda 13 bayt kaydeder)

gösteri

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 bayt

Gökkuşağı çiziyorsak, halefi ZX Spectrum BASIC'e kullanmak için iyi bir yer gibi görünüyor.

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

Satır 2, standart Spektrum renkleri uyuşmadığı için paleti gerekli spesifik RGB değerleri için ayarlar (ve muhtemelen bayt sayımına yardımcı olmaz).

DRAWKomut bunun bir numara ile açmak kılan ek bir parametre alabilir derece x1, y1 ve x2, y2 arasına radyan. Sonunda henüz çizilen yarım daire içinde bir boşluk bulur ve mevcut renkle doludur.

görüntü tanımını buraya girin


5

Tcl / Tk , 263 bayt

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}

Ne yazık ki, bu tür bir soru her zaman bazı ezoterik dilleri desteklemektedir ... Bu, Tcl / Tk grafik işlemlerinin hepsini gerçekten kolay, kısa ve okunaklı kılıyor .

Bununla birlikte, seçenekleri olabildiğince az karaktere düşürmek için okunabilirliği feda ettim. Renklerin listesinin sıkıştırılmasının, ambalajı açma koduna kıyasla çok yardımcı olacağını düşünmüyorum ...

Karşılaştırma için, burada kodsuz kod (380 bayt):

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
}

afterKomut penceresi ekrana eşleştirilir önce (tuvalin koordinat kökenli) hiçbir kaydırma yapılabilir beri maalesef gerekliydi.

Ayrıca, çıtır çıtır kod aslında tam bir gökkuşağı çizer (bir yay yerine bir daire kullanarak) ve sadece pencere kesmeye dayanır ...

Her neyse, umarım beğenirsiniz. :O)


Kısaltmak lmapyerine kullanabilirsiniz foreach.
sergiol

Ve ilk çizgiyi ikincinin içine koyabilirsiniz:pack [canvas .c -bg #FFF -bo 0 -highlightt 0] -e 1 -f both
sergiol

Kodunuzun iki sürümü arasında bir tutarsızlık var. Golf yaptım create oval; ungolfed yapar create arc. Açıklayabilir misin?
sergiol

Yorumunuz için teşekkürler. Asılsız versiyon uygulamadaki doğruluk değil okunabilirlik içindir. Ve ne yazık ki, geri dönüp tüm foreach'imi düzeltmeyeceğim -> lmap; Bu okuyucu için bırakılabilir ...: O)
Dúthomhas

5

LaTeX, 290 bayt

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

Burada dene .

açıklamalar

\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 Bağlantı için teşekkürler, eklendi.
16'da Martal'i

4

Java, 354 bayt

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

Graphics2DSınıfı sadece 7 yay çizmek için kullanır , renkleri saklamak için bir dizi kullanır. Eminim daha da geliştirilebilir.

Ungolfed 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
Sizin 0x0000ffsadece olabilir 0xffya da sadece 255aynı ile 0x00ff00varlık 0xff00. başka bir baytı kurtarmak 0xff0000olabilir 255<<16. Döngünüz birkaç bayt daha fazla tasarruf etmek olabilir. Bir ekleyerek bir byte daha kaydedebilirsiniz ,qsizin için intbeyanname. Bunu yapmak zorundayız int c[]=yerine int[] cöylesine qbir olduğunu intve değil bir int[]. Bunu yapmak, döngünüze bir a eklemenizi sağlar q=390-v*20;. ve 390-v*20ile bir q değiştirin . Bir bayt için çok fazla iş var, ama bir bayt bir bayt, değil mi?
corsiKa

2
Yalnızca IOException yerine İstisna atarak iki bayttan tasarruf edebilirsiniz.
corsiKa

Acaba drawOval, görüntünün üst yarısını kullanabilir ve sadece yapabilirseniz de ... biraz daha pahalı olabilir mi ...
corsiKa

Yaklaşık 1.5 sene geçtiğini biliyorum, ancak biraz golf oynayabilirsiniz .. void r()throws Exception{BufferedImage i=new BufferedImage(400,200,2);Graphics2D g=i.createGraphics();g.setStroke(new BasicStroke(10));for(int c[]={255<<16,16744192,16776960,65280,255,4915330,9371903},v=0,t;v<7;g.drawArc(t=v*10+5,t,t=390-v++*20,t,0,360))g.setColor(new Color(c[v]));ImageIO.write(i,"PNG",new File("a.png"));}}( 325 bytes )
Kevin Cruijssen

4

Bubblegum , 139 119 bayt

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

Ne yazık ki, bu Pyth cevabımdan daha kısa . :(

Aynı SVG dosyasını oluşturur.


4

CSS, 244 242 240 bayt

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

Düzenleme: Chrome'da bir hata etrafında çalışarak 2 bayt kurtardı. @TrangOul sayesinde 2 bayt daha kaydedildi.

Not: snippet <div>, Stack Snippets'in sınırlamaları nedeniyle kullanır .


Gökkuşağının dışındaki arka plan kırmızı görünüyor (en azından telefonumda).
Stewie Griffin

@StewieGriffin Android için Firefox'ta benim için iyi çalışıyor. (Telefonumun varsayılan tarayıcısında Stack Snippets'in nasıl etkinleştirileceğini çözemedim.)
Neil

Tamam, biraz garip :-) ben galaksi s6 kenar btw üzerinde 49.0.2623.91 krom kullanıyorum.
Stewie Griffin

@StewieGriffin Windows için Chrome'da da bozuk gibi görünüyor.
Neil

@StewieGriffin Tamam Bir geçici çözümüm olduğunu düşünüyorum ve bu da iki byte kazandırıyor!
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());


Thanks @StewieGriffin 10 için değişiklik yaptım. Geri sayımı elde etmeye çalışıyorum ama kapı kolları pyth cevabından hala bir yol var!
wolfhammer

{ ... }İle ayrılan bölümler arasında her şeyi son bölümün iç kısmına taşıyabilirsiniz ,. örn for(i=0;i<8;x.beginPath(),x.arg(...etc...)). Yanılmıyorsam muhtemelen substr slice/ splicesubstr kullanabilirsiniz . <canvas> özelliğini kullanarak yapmak da daha kısa olabilir .innerHTML. Hatta bir HTML + JS cevap vermek ve <canvas> ve kimliği cve daha sonra otomatik olarak JS küresel değişken olarak eklenmelidir
Downgoat

@Downgoat substrburada ikinci parametrenin bir uzunluk değil bir uzunluk olması avantajına sahiptir. Golf gelince, document.bodyönemli bir tasarruf sağlamak gibi görünüyor.
Neil

4

C, 220 217 213 bayt

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

Çıktı, PPM'dir (ikili tür).

Düzenleme: @tucuxi sayesinde birkaç bayt kaydedildi.

Düzenleme 2: Daha fazla tasarruf için yeniden düzenlenmiş kod.


1
for döngüsü gövdesinin bir kısmını for: -> (virgülle kaydetti!) içine yerleştirerek i;s;t;main()-> ile bir bayt tıraş edebilirsiniz . s;t;main(i);)code1,code2;;code2)code1;
tucuxi

4

Google Blockly , 48 blok, 75 bayt

Nasıl çalıştığını daha yakından inceleyebileceğiniz çözüme gitmek için aşağıdaki gif'i tıklayın.
Bir açıklama gelince, bir görüntünün bin kelime değerinde olduğunu düşünüyorum ve bu nedenle bir gif bin görüntü değerinde olduğunu düşünüyorum.

büyük okunabilir gif bağlantısı

Not: Blockly'de nasıl sayılacağından emin değilim, bu yüzden her bloğu 1 bayt ve her değişkeni normal şekilde saydım, böylece 0== 1 bayt, 530== 3 bayt, Arial== 5 bayt ve bold== 4 bayt.
Gökkuşağını kesmek için kullandığım özel karakteri 2 bayt olarak saydım. Lütfen yorumlarınızdaki bayt sayısının hatalarını veya önerilerini bildirin


4

Postscript (87 bayt)

Hex dökümü:

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

Çıktı:

görüntü tanımını buraya girin


3

HTML + CSS, 310 307 bayt

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

Süper duper geçersiz işaretleme (tarayıcınızda doğru görünebilir veya görünmeyebilir). Sadece mümkün olup olmadığını görmek istedim.


Sarı yerine # FF0 tuşunu kullanarak iki baytı kesebilirsiniz. Siz de stil özellikleri yerine bgcolor özelliğini kullanabilirsiniz.
curiousdannii

@curiousdannii Elbette renkleri hakkında haklısın ( whiteayrıca kısaltılabilir) - neden görmedim bilmiyorum. bgcolorYine de göndermeden önce denedim , ancak ne yazık ki artık desteklenmiyor (burada yine de Chrome'da)
Flambino

3

PHP, 285 bayt

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

Çıktılar:

Gökkuşağının tadına bak!


1
Güzel çaba. Ancak, dosyanın sonunda PHP etiketinin kapatılmasının golf oynamadığı zamanlarda bile kötü alışkanlık olarak kabul edildiğini unutmayın. CLI betiği kadar kısa olurdu, bu header()çağrıyı ve hatta açılış PHP etiketini ayırabilirsiniz . Linux'ta en basit olanı 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);' | displaykomut isteminden çalıştırmak ve bunu 227 karakter olarak saymaktır. (PHP 5.6.11 kullanarak.)
Manatwork

3

Bash + ImageMagick, 159 125 karakter

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

Örnek çıktı:

rainbow tarafından Bash + ImageMagick


3

İşleme, 196 186 181 179 169 163 bayt

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

gökkuşağı

Kritixi Lithos sayesinde 10 byte kurtarıldı
... ve dzaima sayesinde 6 byte kurtarıldı


2
Değiştirerek bir daha byte traş Can for(int i=0;i<8;i++)içine for(int i=0;i++<8;)veya benzer
kuat

Arama yaparken değişkenleri kullanabileceğinizi sanmıyorumsize()
Kritixi Lithos,

@KritixiLithos Ne demek istiyorsun?
Flambino,

Parametreleri değişken olarak boyut olarak çağırdığımda, (boyutları çalıştırmadan önce) ekranda boyutları ayarlamak için değişkenleri kullanamayacağımı
Kritixi Lithos

background(-1)bir bayttan daha kısadır background(255)ve 255diziyi başka bir baytı kurtarmak ciçin değiştirebilirsiniz-1
Kritixi Lithos

2

R, 184 170 bayt

Sabit piksel boyutlarına sahip bir resim yapmak, çizim işlevleri çoğunlukla istatistikçiler için amaçlanan R ile şaşırtıcı şekilde zor görünüyor. Özellikle R, etiketler için fazladan boşluk bırakır ve açıkça çağırmak suretiyle kenar boşluklarını sıfır genişliğine ayarlamazsanız eksenleri koordine eder par.

Öte yandan, gerekli renklerin bazıları (özellikle kırmızı, sarı ve mavi), varsayılan palette bulunur ve sadece tamsayı indeksleriyle gösterilebilir.

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

İleri Salon Haiku (184 bayt)

Boyut sınırlamalarını bu formatla karşılayamıyorum, ancak yine de paylaşmaya değer olduğunu düşündüm.

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

görüntü tanımını buraya girin


2

Excel VBA, 213 202 196 192 172 Bayt

kod

Girdi almayan ve bir gökkuşağı görüntüleyen bir vektör görüntüsü olarak anonim VBE acil pencere işlevi sheets (1) nesnesine

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

Altprogram Sürümü

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

.Adjustments(3)=3/80Çağrıyı kaldırmak ve 8. beyaz ark eklemek için -11 bayt

-6 bit kullanmak -1için&HFFFFFF

Sheet1Üzerinden kullanmak için -3 baytSheets(1)

-6 dönüştürmek için bayt withdeyimi setdeyimi

SubAnonim VBE işlevine dönüştürme için -14 bayt

Çıktı

Resimler ya da olmadı


1

DIV Oyunlar Stüdyosu (184 bytes)

En kısa değil ama oldukça basit. DIV varsayılan paletini kullanır

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 div oyun stüdyosunda

açıklama

Program başlangıcını tanımla (yer kazanmak için "r" adında)

PROGRAM r;

kurulum paleti araması

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

BEGIN program kodu

BEGIN

Video modunu 400.200 olarak ayarla

set_mode(400200);

döngü x (önceden tanımlanmış değişken) -80 (bg hack) ile 80 (7 renk + beyaz orta)

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

elips sınırlarını tanımla

y=399-x;

elips çiz - ilk yinelemede bu, ekrandan tam beyaz olarak daha büyük bir daire çizer (index -8)

çizmek (tip (5 = dolu elips), renk, opaklık, x0, y0, x1, y1)

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

ilk kez yapıldığında, kırmızı bant çizmeye başlamak için x sıfıra çarpın

x+=70*(x<0);

döngü için son

END

sonsuz döngü, çizim ekranı.

LOOP;FRAME;END

son (programın başında BEGIN ile eşleşir)

END

1

Perl, 175 + 1 = 176 bayt

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'

görüntü tanımını buraya girin


1

PHP, 190 bayt

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

Bu şekilde çalıştırın:

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

Sonuç görüntü 1

Ayrıca teoride 179 baytta çalışıyor (ancak görüntü biraz karışık, kötü GD görünüyor):

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

Sonuç görüntü 2

Ayrıca mükemmel bir görüntü değil, yukarıdakinden çok daha iyi (ve @ 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

Sonuç görüntü 3

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.