Zeichne den Union Jack

8

Vorwort

Es gibt viele "Draw X Flag" -Herausforderungen, und beim Suchen stellt sich heraus, dass es keine Herausforderungen gibt, den Union Jack zu zeichnen! Ich denke, es wäre schwieriger, diese Flagge zu ziehen, aber es sollte trotzdem möglich sein.

Herausforderung

Zeichne den Union Jack. Es kann in einer Datei in einem beliebigen frei verfügbaren Grafikdateiformat ausgegeben oder auf den Bildschirm gezeichnet werden.

  • Es gelten die Regeln für den Code Golf. Der kürzeste Code in Bytes gewinnt.
  • Es gelten Standardlücken.
  • Keine eingebauten Funktionen zum Zeichnen von Flaggen zulässig.

Die Abmessungen müssen wie folgt sein. Minimale Größe 600 x 300 Pixel (oder Einheiten, wenn Ihre Sprache nur skalierbare Grafiken unterstützt.) Maximaler Fehler 1 Pixel.

Die Farben müssen rot, weiß und blau sein, wie in Ihrer Sprache oder deren Dokumentation definiert, oder # CC0000, #FFFFFF und # 003399 pro Wikipedia-Seite.

Geben Sie hier die Bildbeschreibung ein

Shaun Wild
quelle
11
" Es gibt viele" Draw x Flag "-Herausforderungen, und beim Suchen stellt sich heraus, dass es keine Herausforderungen gibt, die zu zeichnen sind. " Es können Tausende von nationalen, organisatorischen, staatlichen usw. Flaggen folgen. Was hat diese Flagge, was das Zeichnen zu einer grundlegend anderen Herausforderung macht als alle vorhandenen Fragen zur grafischen Ausgabe ?
Peter Taylor
1
Dies ist der Herausforderung der isländischen Flagge sehr ähnlich, aber ich finde, dass diese eine besondere Wendung in der Konstruktion der diagonalen Streifen hat. Da sie Rotationssymmetrie, aber keine exakte Reflexionssymmetrie aufweisen, wird der Komplexität eine zusätzliche Schicht hinzugefügt. Die meisten Strategien für die isländische Flagge wären keine einfache Konvertierung, um diese zu erhalten.
GuitarPicker
Nicht schwerer als die portugiesische Flagge!
Sergiol

Antworten:

8

BBC BASIC

Rev. B, 234 Bytes

Anstatt ein weißes und ein rotes Kreuz zu zeichnen, zeichnen wir 100 zunehmend schmalere Kreuze und wechseln mit einer Koordinate von 60 vom weißen Hintergrund zum roten Vordergrund.

p=20761m=1049w=600h=300F.i=-1TO1V.29,w;h;18;4,m;134*i;0;m;w*i;-233;p;0;466;m;0;67*i;m;-466;h*i;p;932;0;18;1,m;511*i;h*i;25;89*i;0;29977;0;0;m;w*i;-h*i;28953;0;45*i;
N.F.c=-100TO0q=25881-c DIV60*512V.m;-c;-h;q;c;h;m;-w;-c;q;w;c;
N.

Laden Sie den Dolmetscher kostenlos unter http://www.bbcbasic.co.uk/bbcwin/bbcwin.html herunter

Voll Golf, 249 Bytes

Einzelbyte-Bildschirmcodes, z. B. 25,0kombiniert zu Doppelbyte-Little-Endian- Codes, z. B. 25;maximale Verwendung von Konstanten für gemeinsame Werte. In abgekürzte Form komprimierte Schlüsselwörter, z. B. FOR=> F.(Interpreter wird automatisch erweitert.)

p=20761q=26393r=25881m=1049c=100w=600h=300F.i=-1TO1V.29,w;h;18;4,m;134*i;0;m;w*i;-233;p;0;466;m;0;67*i;m;-466;h*i;p;932;0;18;1,m;511*i;h*i;25;89*i;0;29977;0;0;m;w*i;-h*i;28953;0;45*i;
N.V.m;-c;-h;q;c;h;2m;-w;-c;q;w;c;m;-60;-h;r;60;h;m;-w;-60;r;w;60;

Semigolfed

Rohe Bildschirmcodes. In BBC BASIC können Zeichen wie VDU65(druckt ein A) an den Bildschirmcontroller gesendet werden. Für Grafiken gibt es bestimmte Sonderzeichen, die für die BBC spezifisch sind. Darauf müssen mehrere andere Bytes folgen, um Koordinaten usw. anzugeben. Hier verwenden wir PLOT=> VDU25, GCOL=> VDU18, ORIGIN=> VDU29.

  c=100w=600h=300                                      :REM constants 100,width,height
  FORi=-1TO1                                           :REM loop -1 and 1 (0 draws nothing)
    VDU29,w;h;                                         :REM set origin (bring inside loop for golfing reasons)
    VDU18;4                                            :REM change to blue and draw triangles
    VDU25,4,134*i;0;25,4,w*i;-233;25,81,0;466;25,4,0;67*i;25,4,-466;h*i;25,81,932;0;
    VDU18;1                                            :REM change to red and draw parallelograms
    VDU25,4,511*i;h*i;25,0,89*i;0;25,117,0;0;25,4,w*i;-h*i;25,113,0;45*i;
  NEXT
  VDU25,4,-c;-h;25,103,c;h;25,4,-w;-c;25,103,w;c;      :REM draw white background rectangles
  VDU25,4,-60;-h;25,101,60;h;25,4,-w;-60;25,101,w;60;  :REM draw red foreground rectangles

Zuerst zeichnen wir die Hälfte der diagonalen Teile: 2 blaue Dreiecke und 2 rote Parallelogramme. Dann ändern wir die Skala von -1 auf +1 und zeichnen die andere Hälfte. Schließlich zeichnen wir die horizontalen und vertikalen Teile oben: 2 weiße Rechtecke, um ein weißes Kreuz zu bilden, dann 2 rote Rechtecke. Das Bild nach der ersten Iteration der Schleife wird unten zusammen mit dem endgültigen Bild gezeigt.

Geben Sie hier die Bildbeschreibung ein

Ungolfed Code

BBC Basic merkt sich die letzten beiden Stellen des Grafikcursors. PLOT81 zeichnet ein Dreieck zwischen den neuen angegebenen Koordinaten und diesen beiden letzten Positionen. PLOT113 und PLOT117 zeichnen ein Parallelogramm auf ähnliche Weise: Drei Ecken des Parallelogramms müssen in der Reihenfolge angegeben werden, in der sie sich um den Umfang befinden. Die letzten drei Bits des PLOT-Codes definieren, ob die angegebenen Koordinaten absolut oder relativ sind und ob Vordergrund- oder Hintergrundfarbe verwendet wird. Die signifikanteren Bits definieren, welche Art von Form gezeichnet wird (Punkt, Linie, Dreieck, Parallelogramm, Rechteck usw.).

  ORIGIN600,300       :REM move the origin (which will be centre of flag) away from the corner of the screen.

  FORi=-1TO1          :REM at scales of -1 and 1, plot half each of the diagonal parts (i=0 plots nothing).
    GCOL0,4             :REM blue foreground colour
    PLOT4,134*i,0       :REM absolute move to peak of upper/lower triangle
    PLOT4,600*i,-233    :REM absolute move to left hand corner
    PLOT81,0,466        :REM relative move to right hand corner, plotting triangle

    PLOT4,0,67*i        :REM absolute move to peak of left/right triangle
    PLOT4,-466,300*i    :REM absolute move to lower corner
    PLOT81,932,0        :REM relative move to upper corner, plotting triangle

    GCOL0,1             :REM red foreground colour
    PLOT4,511*i,300*i   :REM absolute move to long edge of flag
    PLOT0,89*i,0        :REM relative move to corner of flag (top right / bottom left)
    PLOT117,0,0         :REM absolute move to centre of flag, plotting parallelogram (stripe)
    PLOT4,600*i,-300*i  :REM absolute move to corner of flag (bottom right / top left)
    PLOT113,0,45*i      :REM relative move to short edge of flag, plotting parallelogram (stripe)
  NEXT                :REM diagonal parts completed, now plot vertical/horizontal parts on top.

  PLOT4,-100,-300     :REM move to bottom left of vertical white stripe
  PLOT103,100,300     :REM move to top right corner, plot it in background colour (white)
  PLOT4,-600,-100     :REM move to bottom left corner of horizontal white stripe
  PLOT103,600,100     :REM move to top right corner, plot it in background colour (white)

  PLOT4,-60,-300      :REM move to bottom left of vertical red stripe
  PLOT101,60,300      :REM move to top right corner, plot it in foreground colour (red)
  PLOT4,-600,-60      :REM move to bottom left corner of horizontal red stripe
  PLOT101,600,60      :REM move to top right corner, plot it in foreground colour (red)
Level River St.
quelle
6
Die richtige Sprache (Name) für die Aufgabe :-D
Luis Mendo
3

SVG, 298 Bytes

Die Punktzahl schließt 3 unnötige Zeilenumbrüche aus Gründen der Übersichtlichkeit aus.

<svg xmlns="http://www.w3.org/2000/svg">
<path d="M67,0h466L0,267v-234L533,300h-466L600,33v232z" fill="blue"/>
<path d="M0,0v22L300,172L45,300h-45L600,0h-45L300,128L600,278v22z" fill="red"/>
<path d="M-10,110h270v-120h80v120h270v80h-270v120h-80v-120h-270z" fill="red" stroke="#fff" stroke-width="20"/>

Inspiriert von der gelöschten Antwort von Siren (und insbesondere der Einsparung von Bytes durch Auslassen </svg>am Ende des Dokuments) habe ich eine SVG entwickelt, die sowohl dimensional korrekt als auch etwas kürzer ist.

Es besteht aus einem blauen Pfad und einem roten Pfad (gefüllt, ohne Striche) für die diagonalen Teile und einem roten Pfad (gefüllt, mit 20 Einheiten weißem Rand) für das endgültige Kreuz. Aufgrund der Dicke des weißen Randes müssen die angegebenen Abmessungen des Kreuzes die erforderlichen Abmessungen ringsum um 10 überschreiten.

Dies funktioniert gut für mich in Microsoft IE und Edge. Manchmal wird in Chrome die Warnung "Zusätzlicher Inhalt am Ende des Dokuments" angezeigt.

So sieht es ohne und mit dem letzten Kreuz aus. 8 Punkte sind erforderlich, um den blauen Pfad zu beschreiben, 10 Punkte, um den roten Pfad zu beschreiben, und 12 Punkte für das endgültige Kreuz. Die Schnittpunkte von Geraden innerhalb der ersten beiden Pfade müssen nicht angegeben werden.

Geben Sie hier die Bildbeschreibung ein

Level River St.
quelle
SVG ist ein Bildformat, keine Programmiersprache
Mego
2
@ Mego Es gibt einige SVG-Beiträge auf dieser Seite. Es ist tatsächlich schwieriger, dies ohne die Vorteile von Schleifen zu tun. Vielleicht sollte ich das folgende Argument anwenden, wie es der große Peter Taylor hier verwendet: codegolf.stackexchange.com/questions/19050/… obwohl ich dies nicht wollte, da ich PHP nicht kenne:PS If anyone wants to argue that SVG isn't a programming language (and I'd be very inclined to agree), consider this a PHP program in the style of many PHP submissions to this site which just echo literal text.
Level River St
1

Logo, 260 239 Bytes

(XLogo Interpreter)

Ich habe den Java-basierten XLogo-Interpreter verwendet, da er eine der wenigen Logo-Implementierungen war, die ich finden konnte und die das Einstellen der Ausgabefenstergröße unterstützt.

Der XLogo-Editor speichert normalerweise Dateien als Prozeduren, die aufgerufen werden sollen. Dieses Programm wurde geschrieben, um stattdessen in das unmittelbare Fenster eingefügt zu werden. Dies spart etwa 9 Bytes.

window setscreensize[600 300]setsc 4 lt atan 2 repeat 2[repeat 2[setpc 7 setpw 60 fd 400 setpw 20 lt 90 fd 10 lt 90 setpc 1 fd 400 lt 90 fd 10 rt 90]lt asin .8]home wrap setpw 100 setpc 7 repeat 2[repeat 2[fd 600 lt 90]setpw 60 setpc 1] ht

Da keine genauen Farben erforderlich waren, habe ich dies neu definiert, um integrierte Farbnummern zu verwenden, die mehrere Bytes sparten. Wenn Sie eine Version mit exakten RGB-Farben sehen möchten, überprüfen Sie die Revisionen. Ich habe auch eine trigonometrische Berechnung durch ein kürzeres Äquivalent ersetzt.

Union Jack Flag Ausgabe

Ungolfed mit Kommentar

Der einzige wirkliche Trick besteht darin, die Farben für den zweiten Durchgang einer Schleife zu ändern und die Funktion zu nutzen, mit der wrapwir die horizontalen Streifen mit sehr geringem Aufwand zeichnen können. Da die Höhe und Breite der Flagge beide Faktoren von 600 sind, können wir 600 entweder für vertikale oder horizontale Streifen vorwärts gehen und wieder in der Mitte landen. Dies vermeidet separate Fälle für jeden Fall, selbst wenn der vertikale Balken doppelt so oft gezeichnet wird. Wir sparen Code-Platz, keine Taktzyklen.

to UnionJack
  #Initialize the screen
  window  #Allow the turtle to overshoot the boundary without reappearing on the opposite side
  setscreensize[600 300]
  setsc 4  #blue background

  lt atan 2 #Turn left, preparing to draw first diagonal
  repeat 2 [ #Draw 2 sets of main diagonal bars
    repeat 2 [ #Each main bar is made of 2 spokes
      setpc 7 setpw 60 #Use a wide white pen
      fd 400 #Draw past the corner of the window
      setpw 20 #Make the pen narrow
      lt 90 fd 10 lt 90 #Do a 10px U-turn
      setpc 1 #Switch to a red pen
      fd 400 #Draw back to the center.
      lt 90 fd 10 rt 90 #Do a 10 px S curve back to center, ready to draw the opposite spoke
    ] #Finish spoke
    lt asin .8 #Turn for the next bar.
  ] #Finish bar
  home #Return to a sane heading
  wrap #Makes the turtle wrap to the opposite side if it overshoots the boundary
  setpw 100 setpc 7 #Wide white pen
  repeat 2 [ #Draw 2 crosses
    repeat 2 [ #Each cross has 2 stripes
      fd 600 #Overshoot the boundary so that we end up where we started at the center, leaving a stripe behind
      lt 90 #Rotate to draw the next stripe
    ] #Finish the stripe
    setpw 60 setpc 1 #Change to a narrow red pen
  ] #Finish cross
  ht #Hide the turtle
end
GuitarPicker
quelle
1

Verarbeitung, 312 Bytes

Dies ist die Art von Puzzle, bei der die Verarbeitung ziemlich effizient ist.

int a=300,b=2*a,c=255,d=100;size(b,a);background(0,51,153);stroke(c);strokeWeight(60);line(0,a,b,0);line(0,0,b,a);stroke(c,0,0);strokeWeight(20);line(0,310,a,160);line(-22,0,a,160);line(a,139,b,-12);line(a,139,624,a);noStroke();fill(c);rect(250,0,d,b);rect(0,d,b,d);fill(c,0,0);rect(270,0,60,b);rect(0,120,b,60);

Ergebnisse in:

Geben Sie hier die Bildbeschreibung ein

6infinity8
quelle
0

Python 2, 265 Bytes

r="D\0\0"
b="\0\x173"
w="U"*3
N=20*(270*w+60*r+270*w)
L=190*[b]+60*[w]+40*[r]+20*[w]+190*[b]
j=''.join
F=lambda p:j([j(L[150-p*100+i:150+p*150+i:p])+20*w+60*r+20*w+j(L[345-p*145-i:345+p*105-i:p])for i in range(0,200,2)])
print"P6 600 300 85 "+F(-1)+N+36000*r+N+F(1)

Ausgabe als binäres PPM, Verwendung:

python golf_unionjack.py > unionjack.ppm

Lstellt eine vertikale Schicht der diagonalen Teile dar und Fverwendet die (Art) Symmetrie, um Code zu speichern und die Indizes für den oberen und unteren Teil zu berechnen.

Karl Napf
quelle
0

Postscript (166 Bytes)

00000000: 880a 880a 928b 3020 3092 6b30 881e 9263  ......0 0.k0...c
00000010: 883c 3330 9263 883c 3092 6392 1692 142f  .<30.c.<0.c..../
00000020: 727b 2e38 8800 3092 9d7d 9233 2f77 7b31  r{.8..0..}.3/w{1
00000030: 8801 3192 9d7d 9233 924e 3220 3192 8b30  ..1..}.3.N2 1..0
00000040: 202e 3220 2e36 929d 3020 3088 1e33 3092   .2 .6..0 0..30.
00000050: 8088 0f31 3592 ad34 3592 8834 7b77 2030  ...15..45..4{w 0
00000060: 88fd 881e 3692 8072 8800 3088 1e32 9280  ....6..r..0..2..
00000070: 3930 9288 7d92 8392 4d88 1e31 3592 ad32  90..}...M..15..2
00000080: 7b77 88fb 88e2 880a 3630 9280 3930 9288  {w......60..90..
00000090: 7d92 8332 7b72 88fd 88e2 3688 3c92 8039  }..2{r....6.<..9
000000a0: 3092 887d 9283                           0..}..

Nicht tokenisierte Version:

10 10 scale
0 0 moveto
0 30 lineto
60 30 lineto
60 0 lineto
closepath
clip
/r {.8 0 0 setrgbcolor} def
/w {1 1 1 setrgbcolor} def
gsave
2 1 scale
0 .2 .6 setrgbcolor
0 0 30 30 rectfill
15 15 translate
45 rotate
4 {w 0 -3 30 6 rectfill r 0 0 30 2 rectfill 90 rotate} repeat
grestore
30 15 translate
2 {
w
-5 -30 10 60 rectfill
90 rotate
} repeat
2 {
r
-3 -30 6 60 rectfill
90 rotate
} repeat

Ausgabe:

Geben Sie hier die Bildbeschreibung ein

goose121
quelle