Zeichne den Regenbogen

25

Die Herausforderung ist einfach: Zeichnen Sie einen Regenbogen in so wenigen Bytes wie möglich

Die Spezifikationen für den Regenbogen lauten wie folgt:

  • Die Figur muss genau 400 Pixel breit und 200 Pixel hoch sein (optional 401x201, wenn Sie ein einzelnes zentrales Pixel wünschen)
  • Der rote Ring sollte alle Ränder der Figur berühren (äußerer Radius = 200 Pixel)
  • Alle Ringe müssen die gleiche Breite haben (10 Pixel)
    • Der violette Ring muss einen Innenradius von 130 Pixel haben
  • Der Bogen sollte die obere Hälfte eines perfekten Kreises sein
  • Der Hintergrund muss weiß sein (auch transparent wird akzeptiert)
  • Die Figur darf keine Grenzen haben (Ausnahme ist, wenn die Grenze nicht unterdrückt werden kann)
  • Eingebaute Regenbogenfunktionen sind nicht erlaubt!

Folgende Farben sind im Regenbogen zu verwenden:

Regenbogen

Das ist Code Golf, also gewinnt der kürzeste Code in Bytes!

Beispiel:

Regenbogen

Verwandt, aber anders!

Stewie Griffin
quelle
26
Eingebaute Funktionen zur Regenbogenherstellung sind nicht erlaubt. Ich bin sicher, Mathematica hat eine
Luis Mendo
Wie unvollkommen darf der Regenbogen sein? Vom Nicht-Anti-Aliasing zum Zerreißen? Betrachten Sie die Bilder in dieser Antwort
etwa am
@aross: Es sollte wie im Beispielregenbogen aussehen (einige Pixel können aufgrund ungenauer Berechnungen abweichen). Die beiden letzten Regenbogen sind zu "chaotisch", während der erste in Ordnung aussieht. Ich habe keine perfekte Regel, verwenden Sie also Ihr bestes Urteil :-)
Stewie Griffin
@StewieGriffin Grund, den ich frage, ist, dass anscheinend PHP-Grafiken ziemlich fehlerhaft sind, während die Lösung theoretisch korrekt ist . Nun, die zweite ist, die dritte wäre mit Anti-Aliasing (was auch nicht gut funktioniert)
etwa am
Sind Vektorgrafiken nicht erlaubt? edit: macht nichts - ich sehe, dass es bereits eine TikZ-Antwort gibt, also denke ich, dass sie es sind.
Julian Wolf

Antworten:

15

MATL , 107 95 92 87 84 83 Bytes

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

Dies funktioniert in der aktuellen Version (14.0.0) der Sprache / des Compilers.

EDIT (6. Juli 2017) : Sie können es bei MATL Online ausprobieren! .

Um zu überprüfen, ob die Farben korrekt sind, entfernen Sie die letzten fünf Zeichen (Sie müssen einige Sekunden warten und bis zum Ende der Ausgabe scrollen).

Bildbeschreibung hier eingeben

Erläuterung

Der Code besteht aus drei Hauptschritten:

Schritt 1 : Generieren Sie eine 201x401-Matrix mit Zahlen von 1bis 8. Pixel mit Wert 1sind Hintergrund (weiß), Pixel mit Werten 2, ..., 8repräsentieren jedes Band des Regenbogens.

Horizontale Koordinaten liegen im Bereich von -200bis 200links nach rechts und vertikalen Koordinaten liegen im Bereich von 0bis 200unten nach oben. Der Ursprung (0,0) ist also unten in der Mitte, die obere linke Ecke ist (-200.200) usw.

Die verschiedenen Bänder des Regenbogens werden erzeugt, indem der Abstand von jedem Pixel zum Ursprung berechnet und in Schritten von 10 Pixeln quantisiert wird.

Schritt 2 : Erzeugen Sie eine 8x3-Matrix, die die Farbkarte definiert. Jede Reihe ist eine der notwendigen Farben (Weiß und die sieben Farben des Regenbogens). Jeder Wert der vorherigen 201x401-Matrix wird als Index für eine Zeile dieser Farbkarte interpretiert.

Wir generieren die Colormap-Matrix mit Werten zwischen 0 und 1 für jede Farbkomponente und multiplizieren dann mit 255 und runden ab. Auf diese Weise sind die meisten Werte anfangs 0 und 1, die später zu 0 und 255 werden. Zwischenwerte werden als Werte zwischen 0 und 1 mit 2 oder 3 Dezimalstellen codiert, die so gewählt werden, dass sich beim Multiplizieren und Runden der exakte gewünschte Wert ergibt.

Schritt 3 : Zeigen Sie das Bild mit dieser Farbkarte an.

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

Piet , 838 Codels, mehrere tausend Pixel

Jemand musste es tun:

Ein großartiger Regenbogen

Wenn Sie dieses Bild speichern, können Sie es online ausprobieren !

Das eigentliche Piet-Programm besteht nur aus den besten ~ 125 Pixeln, die ich mit einem von mir geschriebenen Python-Programm erstellt habe.

Wenn ich das später bearbeite, schadet das wirklich meiner Vision. Ich werde tagelang stolpern!

Dies gibt das Bild in einem SVG-Format aus, da SVG (meiner Meinung nach) der einfachste Weg ist, dies zu tun. Ich habe schamlos den SVG-Code von Doorknob gestohlen. Ausgänge:

korrekte Ausgabe

Nun, das ist wirklich:

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

Viel Glück bei dieser Antwort, Nicht-Esolang-Benutzer!

theonlygusti
quelle
2
Ist dieses Python-Skript öffentlich? Ich bitte um einen Freund, der sehr faul ist ....
NaCl
Ähm, es dauert buchstäblich ~ 2 Minuten, um xD zu implementieren. Eine alte Version finden Sie hier und können sie bei Bedarf anpassen: mediafire.com/download/0isocsb81n7r2cv/piet.py (Anmerkung: Ich habe das gemacht, als ich 10 war, der Code ist peinlich um es gelinde auszudrücken) - es muss PyPNG installiert sein.
Theonlygusti
15

Pyth, 150 149 128 Bytes

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

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

Regenbogen

Danke an @MamaFunRoll für 16 Bytes und @PatrickRoberts für 6 mehr!

Türknauf
quelle
2
Sie könnten wahrscheinlich eine Menge Bytes sparen, indem Sie die Zeichenfolgen packen.
ein Spaghetto
@AquaTart Es werden nur Bytes hinzugefügt. O_o
Türklinke
3
Ich glaube, Sie brauchen keine Anführungszeichen, endenden Schrägstriche oder das letzte endende </svg>Tag.
Mama Fun Roll
4
Zwei Vorschläge: Verwenden Sie red #ff7f00 #ff0 #0f0 #00f #8f00ff #ffffür die Farbliste einfache Anführungszeichen für alle Parameterwerte, in denen keine Leerzeichen ( ,, und ) enthalten cxsind cy, rund filllassen Sie ein Leerzeichen zwischen dem Füllwert und dem, /damit die Farbe nicht falsch interpretiert wird . Entfernen Sie auch die </svg>wie oben vorgeschlagen.
Patrick Roberts
1
Entschuldigung, ich meinte red #ff7f00 #ff0 #0f0 #00f indigo #8f00ff #fff. Wenn Sie die Leerzeichen durch Kommas ersetzen viewBox, können Sie auch die einfachen Anführungszeichen für diesen Parameter entfernen.
Patrick Roberts
14

Minecraft 1.10 (fast), 2677 Zeichen mit einem Befehl, 868 Blytes

Nun, ich habe wirklich eine wörtliche Sprache gewählt.

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

Erstelle eine neue Superflach-Welt, füge das Chaos in einen Impuls-Befehlsblock ein, stelle deine Renderentfernung ziemlich hoch ein und starte sie. Brechen Sie den Panzerungsständer, wenn Ihr Computer nicht mehr verzögert.

Das Ergebnis ist je nach Anforderung 400 Blöcke breit und 200 Blöcke hoch.

Ich habe MrGarrettos einen Befehlsgenerator verwendet, um alles zusammen zu packen, und dann das Ergebnis ein wenig geändert, um ein paar Bytes mehr zu sparen. Hier ist die Eingabe dazu:

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 ~

Das sind insgesamt 15 1.9+ Befehlsblöcke und 838 Bytes, also 15 * 2 + 838 = 868 Blytes .

Hier ist der (fast) Teil, es fehlt eine Ecke und Kante. Es sollte logischerweise nicht - Minecraft Bug? Wäre genau 400x200 Blöcke, wenn das nicht wäre. Ich kann nicht viel tun.

Regenboom

quat
quelle
4
Ja, ein Regenbogengenerator auf Schweinebasis! +1
TuxCrafting
Wenn es 2677 Zeichen sind, wie können es dann nur 868 "Blytes" sein? Wie ich diese Seite verstehe, sollten die tatsächlichen Blytes 2677 + 4 sein
theonlygusti
Es ist 868, wenn Sie es in der Welt bauen, 2677, wenn Sie fallingsand verwenden, um es zu erstellen (was viel Overhead hat)
Quat
12

Mathematica 152 144 126 Bytes

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

Bildbeschreibung hier eingeben

Vielen Dank an @CatsAreFluffy für das Abschneiden von 8 Bytes und @njpipeorgan für weitere 18 :)

martin
quelle
3
Verwendung #vs #[[1]], #2vs #[[2]], und @@@vs /@.
CalculatorFeline
1
Funktioniert auch Threadstatt Transpose.
LegionMammal978
1
Graphics@MapIndexed[{#,Disk[{0,0},4-#/5&@@#2,{Pi,0}]}&,RGBColor/@TextWords@"#f00 #ff7f00 #ff0 #0f0 #00f #4b0082 #8f00ff #fff"]spart weitere 18 Bytes, aber die Idee ist die gleiche.
njpipeorgan
1
Nur neugierig ... gibt es einen "eingebauten Regenbogen"?
mbomb007
@ mbomb007 nicht das ich wüsste!
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>

Ja, das ist klobig. Es muss Verbesserungen geben, die gemacht werden können.

Ausgabe als SVG, wie meine Pyth-Antwort .

Danke an @MyHamDJ für das Abschneiden von 3 Bytes!

Türknauf
quelle
Sie könnten 2 Bytes (oder Tastenanschläge) kv3G:norm A'/><cr>
einsparen,
Sie können auch 3 weitere ausziehen, wenn Sie die <circle cx...Zeichenfolge zum ersten Mal in Zeile 2 eingeben, anstatt alle Farben einzugeben und sie anschließend einzugeben .
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
quelle
benutze height=200und cx=200 cy=200 r=${--r}0statt viewBox='0 0 40 20'. Das sollte 7 Bytes sparen.
Patrick Roberts
Ich hoffe, es ist in Ordnung, dass ich Ihre Idee mit der .replaceMethode ausgeliehen habe ...
Patrick Roberts
@PatrickRoberts natürlich ist es in Ordnung, ich habe einige von Ihnen ausgeliehen
edc65
5
Ich hätte sicher nicht gedacht, dass es r-=1im Codegolf zu sehen ist ...
Neil,
@ Neil Bah! es war - = 10 in einigen Iterationen vor der endgültigen Veröffentlichung
edc65
7

Rubin mit Schuhen, 155 Bytes

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

Beispielausgabe:

Regenbogen von Ruby mit Schuhen

Mann bei der Arbeit
quelle
6

JavaScript (ES6), 171 158 Byte

document.write`<svg width=400 height=200>${`f00
ff7f00
ff0
0f0
00f
4b0082
8f00ff
fff`.replace(/.+/g,c=>`<circle cx=200 cy=200 r=${i--}0 fill=#${c} />`,i=20)}`

Wir danken @ edc65 für die umzusetzende Idee

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

zu

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

Es mag länger aussehen, aber die Menge an Bytes, die beim Komprimieren des Arrays zu einer Zeichenfolge eingespart wird, ist die Konvertierung wert. (In diesem Fall werden 13 Bytes gespart.)

Demo

document.write`<svg width=400 height=200>${`f00
ff7f00
ff0
0f0
00f
4b0082
8f00ff
fff`.replace(/.+/g,c=>`<circle cx=200 cy=200 r=${i--}0 fill=#${c} />`,i=20)}`

Patrick Roberts
quelle
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
quelle
5

SpecBAS - 318 254 Bytes

Wenn wir Regenbögen zeichnen, ist dies ein guter Ort, um den Nachfolger von ZX Spectrum BASIC zu verwenden.

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

Zeile 2 richtet die Palette für die spezifischen RGB-Werte ein, die benötigt werden (und hilft wahrscheinlich nicht bei der Byte-Zählung), da die Standardfarben des Spektrums nicht übereinstimmen.

Der DRAWBefehl kann einen zusätzlichen Parameter enthalten, der es ermöglicht, zwischen x1, y1 und x2, y2 im Bogenmaß um einige Grad zu drehen. Schließlich findet es eine Lücke in den gerade gezeichneten Halbkreisen und füllt sich mit der aktuellen Farbe.

Bildbeschreibung hier eingeben

Brian
quelle
5

Tcl / Tk , 263 Bytes

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}

Leider bevorzugt diese Art von Frage immer einige esoterische Sprachen ... Trotzdem macht Tcl / Tk Grafikoperationen wirklich einfach, kurz und lesbar .

Trotzdem habe ich die Lesbarkeit geopfert, um die Optionen auf so wenige Zeichen wie möglich zu beschränken. Ich kann mir nicht vorstellen, dass das Zerquetschen der Farbliste im Vergleich zu Code beim Entpacken viel hilft ...

Zum Vergleich hier der nicht gekürzte Code (380 Bytes):

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
}

Der afterBefehl war leider erforderlich, da nicht gescrollt werden kann (vom Koordinatenursprung der Zeichenfläche), bevor das Fenster dem Bildschirm zugeordnet ist.

Außerdem zeichnet der geknackte Code tatsächlich einen vollständigen Regenbogen (unter Verwendung eines Kreises anstelle eines Bogens) und verlässt sich nur auf das Fensterbeschneiden ...

Wie auch immer, ich hoffe es gefällt euch. :O)

Dúthomhas
quelle
Sie können verwenden, lmapanstatt foreachzu verkürzen.
Sergiol
Und Sie können die erste Zeile in die zweite wie pack [canvas .c -bg #FFF -bo 0 -highlightt 0] -e 1 -f both
folgt einfügen
Zwischen den beiden Versionen Ihres Codes besteht eine Inkohärenz. Golf tut create oval; ungolfed tut create arc. Kannst du bitte Erklären?
Sergiol
Danke für den Kommentar. Die ungolfed-Version dient der Lesbarkeit und nicht der Genauigkeit der Umsetzung. Und leider gehe ich nicht zurück und repariere alle meine foreach -> lmap; das kann dem Leser überlassen werden ...: O)
Dúthomhas
5

LaTeX, 290 Bytes

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

Probieren Sie es hier aus .

Erklärungen

\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}
Tödlich
quelle
@DonMuesli Danke für den Link, hinzugefügt.
Fatalize
4

Java, 354 Bytes

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

Zeichnet mit der Graphics2DKlasse einfach 7 Bögen und speichert die Farben in einem Array. Ich bin sicher, dass es weiter verbessert werden kann.

Ungolfed-Code:

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
quelle
2
Du 0x0000ffkönntest gerecht 0xffoder sogar gerecht sein 255, genauso wie das 0x00ff00Sein 0xff00. 0xff0000könnte sein 255<<16, ein anderes Byte zu speichern. Ihre Schleife könnte darin bestehen, ein paar weitere Bytes zu speichern. Sie können ein weiteres Byte speichern, indem Sie ,qIhrer intDeklaration ein hinzufügen . Sie müssten es machen, int c[]=anstatt int[] cso qist ein intund kein int[]. Auf diese Weise können Sie q=390-v*20;Ihrer Schleife ein hinzufügen . und ersetzen Sie die 390-v*20durch ein q. Es ist eine Menge Arbeit für ein Byte, aber ein Byte ist ein Byte, oder ?!
CorsiKa
2
Sie können zwei weitere Bytes sparen, indem Sie einfach Exception anstelle von IOException auslösen.
Corsika
Ich frage mich auch, ob Sie drawOvalnur die obere Hälfte des Bildes verwenden und rendern können ... könnte allerdings etwas teurer sein ...
CorsiKa
Ich weiß, es ist ungefähr 1,5 Jahre her, aber Sie können ziemlich viel Golf spielen. 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 Bytes

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

Leider ist dies kürzer als meine Pyth-Antwort . :(

Erzeugt die gleiche SVG-Datei.

Türknauf
quelle
4

CSS, 244 242 240 Bytes

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

Bearbeiten: 2 Bytes durch Umgehen eines Fehlers in Chrome gespeichert. Dank @TrangOul wurden weitere 2 Bytes gespeichert.

Hinweis: Das Snippet verwendet <div>aufgrund der Einschränkungen von Stack Snippets einen.

Neil
quelle
Es sieht so aus, als wäre der Hintergrund auf der Außenseite des Regenbogens rot (zumindest auf meinem Handy).
Stewie Griffin
@StewieGriffin Funktioniert gut für mich in Firefox für Android. (Ich konnte nicht herausfinden, wie ich Stack Snippets im Standardbrowser meines Telefons aktivieren kann.)
Neil,
Ok, ein bisschen seltsam :-) Ich benutze Chrome 49.0.2623.91 auf Galaxy S6 Edge übrigens.
Stewie Griffin
@StewieGriffin Scheint auch in Chrome für Windows kaputt zu sein.
Neil
@StewieGriffin OK Ich glaube, ich habe eine Problemumgehung, und es spart auch zwei Bytes!
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
quelle
Vielen Dank @StewieGriffin Ich habe die Änderung für 10 gemacht. Ich habe versucht, den Countdown zu bekommen, aber immer noch einen Weg von Türklinken Pyth-Antwort!
Wolfhammer
Sie können alles zwischen den { ... }Fors in den letzten For-Abschnitt verschieben, getrennt durch ,. zb for(i=0;i<8;x.beginPath(),x.arg(...etc...)). Sie können wahrscheinlich auch slice/ spliceof substr verwenden, wenn ich mich nicht irre. Es kann auch kürzer sein, <canvas> zu verwenden .innerHTML. Oder sogar eine HTML + JS-Antwort und geben Sie die <canvas> und ID von cund dann sollte es automatisch als globale JS-Variable hinzugefügt werden
Downgoat
@Downgoat substrhat hier den Vorteil, dass sein zweiter Parameter eine Länge und kein Offset ist. Was das Golfen angeht, document.bodyscheint dies eine erhebliche Ersparnis zu bringen.
Neil
4

C 220, 217, 213 Bytes

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

Ausgabe ist PPM (die binäre Art).

Edit: Sparte dank @tucuxi ein paar Bytes.

Edit 2: Code neu angeordnet, um noch mehr zu speichern.

Fuchs
quelle
1
Sie können ein Byte mit i;s;t;main()-> s;t;main(i)und ein anderes rasieren , indem Sie einen Teil Ihres for-Schleifenkörpers in das for: ;)code1,code2;-> setzen ;code2)code1;(ein Komma wurde gespeichert!).
Tucuxi
4

Google Blockly , 48 Blöcke, 75 Bytes

Klicken Sie auf das GIF unten, um zur Lösung zu navigieren, in der Sie einen genaueren Einblick in die Funktionsweise erhalten.
Zur Erklärung: Ein Bild sagt mehr als tausend Worte, und ein GIF sagt mehr als tausend Bilder.

Link zu großem lesbarem GIF

Hinweis: Ich bin mir nicht sicher, wie ich in Blockly zählen soll. Daher habe ich jeden Block wie gewohnt als 1 Byte und jede Variable gezählt, sodass 0== 1 Byte, 530== 3 Byte, Arial== 5 Byte und bold== 4 Byte.
Ich habe das Sonderzeichen, mit dem ich den Regenbogen abgeschnitten habe, als 2 Byte gezählt. Bitte melden Sie Fehler oder Vorschläge zur Anzahl der Bytes in den Kommentaren

Bassdrop Cumberwubwubwub
quelle
4

Postscript (87 Bytes)

Hex-Dump:

00000000: 3188 0131 2030 2e35 3631 8800 3120 302e  1..1 0.561..1 0.
00000010: 3237 3888 0030 2e35 3188 0030 8801 3088  278..0.51..0..0.
00000020: 0130 8801 3188 0031 2030 2e35 8800 3188  .0..1..1 0.5..1.
00000030: 0030 87c8 0038 7b34 2031 9287 929d 87c8  .0...8{4 1......
00000040: 0030 2032 9258 3087 b400 9205 9216 9242  .0 2.X0........B
00000050: 880a 92a9 7d92 83                        ....}..

Ausgabe:

Bildbeschreibung hier eingeben

goose121
quelle
3

HTML + CSS, 310 307 Bytes

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

Ungültiges Super-Duper-Markup (kann in Ihrem Browser richtig oder falsch aussehen). Ich wollte nur sehen, ob es überhaupt möglich war.

Flambino
quelle
Sie können zwei Bytes schneiden, indem Sie # FF0 anstelle von gelb verwenden. Möglicherweise können Sie auch das Attribut bgcolor anstelle von Stilattributen verwenden.
curiousdannii
@curiousdannii Du hast natürlich Recht mit den Farben ( whitekönnte auch gekürzt werden) - weißt nicht, warum ich das nicht gesehen habe. Ich habe es bgcolorvor dem Posten versucht , aber leider wird es nicht mehr unterstützt (hier in Chrome sowieso)
Flambino
3

PHP, 285 Bytes

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

Ausgänge:

Probieren Sie den Regenbogen!

Bobbel
quelle
1
Nette Anstrengung. Beachten Sie jedoch, dass das Schließen des PHP-Tags am Ende der Datei eine schlechte Angewohnheit ist, auch wenn Sie nicht Golf spielen. Es wäre kürzer als CLI-Skript, so dass Sie diesen header()Aufruf und sogar das öffnende PHP-Tag sparen können. Unter Linux ist es am einfachsten, 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);' | displayvon der Eingabeaufforderung aus zu starten und als 227 Zeichen zu zählen. (Mit PHP 5.6.11.)
Manatwork
3

Bash + ImageMagick, 159 125 Zeichen

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

Beispielausgabe:

Regenbogen von Bash + ImageMagick

Mann bei der Arbeit
quelle
3

Verarbeitung, 196 186 181 179 169 163 Bytes

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

Regenbogen

Dank Kritixi Lithos 10 Bytes gespeichert
... und dank dzaima weitere 6 Bytes

Flambino
quelle
2
Kann ein weiteres Byte durch Ändern for(int i=0;i<8;i++)in for(int i=0;i++<8;)oder ähnlichem
abschneiden
Ich glaube nicht, dass Sie beim Aufrufen Variablen verwenden könnensize()
Kritixi Lithos
@KritixiLithos Was meinst du?
Flambino
Wenn ich size mit Variablen als Parameter
aufrufe, erhalte
background(-1)ist ein Byte kürzer als background(255), und Sie können das ändern 255in Array czu -1sparen einen weiteren Byte
Kritixi Lithos
2

R 184 170 Bytes

Das Erstellen eines Bildes mit festen Pixelabmessungen gestaltet sich mit R, dessen Plotfunktionen hauptsächlich für Statistiker gedacht sind, überraschend schwierig. Insbesondere lässt R zusätzlichen Platz für Beschriftungen und Koordinatenachsen, es sei denn, Sie legen die Ränder durch Aufrufen explizit als Breite Null festpar .

Andererseits befinden sich einige der erforderlichen Farben (insbesondere Rot, Gelb und Blau) in der Standardpalette und können einfach durch Ganzzahlindizes referenziert werden.

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

Forth Salon Haiku (184 Bytes)

Ich kann die Dimensionseinschränkungen mit diesem Format nicht erfüllen, aber ich dachte, es lohnt sich trotzdem, sie zu teilen.

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

Bildbeschreibung hier eingeben

Boomlinde
quelle
2

Excel VBA, 213 202 196 192 172 Bytes

Code

Anonyme VBE-Direktfensterfunktion, die keine Eingabe annimmt und einen Regenbogen als Vektorbild an das Blatt (1) -Objekt ausgibt

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

Unterprogrammversion

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 Bytes zum Entfernen .Adjustments(3)=3/80 Anrufs und Hinzufügen eines achten weißen Bogens

-6 Bytes für die Verwendung -1 über&HFFFFFF

-3 Bytes für die Verwendung Sheet1 überSheets(1)

-6 Bytes zum Konvertieren with Anweisung zu setAnweisung

-14 Bytes zum Konvertieren von Sub in anonyme VBE-Funktion

Ausgabe

Bilder oder es ist nicht passiert

Taylor Scott
quelle
1

DIV Games Studio (184 Byte)

Nicht die kürzeste, aber ganz einfach. Verwendet die DIV-Standardpalette

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

Regenbogen im div Spielstudio

Erläuterung

Programmstart definieren (platzsparend "r" genannt)

PROGRAM r;

Setup-Palette suchen

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

Programmcode BEGINNEN

BEGIN

Stellen Sie den Videomodus auf 400.200 ein

set_mode(400200);

Schleife x (vordefinierte Variable) von -80 (welcher BG-Hack) bis 80 (7 Farben + weiße Mitte)

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

Definieren Sie Elipse-Constraints

y=399-x;

elipse zeichnen - zeichnet in der ersten Iteration einen Kreis, der größer als der Bildschirm ist, in Vollweiß (Index -8)

Zeichnen (Typ (5 = gefüllte Elipse), Farbe, Deckkraft, x0, y0, x1, y1)

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

Sobald dies geschehen ist, drücken Sie x auf Null, um mit dem Zeichnen des roten Bandes zu beginnen

x+=70*(x<0);

Ende für Schleife

END

Endlosschleife, Zeichenbildschirm.

LOOP;FRAME;END

end (entspricht BEGIN am Anfang des Programms)

END
MikeDX
quelle
1

Perl, 175 + 1 = 176 Bytes

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'

Bildbeschreibung hier eingeben

Steve
quelle
1

PHP, 190 Bytes

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

Führen Sie es so aus:

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

Ergebnisbild 1

Funktioniert theoretisch auch mit 179 Bytes (aber das Bild sieht ein bisschen durcheinander aus, schlechter 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

Ergebnisbild 2

Auch kein perfektes Bild, aber viel besser als das obige (und @ 166 Bytes):

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

Ergebnisbild 3

aross
quelle