대한민국 국기 그리기


58

내가이 질문을 우연히 발견했을 때 나는 한때 대한민국 국기 건설에 대한 정확한 규칙을 보았 음을 기억했다. 그리고 이것은 상당히 다른 구조입니다.

여기에 이미지 설명을 입력하십시오

출처 : Wikipedia

이제이 구성을 정확하게 그려야합니다!

사양

벡터 또는 래스터 그래픽을 사용하여 파일 또는 화면에 플래그를 렌더링 할 수 있습니다. 출력이 래스터 화 된 경우 이미지의 크기는 450x300 픽셀 이상이어야합니다.

모든 길이 비율과 위치는 다음 다이어그램에 표시된 것과 정확히 일치해야합니다.

여기에 이미지 설명을 입력하십시오

출처 : Wikipedia

두 개의 작은 원의 중심이 대각선과 정렬됩니다.

색상의 경우 다음 팔레트를 사용해야합니다.

  • 화이트 : #FFFFFF
  • 블랙 : # 000000
  • 레드 : # C60C30
  • 블루 : # 003478

드로잉 시스템에서 기술적 인 이유로 3 : 2 캔버스를 지정하지 않는 한 검은 색 경계를 그려서는 안됩니다 (그렇지 않으면 3 : 2 캔버스를 사용해야하고 플래그가 모두 채워야합니다). 경계를 추가 해야하는 경우 임의로 두께가 두꺼울 수 있습니다. 깃발은 검은 색 경계 내부 에서 엄격하게 고려해야 합니다. 다른 보 조선 또는 길이 표시기를 그려서는 안됩니다. 즉, 깃발은 첫 번째 이미지와 똑같이 나타납니다.

채점

이것은 코드 골프이므로 가장 짧은 대답 (바이트)이 이깁니다.

경고의 말로, 기존 압축 사용 (압축 GIF 포함)은 여러 표준 허점에 속합니다 .


2
흥미롭게도, 한국 플래그는 이진수 시스템의 초기 형태 (포함 britton.disted.camosun.bc.ca/jbbinflag.htm )
britishtea

캔버스보다 큰 HTML 페이지를 사용할 때 테두리를 그려야합니까? 흰색은 캔버스 / 요소 크기가 플래그와 유사하더라도 눈에 띄는 구분이 없습니다
Optimizer

@Optimizer, 아니요. 캔버스가 어떻게 든 보이게 할 수있는 방식으로 (예 : 브라우저의 "검사 요소"를 강조 표시하여) 경계가있는 경우 경계가 필요하지 않습니다. 캔버스의 범위를 기술적으로 정의 할 수없는 드문 경우에만 검은 색 테두리를 그려야합니다.
Martin Ender

3
CountryData["ROK","Flag"]계산하지 않는다고 가정 합니까?
wchargin

답변:


13

PHP / HTML / SVG, 324

(가독성을 위해 줄 바꿈이 추가됨)

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

압축 된 데이터는 아래 표시된 이전 답변과 동일한 SVG 데이터로 확장되지만 압축을 돕기 위해 두 가지 변경 사항이 있습니다.

  1. <use>섹션은 섹션의 원래 내용으로 확장됩니다 <defs>. 이렇게하면 소스 텍스트가 길어 지지만 엔트로피가 줄어들어 압축률이 높아집니다.

  2. 첫 번째 <g>요소에서로 변경 transform=translate(36,24)rotate(33.69)되었습니다 transform=rotate(33.69)translate(43.27). 이것은 기하학적으로 동일한 효과를 갖지만 시퀀스 ><g transform=rotate(가 두 번 나타나기 때문에 더 잘 압축 됩니다.

기본적으로 PHP는 이것을으로 제공 Content-Type: text/html하므로 유효하지 않은 XML 구문은 문제가되지 않습니다.

SVG / HTML, 463

HTML 구문 분석기는 올바른 구문에 대해 너무 까다로워하지 않으므로 공백을 포함하지 않는 한 매개 변수에서 따옴표를 제거 할 수 있습니다. 약간의 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

파이썬 + 피카 이로, 371 370 366 바이트

깃발

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)

라는 작은 SVG 파일을 출력합니다 F.


C(*[.77,0,.05,.2,.19,.47][i::2])보다 짧은C(*[(.77,.05,.19),(0,.2,.47)][i%2])
isaacg

s=SVGSurface("F",12,8);c=Context(s)대신에 쓰지 c=Context(SVGSurface("F",12,8))않습니까?
Lily Chung

@IstvanChung 좋은 지적입니다.
Ell

32

HTML + CSS, 966906843 792 762 바이트

언제든지 승자는 아니지만 CSS로 많은 재미있는 그림을 그립니다. 그래도 골프는 많이 할 수 있습니다.

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 solid<body>태그는 OP에 의해 명시된 바와 같이 검사기 또는 유사한 도구에 의해 관찰 될 수있는 명확한 경계를 갖기 때문에 보여주기위한 것입니다.

참고 비 공급 업체별 변환 및 그라디언트 사용으로 인해 Firefox (또는 Chrome 카나리아 / dev)에서만 작동합니다.

실제로보기


캐릭터 수에 <link> 또는 <style> 태그를 포함시켜야한다고 생각합니다. CSS- 0deg> 0(두 번)로 몇 개의 문자를 저장 하고에서 제거 할 수 left:0있습니다 a:before. HTML에서는을 사용할 수 있습니다 <p><ul></ul>. ( <p>암시 적으로 전에 종료됩니다 <ul>)
gronostaj

1
Firefox 32에서 작동합니다. Safari 7.1에서 크게 실패합니다.
200_success

1
CSS에 LESS 또는 SASS를 사용하면 CSS를 상당히 단축시킬 수있는 많은 옵션이 제공됩니다. 또한 :before{content:''}:after{content:''}단지 (이 실제로보고 더 나은에도 불구하고) 다른 요소를 추가하는 것보다 길다.
David Mulder

@DavidMulder 나는 짧은 코드보다는 재미있는 요소를 원했습니다. 사람들은 LESS 나 SASS보다 순수한 CSS와 더 쉽게 관련 될 수 있습니다. :)
Optimizer

최신 Chrome에서도 작동합니다. @ 당신은 추가하여 Safari에서 작업을 얻을 수 있어야 200_success -webkit-모든 이전 transform:의, 그러나 말할 필요도없이 그 꽤 이상을 만들 것입니다!
Doorknob

20

BBC Basic, 349 343 ASCII 문자, 토큰 화 된 파일 크기 330

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

올바른 색상을 사용하면 많은 것이 추가되었지만 모든 그래픽 명령을 원시 VDU 코드로 골라 내면 원래 게시물과 비교하여 전체적으로 6자를 절약 할 수 있습니다. BBC 마이크로의 모든 그래픽은 머신 별 ASCII 제어 코드를 통해 이루어 지므로, 높은 수준의 그래픽 명령을 사용하는 대신 바이트를 VDU 컨트롤러에 직접 공급할 수 있습니다 (일반적으로 더 짧지 만 가독성이 높음). 쉼표 대신 세미콜론으로 끝나는 값은 2 바이트의 16 비트 리틀 엔디안 표현입니다.

언 골프 버전

  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

프로그램 시작시 원점을 화면 중앙으로 이동합니다.

나는 큰 색의 반원을 그리지 않습니다. 대신 작은 빨간색과 파란색 원을 그리는 루프를 실행하여 시계 반대 방향으로 회전합니다. 나는 디스크를 채우기에 충분한 것 이상으로 거의 3 번의 완전한 회전 (오른쪽에서 파란색으로 시작)을 수행합니다. 오른쪽 하단의 파란색이 막대와 일치하도록 올바른 위치에있을 때 (3 플롯해야 함) 3 회전을 멈 춥니 다.

각도가 맞으면 막대 중 하나를 그립니다. 현재 작은 파란색 원을 그리기위한 벡터 x, y는 막대의 방향을 알려줍니다. 3 회전마다 정수의 다른 값 a*7DIV44이 계산되어 첫 번째, 두 번째 또는 세 번째 막대를 안쪽에서 6 / 8,7 / 8 또는 8/8 단위로 가운데에서 그려야하는지 여부를 나타냅니다 ( 프로그램 스펙이 스펙에있는 것의 1/4이기 때문에, 이것은 여전히 ​​반-단위이므로, 반을 반으로 줄이지 않기 위해 변수 'b'에 저장하기 전에 다시 2로 나눕니다. 나중.

막대가 단색으로 그려진 다음 필요한 경우 가운데가 삭제됩니다. 이렇게하면 꼬임이 절반 막대에 합류하지 않습니다. 변수 z는 막대를자를 지 여부를 나타냅니다. 즉, 중간 막대에 대해 y가 음수이고 다른 막대에 대해 x가 양수인 경우입니다.

MOVE절대적인 움직임입니다. MOVEBY상대 이동입니다. PLOT133마지막 두 그래픽 커서 위치와 (상대 좌표로) 지정된 새 위치를 평행 사변형의 세 모서리로 간주하고 평행 사변형을 그립니다.

출력 (언어 제한에 대한 토론)

1280x800 논리 픽셀 = 640x400 물리 픽셀의 화면 모드를 선택했는데 기본적으로 검은 색 배경이 있습니다. 여기에 -600, -400에서 600,400 사이의 흰색 사각형을 그려서 "캔버스"역할을합니다.

BBC Basic은 재 프로그램 가능한 팔레트에서 한 번에 16 가지 색상을 처리 할 수 ​​있습니다. 그러나 18 비트 색상 만 지원하지만 질문은 색상을 24 비트로 지정합니다. 가능한 한 가까운 색상.

여기에 이미지 설명을 입력하십시오


2
경계에 관한 사양을 조금 바꿔 보았습니다. 당신이 그것을 처리하는 방식은 내가 의도 한대로입니다.
Martin Ender

16

파이썬 3 거북 ( 552 549 바이트)

깃발

( 전체 크기 이미지 )

편집 : 이제 우리는 스택 조각이 있는지, 여기에 사용하여 스택 발췌문 시험의 Skulpt을 ArtOfCode의 답변의 도움으로, 여기가 . 불행히도 Skulpt는 아직 Python을 완전히 구현하지 않았 으므로이 기능을 사용하려면 코드의 절반을 잘라야했습니다. 즉,이 스 니펫은 내 프로그램이 어떻게 작동 하는지를 나타 내기위한 것입니다 (Python을 끌어 올릴 필요 없음).

(또한 일부 브라우저에서는 실제로 작동하지 않을 수도 있습니다 ...)

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>


실제 코드 :

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

거북이는 매우 느리게 진행되므로 즉각적인 결과를 원한다면 t.tracer(0)첫 번째 줄 다음에 스크립트를 실행하기 전에 추가 할 수 있습니다 .

참고 : 어떤 이유로 거북이는 이미 호출했지만 추가 검은 픽셀처럼 보이는 것을 계속 그리며 up()왜 그런지 알지 못합니다 ...


누군가가 Stack Snippets 게시물에 Python (거북과 함께!)을 구현했다고 생각합니다. 방법을 알고 싶다면이 새로운 기능을 가장 먼저 사용할 수 있습니다. ;)
Doorknob

@Doorknob 나는 내가 원하는 것을 모호하게하기 위해 내 코드의 절반을 파괴해야했지만 적어도 현재는 파이썬에서와 시각적으로 동일한 일을합니다. (그러나 어떤 이유로 든 Chrome에서는 작동하지 않습니다 ...)
Sp3000

2
Chrome iOS에서 잘 작동합니다. 누군가가 내 프로젝트에 유용하다는 것을 알게되어 기쁘다 :)
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>

브라우저가 ES6을 지원하는 경우 JSFiddle에서 보거나 스 니펫을 실행할 수 있습니다 .

기본 모양으로 플래그를 구성하고 각도를 설명하기 위해 캔버스를 먼저 회전시킵니다.


Chrome 39에서는 작동하지 않으며 FF> 29에서는 제대로 작동합니다.
JBCP

<canvas width=576 height=384 id=D><script>c=D.getContext('2d')9 바이트가 적습니다. 또한 전체 페이지가 흰색이므로 테두리를 그려야한다고 생각합니다.
Optimizer

@Optimizer 감사합니다. 내가 이해하는 것처럼 테두리는 무한 캔버스가있을 때만 필요합니다.
grc

5
Stack Snippets로 시도해보십시오!
Beta Decay

@BetaDecay 그것은 실제로 작동했습니다 : o
grc

6

매스 매 티카 (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]}}]

깃발


3

C ++ 너무 큼

집에서 만든 PPM 드로잉 라이브러리를 사용하여 시도했습니다 . 기술적으로 확장 가능하지만 재귀 채우기 기능으로 인해 제한적이며 segfault를 좋아하기 때문에 너무 많은 메모리를 사용하고 있다고 생각하므로 실제로 사용자가 스케일을 설정하지 못하게합니다. 막대의 각 모서리에 입력 한 좌표가 약간 벗어 났기 때문에 이미지가 불규칙합니다. 여기에 이미지 설명을 입력하십시오

나는 검은 배경으로 시작하도록 설정 한 다음 중간에 흰색 원을 넣은 다음 빨간색과 파란색 원을 그 안에 넣습니다. 재귀 채우기를 사용하여 나머지 빨간색과 파란색을 추가했습니다. 그런 다음 검은 선을 표시하기 위해 흰색 선으로 사각형을 그렸습니다. 검은 색 배경을 흰색 선으로 4 개의 섹션으로 나누고 4 개의 재귀 채우기를 사용하여 각 섹션을 흰색으로 만듭니다. 한 번에 그것을하면 segfault가 발생했을 것입니다. 여전히 렌더링 속도가 매우 느립니다.

ungolfed main code (나머지 라이브러리는 너무 커서 골프는 중요하지 않습니다)

#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 완전히 의도하지 않은 SEXY는 SouthEast 코너, 포인트 X, Y 좌표입니다.
user137

3
당신은 깃발이 바람에 물결 치는 유일한 솔루션입니다!
CJ 데니스

2

포스트 스크립트 , 572 477 바이트

골프 코드 :

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

Ungolfed 코드 :

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

결과:

결과


1

파이썬 2, 483 바이트

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]

가능한 개선 사항 :

  • cos, sin 상수를 하드 코딩
  • 이진 PPM
  • [3,2] 평면으로 변환
  • 부울 문을 최적화

텍스트 PPM으로 출력, 사용법 :

python golf_korea.py > korea.ppm

여기에 이미지 설명을 입력하십시오

골치 아픈 베타 버전

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
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.