Gambar Union Jack

8

Kata pengantar

Ada banyak tantangan "menggambar x bendera", dan setelah mencari ternyata tidak ada tantangan untuk menarik serikat Jack! Saya merasa ini akan menjadi bendera yang lebih sulit untuk dilukis, tetapi itu masih mungkin dilakukan.

Tantangan

Gambar Union Jack. Ini dapat di-output ke file dalam format file grafik apa pun yang tersedia secara bebas atau ditarik ke layar.

  • Aturan Golf berlaku, kode terpendek dalam byte menang.
  • Celah standar berlaku.
  • Tidak ada bawaan untuk menggambar bendera diizinkan.

Dimensi harus seperti di bawah ini. Ukuran minimum 600x300 piksel (atau unit jika bahasa Anda hanya mendukung grafik yang dapat diskalakan). Kesalahan maksimum 1 piksel.

Warna harus merah, putih dan biru seperti yang didefinisikan oleh bahasa Anda atau dokumentasinya, atau # CC0000, #FFFFFF dan # 003399 per halaman Wikipedia.

masukkan deskripsi gambar di sini

Shaun Wild
sumber
11
" Ada banyak tantangan" draw x flag ", dan setelah mencari ternyata tidak ada tantangan untuk menggambar " bisa diikuti oleh ribuan bendera nasional, organisasi, negara, dll. Apa yang dimiliki bendera ini yang menjadikan menggambarnya tantangan yang secara fundamental berbeda dari semua pertanyaan grafis-output yang ada ?
Peter Taylor
1
Ini sangat mirip dengan tantangan bendera Islandia, tetapi saya menemukan ini memiliki twist tertentu dalam pembangunan garis-garis diagonal. Karena mereka memiliki simetri rotasi tetapi tidak simetri reflektif yang tepat, itu menambah lapisan tambahan untuk kompleksitas. Sebagian besar strategi untuk bendera Islandia tidak akan menjadi konversi sederhana untuk mendapatkan yang satu ini.
GuitarPicker
Tidak lebih keras dari bendera Portugis!
sergiol

Jawaban:

8

BBC BASIC

Rev B, 234 byte

Alih-alih menggambar satu salib putih dan merah, kami menggambar 100 salib yang semakin sempit, beralih dari latar belakang putih ke latar depan merah pada koordinat 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.

Unduh juru bahasa gratis di http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

Sepenuhnya golf, 249 byte

Kode VDU byte tunggal misalnya 25,0digabungkan menjadi endian kecil misalnya byte ganda 25;dan penggunaan konstanta maksimum untuk nilai-nilai umum. Kata kunci dikompresi ke bentuk disingkat, mis FOR= = F.(penerjemah berkembang secara otomatis.)

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;

Semigolf

Kode VDU mentah. Dalam BBC BASIC, karakter dapat dikirim ke pengontrol VDU seperti VDU65(mencetak A.). Ada karakter khusus khusus untuk BBC untuk grafis. Ini harus diikuti oleh beberapa byte lain untuk menentukan koordinat, dll. Di sini kita menggunakan 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

Pertama kita menggambar setengah bagian diagonal: 2 segitiga biru dan 2 genjang merah. Kemudian kita mengubah skala dari -1 ke +1 dan menggambar setengah lainnya. Akhirnya kita menggambar bagian horisontal dan vertikal di atas: 2 persegi panjang putih untuk membentuk salib putih, lalu 2 persegi panjang merah. Gambar setelah iterasi pertama loop ditunjukkan di bawah ini, bersama dengan gambar akhir.

masukkan deskripsi gambar di sini

Kode tidak dikunci

BBC basic mengingat 2 lokasi terakhir kursor grafik. PLOT81 menggambar segitiga di antara koordinat baru yang ditentukan dan dua lokasi terakhir ini. PLOT113 dan PLOT117 menggambar sebuah jajaran genjang dengan cara yang sama: tiga sudut jajaran genjang harus diberikan dalam urutan mereka ditemukan keliling perimeter. Tiga bit terakhir dari kode PLOT menentukan apakah koordinat yang diberikan adalah absolut atau relatif, dan apakah warna foreground atau background digunakan. Bit yang lebih signifikan menentukan jenis bentuk apa yang digambar (titik, garis, segitiga, jajaran genjang, persegi panjang, dll.)

  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
sumber
6
Bahasa (nama) yang tepat untuk tugas :-D
Luis Mendo
3

SVG, 298 byte

skor mengecualikan 3 baris baru yang tidak perlu ditambahkan untuk kejelasan.

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

Terinspirasi oleh jawaban Siren yang terhapus (dan khususnya penghematan dalam byte dari menghilangkan </svg>di akhir dokumen), saya datang dengan SVG yang baik secara dimensi benar dan sedikit lebih pendek.

Ini terdiri dari jalur biru dan jalur merah (diisi, tanpa guratan) untuk bagian diagonal dan jalur merah (diisi, dengan 20 unit batas putih) untuk palang terakhir. Karena ketebalan batas putih, dimensi salib yang ditentukan harus melebihi dimensi yang dibutuhkan sebanyak 10 di sekelilingnya.

Ini berfungsi baik untuk saya di Microsoft IE dan Edge. Terkadang menampilkan peringatan "konten tambahan di akhir dokumen" di Chrome.

Begini tampilannya tanpa dan dengan salib terakhir. Diperlukan 8 poin untuk menggambarkan jalur biru, 10 poin untuk menggambarkan jalur merah, dan 12 poin untuk persilangan akhir. Perpotongan garis lurus dalam dua jalur pertama tidak harus diberikan.

masukkan deskripsi gambar di sini

Level River St
sumber
SVG adalah format gambar, bukan bahasa pemrograman
Mego
2
@Mego ada beberapa kiriman SVG di situs ini. Sebenarnya lebih sulit untuk melakukannya tanpa memanfaatkan loop. Mungkin saya harus menerapkan argumen berikut seperti yang digunakan oleh Peter Taylor yang hebat di sini: codegolf.stackexchange.com/questions/19050/... meskipun saya enggan melakukannya karena saya tidak tahu 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

Logo, 260 239 byte

(Juru Bahasa XLogo)

Saya menggunakan interpreter XLogo berbasis Java karena merupakan salah satu dari beberapa implementasi Logo yang saya temukan yang mendukung pengaturan ukuran jendela output.

Editor XLogo biasanya menyimpan file sebagai prosedur yang dimaksudkan untuk dipanggil. Program ini ditulis untuk ditempelkan ke jendela langsung sebagai gantinya. Ini menghemat sekitar 9 byte.

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

Karena warna yang tepat tidak diperlukan, saya menggunakan kembali ini untuk menggunakan nomor warna bawaan yang menghemat beberapa byte. Jika Anda ingin melihat versi dengan warna RGB yang tepat, periksa revisi. Saya juga mengganti perhitungan trigonometri dengan padanan yang lebih pendek.

Output bendera Union Jack

Tidak dikoleksi dengan komentar

Satu-satunya tipuan nyata di sini adalah mengubah warna untuk lintasan kedua loop, dan memanfaatkan wrapfitur yang memungkinkan kita menggambar garis-garis horizontal dengan sedikit usaha. Karena tinggi dan lebar bendera adalah keduanya faktor 600, kita dapat maju 600 untuk garis-garis vertikal atau horizontal dan berakhir kembali di tengah lagi. Ini menghindari kasus terpisah untuk masing-masing, bahkan jika itu menggambar bar vertikal dua kali lebih sering. Kami menghemat ruang kode, bukan siklus-jam.

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

Memproses, 312 byte

Ini adalah jenis puzzle di mana Pemrosesan cukup efisien.

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

Hasil dalam:

masukkan deskripsi gambar di sini

6infinity8
sumber
0

Python 2, 265 byte

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)

Output sebagai PPM biner, penggunaan:

python golf_unionjack.py > unionjack.ppm

Lmewakili irisan vertikal dari bagian diagonal dan Fmenggunakan (semacam) simetri untuk menyimpan kode dan menghitung indeks untuk bagian atas dan bawah.

Karl Napf
sumber
0

Postscript (166 byte)

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

Versi non-tokenized:

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

Keluaran:

masukkan deskripsi gambar di sini

angsa121
sumber