Vẽ cờ Hàn Quốc


58

Khi tôi vấp phải câu hỏi này, tôi nhớ rằng tôi cũng đã từng thấy các quy tắc chính xác cho việc xây dựng quốc kỳ Hàn Quốc. Và đây là một công trình hoàn toàn khác.

nhập mô tả hình ảnh ở đây

Nguồn: Wikipedia

Vì vậy, bây giờ bạn sẽ vẽ một công trình chính xác của cái này!

Đặc điểm kỹ thuật

Bạn có thể kết xuất cờ thành tập tin hoặc màn hình bằng đồ họa vector hoặc raster. Nếu đầu ra của bạn được rasterized, hình ảnh của bạn phải có kích thước 450x300 pixel trở lên.

Tất cả các tỷ lệ chiều dài và vị trí cần phải chính xác như được hiển thị trong sơ đồ sau:

nhập mô tả hình ảnh ở đây

Nguồn: Wikipedia

Lưu ý rằng tâm của hai vòng tròn nhỏ thẳng hàng với đường chéo.

Đối với màu sắc, bạn phải sử dụng bảng màu sau:

  • Trắng: #FFFFFF
  • Đen: # 000000
  • Màu đỏ: # C60C30
  • Màu xanh: # 003478

Không được vẽ ranh giới màu đen trừ khi hệ thống vẽ của bạn không cho phép bạn chỉ định khung vẽ 3: 2 vì lý do kỹ thuật (nếu không, bạn nên sử dụng khung vẽ 3: 2 và cờ sẽ lấp đầy tất cả). Nếu bạn cần thêm ranh giới, nó có thể dày tùy ý - cờ nên được xem xét nghiêm ngặt bên trong ranh giới màu đen. Bất kỳ chỉ số giúp đỡ hoặc chỉ số chiều dài khác không được rút ra. Tức là, cờ sẽ xuất hiện chính xác như trong hình ảnh đầu tiên.

Chấm điểm

Đây là mã golf, vì vậy câu trả lời ngắn nhất (tính bằng byte) sẽ thắng.

Như một lời cảnh báo, sử dụng nén hiện có (như nhúng GIF đã nén) rơi vào một số lỗ hổng tiêu chuẩn .


2
Thật thú vị, cờ Hàn Quốc chứa một hình thức ban đầu của hệ thống số nhị phân ( britton.disted.camosun.bc.ca/jbbinflag.htmlm )
britishtea

Chúng ta có phải vẽ đường viền khi chúng ta đang sử dụng một trang HTML lớn hơn cờ không, có màu trắng không có sự phân tách rõ ràng ngay cả khi kích thước canvas / phần tử tương tự như cờ
Trình tối ưu hóa

@Optimizer, không, nếu khung vẽ được giới hạn theo cách có thể được hiển thị bằng cách nào đó (ví dụ: bằng cách tô sáng "phần tử kiểm tra" của trình duyệt của bạn), thì bạn không cần một ranh giới. Đường viền màu đen chỉ nên được vẽ trong trường hợp hiếm hoi trong đó phạm vi của khung vẽ không thể được xác định về mặt kỹ thuật.
Martin Ender

3
Tôi đang giả sử CountryData["ROK","Flag"]không tính?
wchargein

Câu trả lời:


13

PHP / HTML / SVG, 324

(ngắt dòng được thêm cho mức độ dễ đọc)

<?=gzinflate(base64_decode('tVHBioMwFPyVwF5WSOzLi/tswQjdu9cevIk1KqtriaFd9utrgpSWFva0PPImMwzDkGTz
uWXnvrl8Tj8aOPAUebLNs5Y5W33PZrKjtpOrXPOuVEy7KMiD54mKMY3yrO5tPTTMaonM9MOg32qCWgHb5Nmpch076kIih/2y
PC4jRRCIU6BhbkwGV7lmAagk3d5nCfwQdKByVBwOFLagQu6exZLNzk5fjU+B9S4u/dF1Gh/apRw6Cb83uzHm0S69/cWbSIkx
YfSf5QT6dkk5UoACIeAfXTftepb/za8='));

Dữ liệu nén mở rộng thành cùng dữ liệu SVG như câu trả lời trước đây của tôi được hiển thị bên dưới, nhưng có hai thay đổi để nén trợ giúp:

  1. Hai <use>phần được mở rộng đến nội dung ban đầu của <defs>phần. Điều này làm cho văn bản nguồn dài hơn, nhưng làm giảm entropy để nó nén tốt hơn.

  2. Trong <g>phần tử đầu tiên , tôi đổi transform=translate(36,24)rotate(33.69)thành transform=rotate(33.69)translate(43.27). Điều này có hiệu ứng tương tự về mặt hình học, nhưng nén tốt hơn vì trình tự ><g transform=rotate(bây giờ xuất hiện hai lần.

Theo mặc định, PHP sẽ phục vụ điều này như Content-Type: text/html, vì vậy cú pháp XML không hợp lệ không phải là một vấn đề.

SVG / HTML, 463

Trình phân tích cú pháp HTML không quá ồn ào về cú pháp chính xác, vì vậy chúng ta có thể loại bỏ dấu ngoặc kép trong các tham số miễn là chúng không chứa bất kỳ khoảng trắng nào. Có thể giảm bớt điều này xuống hơn nữa với một chút Javascript.

<svg viewBox=0,0,72,48><defs><path d=M-25-6V6Zm3,0V6m3,0V-6M19-6V6Zm3,0V6m3,0V-6Z stroke=#000
stroke-width=2 id=p /></defs><g transform=translate(36,24)rotate(33.69)><circle r=12 fill=#c60c30
/><path d=M12,0A12,12,0,0,1-12,0A6,6,0,0,0,0,0A6,6,0,0,1,12,0Z fill=#003478 /><use xlink:href=#p
/><path d=M17,0h10z stroke=#fff stroke-width=1 /><g transform=rotate(112.62)><use xlink:href=#p
/><path d=M-27,0h4Zm6,0h4ZM20,0h4Z stroke=#fff stroke-width=1 /></g></g></svg>


44

Python + Pycairo, 371 370 366 byte

Cờ

from cairo import*
p=3.141593
c=Context(SVGSurface("F",12,8))
C=c.set_source_rgb;R=c.rectangle;T=c.rotate;F=c.fill
C(1,1,1);R(0,0,12,8);F()
c.translate(6,4);T(.588);b=3188
for o in[(0,.2,.47),(.77,.05,.19)]*2:C(*o);i=b/2%2;b+=1;c.arc(i,0,2-i,0,p+i*p);F();T(p)
C(0,0,0)
for x in(p,1.966)*2:
 for y in.5,0,1:
    for z in-1,1:R(3+y,-z,1./3,z*(2.75+b%2)/3);F()
    b/=2
 T(x)

Xuất ra một tệp SVG nhỏ có tên F.


C(*[.77,0,.05,.2,.19,.47][i::2])ngắn hơnC(*[(.77,.05,.19),(0,.2,.47)][i%2])
isaacg

Tại sao bạn viết s=SVGSurface("F",12,8);c=Context(s)thay vì chỉ c=Context(SVGSurface("F",12,8))?
Lily Chung

@IstvanChung Điểm tốt.
Ell

32

HTML + CSS, 966 906 843 792 762 byte

Không phải là người chiến thắng bất cứ lúc nào, nhưng rất nhiều bản vẽ thú vị trong CSS. Điều này có thể được đánh golf rất nhiều mặc dù.

CSS, HTML :

*{position:fixed}a{background:linear-gradient(0deg,#003478 50%,#C60C30 50%);width:2in;height:2in;transform:rotate(.6rad);top:1in;left:2in}d,e{width:50%;height:50%;background:#C60C30;left:0;top:25%}a,d,e{border-radius:50%}d{background:#003478;left:50%}b,i{width:1in;height:26em;top:-1em;left:15em;transform:rotate(.98rad)}g,f,k,j{width:1in;height:17%;background:repeating-linear-gradient(0deg,#000,#000 1em,#fff 1em,#fff 1.5em);bottom:0;left:0}g,j,p{top:-.5em}b{transform:rotate(-.98rad)}c,p,v,x{height:2em;width:.5em;background:#fff;transform:rotate(.98rad)}p{top:2.8in;left:28em;transform:rotate(-.98rad) scale(1,4)}x{top:3.9em;left:28.4em}c,v{top:23.8em;transform:none}c{top:3.5em}body{height:4in;width:6in;border:1px solid
<a><d><e></a><b><f><g></b><i><j><k></i><p></p><x><v><c

;border:1px solidchỉ để hiển thị vì <body>thẻ có ranh giới rõ ràng mà Thanh tra hoặc các công cụ tương tự có thể quan sát được, như đã nêu của OP

LƯU Ý Chỉ hoạt động trong Firefox (hoặc Chrome canary / dev) do sử dụng các biến đổi và độ dốc cụ thể của nhà cung cấp.

Xem nó trong hành động


Tôi nghĩ bạn nên bao gồm các thẻ <link> hoặc <style> trong số ký tự của bạn. Bạn có thể lưu một vài ký tự: trong CSS 0deg-> 0(hai lần) và xóa left:0khỏi a:before. Trong HTML bạn có thể sử dụng <p><ul></ul>. ( <p>sẽ hoàn toàn đóng cửa trước đó <ul>)
gronostaj

1
Hoạt động trong Firefox 32. Thất bại một cách ngoạn mục trong Safari 7.1.
200_success

1
Sử dụng LESS hoặc SASS cho CSS, nó sẽ cung cấp cho bạn khá nhiều tùy chọn để rút ngắn nó một chút. Ngoài ra :before{content:''}:after{content:''}dài hơn là chỉ thêm một yếu tố khác (mặc dù điều này thực sự trông tốt hơn).
David Mulder

@DavidMulder Tôi muốn yếu tố thú vị trong việc này hơn là mã ngắn hơn. Mọi người có thể liên quan đến CSS thuần dễ dàng hơn LESS hoặc SASS :)
Trình tối ưu hóa

Hoạt động trong Chrome mới nhất là tốt. @ 200_success Bạn sẽ có thể làm cho nó hoạt động trong Safari bằng cách thêm -webkit-trước tất cả các transform:s, nhưng không cần phải nói rằng điều đó sẽ làm cho nó lâu hơn một chút!
Doorknob

20

BBC Basic, 349 343 ký tự ASCII, kích thước tệp được mã hóa 330

Tải xuống trình giả lập tại http://www.bbcbasic.co.uk/bbcwin/bbcwin.html

  p=1049q=25r=100VDU4118;275;-1,49,3076;19,7,-1;-1;531;255;7693;q;40;0;q,97,1200;800;29,640;400;
  FORa=38TO56STEP0.01x=r*COS(a)y=r*SIN(a)b=a*7DIV44/2IFb=3.5z=y<0ELSEz=x>0
  VDU18;1,p;-x;-y;q,153,r;0;18;2,p;x;y;q,153,r;0;18;0
  IFABS(y)DIV1=56VDUp;x*b+y;y*b-x;q;x/3;y/3;q,113,-2*y;2*x;18;7:b-=0.1VDUp;x*b+y/12;y*b-x/12;q;x/2;y/2;q,112-z,-y/6;x/6;
  NEXT

Sử dụng màu sắc chính xác đã thêm rất nhiều, nhưng việc đánh golf tất cả các lệnh đồ họa xuống mã VDU thô giúp tiết kiệm tổng thể 6 ký tự so với bài viết gốc của tôi. Tất cả đồ họa trên micro BBC được thực hiện thông qua các mã điều khiển ASCII dành riêng cho máy, vì vậy thay vì sử dụng các lệnh đồ họa cấp cao, bạn có thể cung cấp byte trực tiếp cho bộ điều khiển VDU (thường ngắn hơn nhưng rất tốn chi phí để đọc). Một giá trị kết thúc bằng dấu chấm phẩy thay vì dấu phẩy là biểu diễn 16 bit nhỏ cuối cùng của 2 byte.

Phiên bản ung dung

  MODE16
  VDU19,1,-1,49,4,12                :REM adjust shade of red 
  VDU19,7,-1,-1,-1,-1               :REM adjust shade of white to full brightness (63 is 2's complement representation of -1
  VDU19,4,-1,0,13,30                :REM adjust shade of blue
  RECTANGLEFILL40,0,1200,800        :REM plot background rectangle
  ORIGIN640,400
  FORa=38TO56STEP0.01
    x=COS(a)*100
    y=SIN(a)*100
    GCOL1:CIRCLEFILL-x,-y,100       :REM red
    GCOL4:CIRCLEFILLx,y,100         :REM blue
    GCOL0                           :REM black
    b=a*7DIV44/2                    :REM divide a by 2*(22/7) to get integer representation, then divide by 2 again.
    IFb=3.5THENz=y<0ELSEz=x>0       :REM decide whether to cut bar
    REM If the angle is correct (100*sin(a) = 56) draw bar. If required, cut out the middle of the bar.
    IFABS(INT(y))=56 MOVEx*b+y,y*b-x:MOVEBY x/3,y/3:PLOT113,-2*y,2*x:GCOL7:b-=0.1:MOVEx*b+y/12,y*b-x/12:MOVEBY x/2,y/2:IFz PLOT113,-y/6,x/6
  NEXT

Khi bắt đầu chương trình, tôi di chuyển điểm gốc đến giữa màn hình.

Tôi không vẽ bất kỳ nửa vòng tròn lớn màu nào. Thay vào đó, tôi chạy một vòng lặp vẽ các vòng tròn nhỏ màu đỏ và màu xanh, quay theo hướng ngược chiều kim đồng hồ. Tôi thực hiện gần 3 vòng quay hoàn chỉnh (bắt đầu bằng màu xanh ở bên phải) rõ ràng là quá đủ để điền vào đĩa. Tôi dừng lại ở cuộc cách mạng thứ 3, ngay khi màu xanh ở phía dưới bên phải ở đúng vị trí để xếp hàng với các thanh (phải được vẽ.)

Khi góc đúng, tôi vẽ một trong các thanh. vectơ x, y để vẽ vòng tròn nhỏ màu xanh hiện tại dùng để cho biết thanh sẽ đi theo hướng nào. Đối với mỗi 3 vòng quay, một giá trị khác nhau của số nguyên a*7DIV44được tính, cho biết liệu thanh thứ nhất, thứ hai hay thứ ba sẽ được rút ra, với cạnh bên trong 6 / 8,7 / 8 hoặc 8/8 đơn vị từ tâm ( theo các đơn vị được sử dụng trong thông số câu hỏi.) Vì các đơn vị chương trình là 1/4 so với đơn vị trong thông số kỹ thuật, đây vẫn là một nửa đơn vị, vì vậy chúng tôi chia cho 2 lần nữa trước khi lưu vào biến ọbắn để tránh chia đôi một lát sau.

Các thanh được vẽ rắn, sau đó giữa sẽ bị xóa nếu cần thiết. Điều này ngăn kinks tham gia nửa thanh. Biến z chỉ ra nếu một thanh nên được cắt. Nghĩa là, khi y âm đối với các thanh giữa và khi x dương đối với các thanh khác.

MOVElà một động thái tuyệt đối. MOVEBYlà một động thái tương đối. PLOT133coi hai vị trí con trỏ đồ họa cuối cùng, cộng với vị trí mới được chỉ định (theo tọa độ tương đối) là ba góc của hình bình hành và vẽ đồ thị hình bình hành đó.

Đầu ra (& thảo luận về các giới hạn ngôn ngữ)

Tôi đã chọn chế độ màn hình 1280x800 pixel logic = 640x400 pixel vật lý, theo mặc định có nền đen. Trên này tôi vẽ một hình chữ nhật màu trắng từ -600, -400 đến 600.400 để đóng vai trò là "bức vẽ" của tôi.

BBC Basic có thể xử lý 16 màu cùng một lúc, từ một pallete có thể lập trình lại. Nhưng nó chỉ hỗ trợ màu 18 bit, trong khi câu hỏi chỉ định màu là 24 bit. Các màu càng gần càng tốt.

nhập mô tả hình ảnh ở đây


2
Tôi đã điều chỉnh lại thông số kỹ thuật về ranh giới một chút. Cách bạn xử lý nó là khá nhiều như tôi dự định.
Martin Ender

16

Rùa 3 Python ( 552 549 byte)

Cờ

( Hình ảnh kích thước đầy đủ )

Chỉnh sửa: Bây giờ chúng tôi có Stack Snippets, đây là bài kiểm tra Stack Snippet bằng Skulpt , với sự trợ giúp của câu trả lời của ArtOfCode tại đây . Thật không may, Skulpt chưa thực hiện đầy đủ Python, vì vậy tôi đã phải cắt một nửa mã của mình để làm cho nó hoạt động. Nói cách khác, đoạn mã này chỉ nhằm chỉ ra cách thức chương trình của tôi hoạt động (mà không cần phải kéo lên Python).

(Ngoài ra, tôi thấy rằng điều này có thể không thực sự hoạt động trên một số trình duyệt ...)

function out(a){var b=document.getElementById("output");b.innerHTML+=a}function builtinRead(a){if(void 0===Sk.builtinFiles||void 0===Sk.builtinFiles.files[a])throw"File not found: '"+a+"'";return Sk.builtinFiles.files[a]}
$(document).ready(function run(){Sk.canvas="canvas";Sk.configure({output:out,read:builtinRead});try{Sk.importMainWithBody("<stdin>",!1,'import turtle\nimport math\nt=turtle.Turtle()\nt.speed(9)\nR="#c60c30"\nr=56.3\nk=0.6\ns=60*k\noffsetx,offsety=-215,-145\nt.up()\nt.goto(offsetx,offsety)\nt.down()\ndef q():t.rt(90)\ndef Q():t.lt(90)\ndef K():t.color("black");t.begin_fill();q()\ndef A(g,G):t.fd(g);Q();t.fd(G);Q();t.fd(g);Q();t.fd(G);Q()\ndef E():t.up();t.fd(s);t.down();Q();t.end_fill();t.up();t.fd(30*k);t.down();\ndef i():K();t.up();t.bk(s);t.down();A(120*k,20*k);E()\ndef I():K();t.up();t.fd(5*k);t.down();A(55*k,20*k);t.up();t.bk(65*k);t.down();A(55*k,20*k);E()\ndef C():t.circle(120*k,180)\nA(720*k,480*k)\nt.seth(r)\nt.up()\nt.goto(459.8*k+offsetx,173.4*k+offsety)\nt.down()\nt.color(R)\nt.begin_fill()\nC()\nt.end_fill()\nt.begin_fill()\nt.color("#003478")\nC()\nt.circle(s)\nt.end_fill()\nt.color(R)\nC()\nt.begin_fill()\nt.circle(s)\nt.end_fill()\nq()\nt.up()\nt.fd(s)\nt.down()\ni()\ni()\ni()\nt.up()\nt.bk(530*k)\nt.down()\nI()\nI()\nI()\nt.up()\nt.fd(170*k)\nt.rt(2*r)\nt.fd(180*k)\nt.down()\nI()\ni()\nI()\nt.up()\nt.bk(530*k)\nt.down()\ni()\nI()\ni()\n')}catch(a){throw Error(a.toString());}})
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.6.2/jquery.min.js"></script><script src="http://www.skulpt.org/static/skulpt.min.js" type="text/javascript"></script><script src="http://www.skulpt.org/static/skulpt-stdlib.js" type="text/javascript"></script>
<canvas height="320" width="480" id="canvas" style="border:1px solid gray">Your browser does not support HTML5 Canvas!</canvas>


Mã thực tế:

import turtle as t
b=t.begin_fill
c=t.circle
e=t.end_fill
f=t.fillcolor
R="#c60c30"
r=56.3
F=t.fd
B=t.bk
s=60
def q():t.rt(90)
def Q():t.lt(90)
def K():f(0,0,0);b();q()
def A(g,G):exec("F(g);Q();F(G);Q();"*2)
def E():F(s);Q();e();F(30)
def i():K();B(s);A(120,20);E()
def I():K();F(5);A(55,20);B(65);A(55,20);E()
def C():c(120,180)
A(720,480)
t.seth(r)
t.up()
t.goto(459.8,173.4)
f(R)
b()
C()
e()
b()
f("#003478")
C()
c(s)
e()
C()
f(R)
b()
c(s)
e()
q()
F(s)
i()
i()
i()
B(530)
I()
I()
I()
F(170)
t.rt(2*r)
F(180)
I()
i()
I()
B(530)
i()
I()
i()
t.ht()

Vì rùa chậm như vậy, nếu bạn muốn có kết quả tức thì, bạn có thể thêm t.tracer(0)sau dòng đầu tiên trước khi chạy tập lệnh.

Lưu ý: Vì một số lý do, rùa tiếp tục vẽ những gì trông giống như các pixel đen thêm mặc dù tôi đã gọi up()và tôi không biết tại sao ...


Tôi tin rằng ai đó đã triển khai Python (với rùa!) Trên bài đăng Stack Snippets; nếu bạn muốn tìm hiểu làm thế nào, bạn có thể là một trong những người đầu tiên sử dụng tính năng mới này! ;)
Doorknob

@Doorknob Tôi đã phải hủy một nửa mã của mình để làm cho nó thậm chí mơ hồ làm những gì tôi muốn, nhưng ít nhất nó trực quan thực hiện điều tương tự như trong Python bây giờ. (Nhưng nó không hoạt động trên Chrome của tôi vì một số lý do ...)
Sp3000

2
Hoạt động tốt trên Chrome iOS. Vui mừng khi thấy ai đó đã tìm thấy việc sử dụng cho dự án của tôi :)
ArtOfCode

14

HTML + ES6, 388

<canvas id=D width=576 height=384><script>c=D.getContext('2d')
T=x=>c.translate(x*72,x*48)
R=(x,y)=>T(4)+c.rotate(x*.59)+T(-4)+eval('for(i=j=0;i*j<6;i+=(j^=1))c.fillRect(72+24*i+(i>2)*288,144+j*52,16,44+52*(y>>i&1-j))')
A=(w,x,y,z)=>(c.fillStyle=c.fill()+c.beginPath()||w)*c.arc(x*4,192-y,48*y,0,3.1,z)||A
R(-1,21)
R(2,7)
A(r='#C60C30',72,2,1)('#003478',72,2)(0,84,1,1)(r,60,1)()</script>

Nếu trình duyệt của bạn hỗ trợ ES6, bạn có thể xem nó trên JSFiddle hoặc chạy đoạn mã.

Nó xây dựng cờ ra khỏi một số hình dạng cơ bản, xoay khung vẽ trước để tính các góc.


Chỉ cần một lưu ý rằng điều này không hoạt động trong Chrome 39, hoạt động tốt trong FF> 29.
JBCP

<canvas width=576 height=384 id=D><script>c=D.getContext('2d')ít hơn 9 byte. Ngoài ra, vì toàn bộ trang là màu trắng, tôi nghĩ bạn cần vẽ đường viền.
Trình tối ưu hóa

@Optimizer Cảm ơn. Theo tôi hiểu, đường viền chỉ cần thiết khi bạn có một khung vẽ vô hạn.
grc

5
Bạn có thể thử điều này với Stack Snippets!
Beta Decay

@BetaDecay nó thực sự hoạt động: o
grc

6

Toán học 404 450

b=1&~Array~13;a=ReplacePart[b,7-> 0];d=Disk;r=RGBColor;
z@{q_,p_,s_}:=ArrayPlot[{q,q,{},p,p,{},s,s},Frame-> False,ImageSize-> 155];
m=r@@{0,.2,.5};
o=r@@{.8,0,.2};
t=-19.1;u=-12.75;v=-5;q=-3.33;
Graphics[{Line[{{-36,-24},{36,-24},{36,24},{-36,24},{-36,-24}}],
Inset[Rotate[z@#,#2 125 Degree],#3]&@@@{{{b,a,b},1,{t,u}},{{a,b,a},1,{-t,-u}},
{{a,a,a},-1,{-t,u}},{{b,b,b},-1,{t,-u}}},
{o,d[{0,0},12,{-.2 Pi,.8Pi}],m, d[{0,0},12,{.8Pi,1.8Pi}],o,d[{v,-q},6],m,d[{-v,q},6]}}]

cờ


3

C ++ QUÁ LỚN

Đã thử điều này bằng cách sử dụng thư viện vẽ PPM tại nhà của tôi . Nó có khả năng mở rộng về mặt kỹ thuật, nhưng tôi bị giới hạn bởi chức năng điền đệ quy của mình vì nó không đáng tin cậy và thích phân tách, tôi nghĩ rằng nó sử dụng quá nhiều bộ nhớ, vì vậy tôi thực sự sẽ không cho phép người dùng đặt tỷ lệ. Hình ảnh không đều vì tọa độ tôi nhập cho mỗi góc của thanh bị tắt. nhập mô tả hình ảnh ở đây

Tôi thiết lập nó để bắt đầu với một nền đen, sau đó đặt một vòng tròn màu trắng ở giữa, sau đó là các vòng tròn màu đỏ và màu xanh trong đó. Được sử dụng điền đệ quy để thêm phần còn lại của màu đỏ và màu xanh. Sau đó vẽ hình chữ nhật với các đường trắng để đánh dấu các thanh màu đen. Chia nền đen thành 4 phần với các đường trắng và sử dụng 4 lần đệ quy để làm cho mỗi phần trắng. Làm điều đó trong 1 lượt sẽ gây ra một segfault. Nó vẫn rất chậm để kết xuất.

Mã chính bị đảo lộn (phần còn lại của thư viện quá lớn, việc đánh gôn này không thành vấn đề)

#include "PPMDraw.h"
#include <iostream>

int main(){
    std::cout << "Drawing Korean Flag" << std::endl;

    int scale = 150;
    int width = 3 * scale;
    int height = 2 * scale;

    int xc = width/2;
    int yc = height/2;

    // coords for the bar corners
    float nwax = -0.773; float nway = -0.813;
    float nwbx = -0.707; float nwby = -0.773;
    float nwcx = -1.000; float nwcy = -0.360;
    float nwdx = -1.050; float nwdy = -0.400;
    float nwex = -0.667; float nwey = -0.747;
    float nwfx = -0.613; float nwfy = -0.693;
    float nwgx = -0.880; float nwgy = -0.293;
    float nwhx = -0.947; float nwhy = -0.333;
    float nwix = -0.560; float nwiy = -0.667;
    float nwjx = -0.507; float nwjy = -0.627;
    float nwkx = -0.773; float nwky = -0.227;
    float nwlx = -0.840; float nwly = -0.267;

    float neax = 0.747; float neay = -0.813;
    float nebx = 0.867; float neby = -0.627;
    float necx = 0.813; float necy = -0.587;
    float nedx = 0.680; float nedy = -0.773;
    float neex = 0.893; float neey = -0.587;
    float nefx = 1.030; float nefy = -0.400;
    float negx = 0.960; float negy = -0.360;
    float nehx = 0.840; float nehy = -0.547;
    float neix = 0.640; float neiy = -0.747;
    float nejx = 0.920; float nejy = -0.333;
    float nekx = 0.853; float neky = -0.293;
    float nelx = 0.587; float nely = -0.693;
    float nemx = 0.533; float nemy = -0.667;
    float nenx = 0.667; float neny = -0.493;
    float neox = 0.600; float neoy = -0.440;
    float nepx = 0.480; float nepy = -0.627;
    float neqx = 0.693; float neqy = -0.440;
    float nerx = 0.813; float nery = -0.267;
    float nesx = 0.747; float nesy = -0.227;
    float netx = 0.627; float nety = -0.400;

    float swax = -0.773; float sway = 0.200;
    float swbx = -0.507; float swby = 0.613;
    float swcx = -0.560; float swcy = 0.653;
    float swdx = -0.840; float swdy = 0.253;
    float swex = -0.880; float swey = 0.280;
    float swfx = -0.760; float swfy = 0.453;
    float swgx = -0.813; float swgy = 0.493;
    float swhx = -0.947; float swhy = 0.320;
    float swix = -0.733; float swiy = 0.507;
    float swjx = -0.613; float swjy = 0.680;
    float swkx = -0.667; float swky = 0.720;
    float swlx = -0.787; float swly = 0.547;
    float swmx = -0.987; float swmy = 0.347;
    float swnx = -0.707; float swny = 0.760;
    float swox = -0.773; float swoy = 0.800;
    float swpx = -1.053; float swpy = 0.387;

    float seax = 0.747; float seay = 0.200;
    float sebx = 0.813; float seby = 0.253;
    float secx = 0.693; float secy = 0.427;
    float sedx = 0.627; float sedy = 0.387;
    float seex = 0.853; float seey = 0.280;
    float sefx = 0.920; float sefy = 0.320;
    float segx = 0.800; float segy = 0.507;
    float sehx = 0.733; float sehy = 0.453;
    float seix = 0.960; float seiy = 0.347;
    float sejx = 1.036; float sejy = 0.387;
    float sekx = 0.893; float seky = 0.573;
    float selx = 0.840; float sely = 0.520;
    float semx = 0.600; float semy = 0.427;
    float senx = 0.667; float seny = 0.467;
    float seox = 0.547; float seoy = 0.653;
    float sepx = 0.480; float sepy = 0.613;
    float seqx = 0.707; float seqy = 0.493;
    float serx = 0.773; float sery = 0.547;
    float sesx = 0.640; float sesy = 0.733;
    float setx = 0.547; float sety = 0.680;
    float seux = 0.813; float seuy = 0.573;
    float sevx = 0.880; float sevy = 0.613;
    float sewx = 0.747; float sewy = 0.800;
    float sexx = 0.693; float sexy = 0.747;

    PPMDraw flag = PPMDraw(width, height);
    flag.fill(0, 0, 0);

    // draw white circle in middle
    flag.set_color(255, 255, 255);
    flag.draw_fill_circle(xc, yc, scale/2);

    // draw red and blue portions of circle
    flag.set_color(255, 0, 0);
    flag.draw_fill_circle(xc - .21*scale, yc - .14*scale, scale/3.9);
    flag.set_color(0, 0, 255);
    flag.draw_fill_circle(xc + .21*scale, yc + .14*scale, scale/3.9);
    flag.set_color(255, 0, 0);
    flag.recursive_fill(xc + .21*scale, yc - .21*scale);
    flag.set_color(0, 0, 255);
    flag.recursive_fill(xc - .21*scale, yc + .21*scale);

    // draw the northwest bars
    flag.set_color(255, 255, 255);

    flag.draw_line(xc + nwax*scale, yc + nway*scale, xc + nwbx*scale, yc + nwby*scale);
    flag.draw_line(xc + nwax*scale, yc + nway*scale, xc + nwdx*scale, yc + nwdy*scale);
    flag.draw_line(xc + nwbx*scale, yc + nwby*scale, xc + nwcx*scale, yc + nwcy*scale);
    flag.draw_line(xc + nwcx*scale, yc + nwcy*scale, xc + nwdx*scale, yc + nwdy*scale);

    flag.draw_line(xc + nwex*scale, yc + nwey*scale, xc + nwfx*scale, yc + nwfy*scale);
    flag.draw_line(xc + nwex*scale, yc + nwey*scale, xc + nwhx*scale, yc + nwhy*scale);
    flag.draw_line(xc + nwfx*scale, yc + nwfy*scale, xc + nwgx*scale, yc + nwgy*scale);
    flag.draw_line(xc + nwhx*scale, yc + nwhy*scale, xc + nwgx*scale, yc + nwgy*scale);

    flag.draw_line(xc + nwix*scale, yc + nwiy*scale, xc + nwjx*scale, yc + nwjy*scale);
    flag.draw_line(xc + nwix*scale, yc + nwiy*scale, xc + nwlx*scale, yc + nwly*scale);
    flag.draw_line(xc + nwjx*scale, yc + nwjy*scale, xc + nwkx*scale, yc + nwky*scale);
    flag.draw_line(xc + nwlx*scale, yc + nwly*scale, xc + nwkx*scale, yc + nwky*scale);
    //NE
    flag.draw_line(xc + neax*scale, yc + neay*scale, xc + nebx*scale, yc + neby*scale);
    flag.draw_line(xc + neax*scale, yc + neay*scale, xc + nedx*scale, yc + nedy*scale);
    flag.draw_line(xc + nebx*scale, yc + neby*scale, xc + necx*scale, yc + necy*scale);
    flag.draw_line(xc + necx*scale, yc + necy*scale, xc + nedx*scale, yc + nedy*scale);

    flag.draw_line(xc + neex*scale, yc + neey*scale, xc + nefx*scale, yc + nefy*scale);
    flag.draw_line(xc + neex*scale, yc + neey*scale, xc + nehx*scale, yc + nehy*scale);
    flag.draw_line(xc + nefx*scale, yc + nefy*scale, xc + negx*scale, yc + negy*scale);
    flag.draw_line(xc + nehx*scale, yc + nehy*scale, xc + negx*scale, yc + negy*scale);

    flag.draw_line(xc + neix*scale, yc + neiy*scale, xc + nejx*scale, yc + nejy*scale);
    flag.draw_line(xc + neix*scale, yc + neiy*scale, xc + nelx*scale, yc + nely*scale);
    flag.draw_line(xc + nejx*scale, yc + nejy*scale, xc + nekx*scale, yc + neky*scale);
    flag.draw_line(xc + nelx*scale, yc + nely*scale, xc + nekx*scale, yc + neky*scale);

    flag.draw_line(xc + nemx*scale, yc + nemy*scale, xc + nenx*scale, yc + neny*scale);
    flag.draw_line(xc + nemx*scale, yc + nemy*scale, xc + nepx*scale, yc + nepy*scale);
    flag.draw_line(xc + nepx*scale, yc + nepy*scale, xc + neox*scale, yc + neoy*scale);
    flag.draw_line(xc + nenx*scale, yc + neny*scale, xc + neox*scale, yc + neoy*scale);

    flag.draw_line(xc + neqx*scale, yc + neqy*scale, xc + nerx*scale, yc + nery*scale);
    flag.draw_line(xc + neqx*scale, yc + neqy*scale, xc + netx*scale, yc + nety*scale);
    flag.draw_line(xc + nerx*scale, yc + nery*scale, xc + nesx*scale, yc + nesy*scale);
    flag.draw_line(xc + netx*scale, yc + nety*scale, xc + nesx*scale, yc + nesy*scale);

    //sw
    flag.draw_line(xc + swax*scale, yc + sway*scale, xc + swbx*scale, yc + swby*scale);
    flag.draw_line(xc + swax*scale, yc + sway*scale, xc + swdx*scale, yc + swdy*scale);
    flag.draw_line(xc + swbx*scale, yc + swby*scale, xc + swcx*scale, yc + swcy*scale);
    flag.draw_line(xc + swcx*scale, yc + swcy*scale, xc + swdx*scale, yc + swdy*scale);

    flag.draw_line(xc + swex*scale, yc + swey*scale, xc + swfx*scale, yc + swfy*scale);
    flag.draw_line(xc + swex*scale, yc + swey*scale, xc + swhx*scale, yc + swhy*scale);
    flag.draw_line(xc + swfx*scale, yc + swfy*scale, xc + swgx*scale, yc + swgy*scale);
    flag.draw_line(xc + swhx*scale, yc + swhy*scale, xc + swgx*scale, yc + swgy*scale);

    flag.draw_line(xc + swix*scale, yc + swiy*scale, xc + swjx*scale, yc + swjy*scale);
    flag.draw_line(xc + swix*scale, yc + swiy*scale, xc + swlx*scale, yc + swly*scale);
    flag.draw_line(xc + swjx*scale, yc + swjy*scale, xc + swkx*scale, yc + swky*scale);
    flag.draw_line(xc + swlx*scale, yc + swly*scale, xc + swkx*scale, yc + swky*scale);

    flag.draw_line(xc + swmx*scale, yc + swmy*scale, xc + swnx*scale, yc + swny*scale);
    flag.draw_line(xc + swmx*scale, yc + swmy*scale, xc + swpx*scale, yc + swpy*scale);
    flag.draw_line(xc + swpx*scale, yc + swpy*scale, xc + swox*scale, yc + swoy*scale);
    flag.draw_line(xc + swnx*scale, yc + swny*scale, xc + swox*scale, yc + swoy*scale);

    //se
    flag.draw_line(xc + seax*scale, yc + seay*scale, xc + sebx*scale, yc + seby*scale);
    flag.draw_line(xc + seax*scale, yc + seay*scale, xc + sedx*scale, yc + sedy*scale);
    flag.draw_line(xc + sebx*scale, yc + seby*scale, xc + secx*scale, yc + secy*scale);
    flag.draw_line(xc + secx*scale, yc + secy*scale, xc + sedx*scale, yc + sedy*scale);

    flag.draw_line(xc + seex*scale, yc + seey*scale, xc + sefx*scale, yc + sefy*scale);
    flag.draw_line(xc + seex*scale, yc + seey*scale, xc + sehx*scale, yc + sehy*scale);
    flag.draw_line(xc + sefx*scale, yc + sefy*scale, xc + segx*scale, yc + segy*scale);
    flag.draw_line(xc + sehx*scale, yc + sehy*scale, xc + segx*scale, yc + segy*scale);

    flag.draw_line(xc + seix*scale, yc + seiy*scale, xc + sejx*scale, yc + sejy*scale);
    flag.draw_line(xc + seix*scale, yc + seiy*scale, xc + selx*scale, yc + sely*scale);
    flag.draw_line(xc + sejx*scale, yc + sejy*scale, xc + sekx*scale, yc + seky*scale);
    flag.draw_line(xc + selx*scale, yc + sely*scale, xc + sekx*scale, yc + seky*scale);

    flag.draw_line(xc + semx*scale, yc + semy*scale, xc + senx*scale, yc + seny*scale);
    flag.draw_line(xc + semx*scale, yc + semy*scale, xc + sepx*scale, yc + sepy*scale);
    flag.draw_line(xc + sepx*scale, yc + sepy*scale, xc + seox*scale, yc + seoy*scale);
    flag.draw_line(xc + senx*scale, yc + seny*scale, xc + seox*scale, yc + seoy*scale);

    flag.draw_line(xc + seqx*scale, yc + seqy*scale, xc + serx*scale, yc + sery*scale);
    flag.draw_line(xc + seqx*scale, yc + seqy*scale, xc + setx*scale, yc + sety*scale);
    flag.draw_line(xc + serx*scale, yc + sery*scale, xc + sesx*scale, yc + sesy*scale);
    flag.draw_line(xc + setx*scale, yc + sety*scale, xc + sesx*scale, yc + sesy*scale);

    flag.draw_line(xc + seux*scale, yc + seuy*scale, xc + sevx*scale, yc + sevy*scale);
    flag.draw_line(xc + seux*scale, yc + seuy*scale, xc + sexx*scale, yc + sexy*scale);
    flag.draw_line(xc + sevx*scale, yc + sevy*scale, xc + sewx*scale, yc + sewy*scale);
    flag.draw_line(xc + sexx*scale, yc + sexy*scale, xc + sewx*scale, yc + sewy*scale);

    // fill in the black to white
    flag.draw_line(xc, yc - scale/2, xc, 0);
    flag.draw_line(xc, yc + scale/2, xc, height);
    flag.draw_line(xc - scale/2, yc, 0, yc);
    flag.draw_line(xc + scale/2, yc, width, yc);

    flag.recursive_fill(0, 0);
    flag.recursive_fill(0, height-1);
    flag.recursive_fill(width - 1, 0);
    flag.recursive_fill(width - 1, height - 1);

    flag.save("flag.ppm");

}

@SohamChowdhury Hoàn toàn không có chủ ý, SEXY là góc SouthEast, tọa độ điểm X, Y.
dùng137

3
Của bạn là giải pháp duy nhất mà lá cờ đang vẫy trong gió!
CJ Dennis

2

PostScript , 572 477 byte

Mã đánh gôn:

5 5 scale 36 24 translate /R{.75 .05 .19 setrgbcolor}def/B{0 .20 .47 setrgbcolor}def/a 2 3 atan def/b{0 setgray[18 -6 2 12 21 -6 2 12 24 -6 2 12]rectfill 1 setgray{[18 -.5 2 1 24 -.5 2 1]rectfill}if{21 -.5 2 1 rectfill}if}def a neg rotate R 0 0 12 0 180 arc closepath fill B 0 0 12 180 0 arc closepath fill R -6 0 6 0 360 arc closepath fill B 6 0 6 0 360 arc closepath fill true true b 2 a mul rotate false true b 180 rotate true false b -2 a mul rotate false false b
showpage

Mã bị đánh cắp:

5 5 scale                                     % over-all scale
36 24 translate                               % over-all shift
/R {.75 .05 .19 setrgbcolor} def              % prodecure for setting red color
/B {0 .20 .47 setrgbcolor} def                % procedure for setting blue color
/a 2 3 atan def                               % calculate angle = arctan(2/3) = 33.7°
/b {                                          % procedure for drawing bars
 0 setgray                                    %   black
 [18 -6 2 12 21 -6 2 12 24 -6 2 12] rectfill  %   draw 3 bars
 1 setgray                                    %   white
 {[18 -.5 2 1 24 -.5 2 1] rectfill} if        %   conditionally draw gap in inner/outer bars 
 {21 -.5 2 1 rectfill} if                     %   conditionally draw gap in middle bar 
} def
a neg rotate                                  % rotate -33.7°
R 0 0 12 0 180 arc closepath fill             % big red half circle
B 0 0 12 180 0 arc closepath fill             % big blue half circle
R -6 0 6 0 360 arc closepath fill             % small red circle
B  6 0 6 0 360 arc closepath fill             % small blue circle
true true b                                   % draw bars (with gap in all bars)
2 a mul rotate                                % rotate 67.4°
false true b                                  % draw bars (with gap in inner/outer bars)
180 rotate                                    % rotate 180°
true false b                                  % draw bars (with gap in middle bar)
-2 a mul rotate                               % rotate -67.4°
false false b                                 % draw bars (without gaps)
showpage

Kết quả:

kết quả


1

Python 2, 483 byte

from math import*
w,k,r,b="255 "*3,"0 "*3,"198 12 48 ","0 52 120 "
print "P3 600 400 255 "
a=atan2(2,3)
c,s=cos(a),sin(a)
T=lambda x,y:(c*x-s*y,s*x+c*y)
S=lambda x,y:150<x<216.6and x%25<16.6and y*y<2500
C=lambda x,y,p=50:(x-p)**2+y*y<2500
for y in range(-200,200):
 for x in range(-300,300):X,Y=T(x,y);W,Z=T(-x,y);print [[w,k][(S(abs(X),Y)and(Y*Y>16or(166.6<X<191.4or-200>X or 0>X>-166.6)))or(S(abs(W),Z)and(W>0 or abs(Z)>4))],[b,r][(Z<0 or C(W,Z))and not C(W,Z,-50)]][W*W+Z*Z<10000]

Những cải tiến có thể có:

  • mã hóa cos, hằng số tội lỗi
  • PPM nhị phân
  • biến đổi thành [3,2] mặt phẳng
  • tối ưu hóa các câu lệnh boolean

Đầu ra dưới dạng văn bản PPM, cách sử dụng:

python golf_korea.py > korea.ppm

nhập mô tả hình ảnh ở đây

phiên bản beta không có bản quyền

from math import*
w,k,r,b="255 255 255 ", "0 0 0 ", "255 0 0 ", "0 0 255 "
g="0 255 0 "
print "P3 600 400 255 "
a=atan2(2,3)
c,s=cos(a),sin(a)
trans=lambda x,y:(c*x-s*y,s*x+c*y)
stripe=lambda x:150<x<216.6 and x%25<16.6
small=lambda x,y,p=50:(x-p)**2+y*y<2500
for y in range(-200,200):
 for x in range(-300,300):
  X,Y=trans(x,y)
  W,Z=trans(-x,y)
  if stripe(abs(X)) and Y*Y<2500:
   if abs(Y)>4:  
    print k
   else:
    if X>0:
     if 166.6<X<191.4:
      print k
     else:
      print w
    else:
     if -200<X<-166.6:
      print w
     else:
      print k
  elif stripe(abs(W)) and Z*Z<2500 and(W>0 or abs(Z)>4):
   print k
  elif W*W+Z*Z<100*100:
   if (Z<0 or small(W,Z)) and not small(W,Z,-50):
    print r
   else:
    print b
  else:
   print w
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.