ユニオンジャックを描く


8

序文

「ドローxフラグ」のチャレンジはたくさんありますが、検索すると、ユニオンジャックをドローするチャレンジはありません。これは描くのが難しい旗だと思いますが、それでも可能だと思います。

チャレンジ

ユニオンジャックを描画します。自由に利用できるグラフィックファイル形式でファイルに出力したり、画面に描画したりできます。

寸法は以下のとおりとします。最小サイズ600x300ピクセル(または言語がスケーラブルグラフィックのみをサポートする場合は単位)最大エラー1ピクセル。

色は、言語またはそのドキュメントで定義されている赤、白、青、またはWikipediaページごとの#CC0000、#FFFFFF、および#003399 です。

ここに画像の説明を入力してください



11
多くの「x旗を引く」の課題があり、それを検索すると、何を引くかに関する問題はないことが判明しました。このフラグは何を持っているので、これを描くことは、既存のすべてのグラフィック出力の質問とは根本的に異なる課題になりますか?
Peter Taylor

1
これはアイスランドの旗の挑戦によく似ていますが、私はこれが斜めのストライプの構築に特別なひねりを持っていることを発見しました。それらは回転対称性を持っていますが、正確な反射対称性を持たないので、複雑さに追加のレイヤーを追加します。アイスランドの旗の戦略のほとんどは、これを取得するための単純な変換ではありません。
GuitarPicker 2016

ポルトガルの旗よりも難しくありません!
sergiol 2017

回答:


8

BBC BASIC

リビジョンB、234バイト

1つの白と1つの赤十字を描く代わりに、徐々に背景が狭くなる100個の十字を描き、60の座標で白の背景から赤の前景に切り替えます。

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.

http://www.bbcbasic.co.uk/bbcwin/bbcwin.htmlから無料で通訳をダウンロード

完全にゴルフ、249バイト

1バイトのVDUコードは、たとえば25,02バイトのリトルエンディアンなどに結合され25;、一般的な値の定数を最大限に使用します。短縮形に圧縮されたキーワード。例:FOR=> F.(インタプリタは自動的に展開されます。)

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;

半ゴルフ

生のVDUコード。BBC BASICでは、文字をVDUコントローラーに送信できますVDU65(Aを出力します)。グラフィック用のBBCに固有の特定の特殊文字があります。これらの後には、座標などを指定する他のいくつかのバイトが続く必要があります。ここでは、PLOT=> VDU25GCOL=> VDU18ORIGIN=> を使用しています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

まず、対角部分の半分を描画します。2つの青い三角形と2つの赤い平行四辺形です。次に、スケールを-1から+1に変更し、残りの半分を描画します。最後に、水平部分と垂直部分を上に描画します。2つの白い長方形が白い十字を形成し、次に2つの赤い長方形を描画します。ループの最初の反復後の画像と最終的な画像を以下に示します。

ここに画像の説明を入力してください

ゴルフではないコード

BBCベーシックは、グラフィックカーソルの最後の2つの位置を記憶しています。PLOT81は、指定された新しい座標とこれらの最後の2つの位置の間に三角形を描画します。PLOT113とPLOT117は、同様の方法で平行四辺形を描画します。平行四辺形の3つの角は、周囲に沿って見つかる順序で指定する必要があります。PLOTコードの最後の3ビットは、指定された座標が絶対座標か相対座標か、および前景色と背景色のどちらを使用するかを定義します。より重要なビットは、描画される形状のタイプ(点、線、三角形、平行四辺形、長方形など)を定義します。

  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)

6
タスクの正しい言語(名前):
Luis Mendo

3

SVG、298バイト

スコアは、明確にするために追加された3つの不要な改行を除外しています。

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

Sirenの削除された回答(特に、</svg>ドキュメントの最後での省略によるバイト数の節約)に触発されて、寸法的に正しく、わずかに短いSVGを思いつきました。

これは、対角部分の青いパスと赤いパス(塗りつぶされた、ストロークなし)と、最後のクロスの赤いパス(塗りつぶされた、20単位の白い境界線)で構成されます。白い境界線の厚さのため、十字の指定された寸法は、必要な寸法を全周10超える必要があります。

これは、Microsoft IEとEdgeでうまく機能します。Chromeで「ドキュメントの最後に追加のコンテンツ」という警告が表示されることがあります。

これが、ファイナルクロスがない場合とある場合の表示方法です。青のパスを説明するには8ポイント、赤のパスを説明するには10ポイント、最終クロスには12ポイントが必要です。最初の2つのパス内の直線の交点を指定する必要はありません。

ここに画像の説明を入力してください


SVGはプログラミング言語ではなく画像フォーマットです
Mego

2
@Megoこのサイトにはかなりの数のSVGサブミッションがあります。ループの利点なしでそれを行うことは実際にはより困難です。多分私はここで偉大なピーター・テイラーによって使われた次の議論を適用するべきです:codegolf.stackexchange.com/questions/19050/…私はPHPを知らないのでそうすることをためらっていました: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

ロゴ、260 239バイト

(XLogoインタープリター)

私はJavaベースのXLogoインタープリターを使用しました。これは、出力ウィンドウサイズの設定をサポートする数少ないLogo実装の1つだったからです。

XLogoエディターは通常、呼び出されることを意図したプロシージャーとしてファイルを保存します。このプログラムは、代わりにイミディエイトウィンドウに貼り付けられるように作成されています。これにより約9バイト節約できます。

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

正確な色は必要なかったので、組み込みの色番号を使用して数バイトを節約するようにこれをやり直しました。正確なRGBカラーのバージョンを表示する場合は、リビジョンを確認してください。また、三角法の計算をより短い同等のものに置き換えました。

ユニオンジャックフラグ出力

コメントなしでゴルフ

ここで唯一の真のトリックは、ループの2番目のパスの色を変更wrapすることと、非常に少ない労力で横縞を描くことができる機能を利用することです。旗の高さと幅はどちらも600の係数なので、縦または横の縞模様を600進めて、再び中央に戻ることができます。これにより、縦棒を2倍に描画する場合でも、ケースごとに別々のケースを持つことを回避できます。クロックサイクルではなく、コードスペースを節約しています。

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

1

処理、312バイト

これは、処理がかなり効率的であるタイプのパズルです。

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

結果:

ここに画像の説明を入力してください


0

Python 2、265バイト

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)

バイナリPPMとして出力、使用法:

python golf_unionjack.py > unionjack.ppm

L対角部分の垂直スライスを表し、F(一種の)対称性を使用してコードを保存し、上部と下部のインデックスを計算します。


0

追記(166バイト)

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

トークン化されていないバージョン:

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

出力:

ここに画像の説明を入力してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.