Нарисуйте флаг Южной Кореи

58

Когда я наткнулся на этот вопрос, я вспомнил, что я когда-то также видел точные правила для постройки южнокорейского флага. И это совсем другая конструкция.

введите описание изображения здесь

Источник: Википедия

Таким образом, вы должны нарисовать точную конструкцию этого сейчас!

Спецификация

Вы можете отобразить флаг в файл или на экран, используя векторную или растровую графику. Если ваш вывод растровый, ваше изображение должно иметь размеры 450x300 пикселей или более.

Все соотношения длины и положения должны быть точно такими, как показано на следующей диаграмме:

введите описание изображения здесь

Источник: Википедия

Обратите внимание, что центры двух маленьких кружков совпадают с диагональю.

Для цветов необходимо использовать следующую палитру:

  • Белый: #FFFFFF
  • Черный: # 000000
  • Красный: # C60C30
  • Синий: # 003478

Черная граница не должна быть нарисована, если ваша система рисования не позволяет вам указать холст 3: 2 по техническим причинам (в противном случае вы должны использовать холст 3: 2, а флаг должен заполнить все это). Если вам нужно добавить границу, она может быть сколь угодно толстой - флаг следует рассматривать строго внутри черной границы. Любые другие линии помощи или указатели длины не должны быть нарисованы. Т.е. флаг должен появиться именно так, как на первом изображении.

счет

Это код гольф, поэтому самый короткий ответ (в байтах) выигрывает.

Как предупреждение, использование существующего сжатия (например, встраивание сжатого GIF) попадает в несколько стандартных лазеек .

Мартин Эндер
источник
2
Интересно, что корейский флаг содержит раннюю форму двоичной системы счисления ( britton.disted.camosun.bc.ca/jbbinflag.htm )
британцы
Нужно ли рисовать границу, когда мы используем HTML-страницу, размер которой превышает флаг, если белый цвет, разделение не видно, даже если размер холста / элемента аналогичен флагу
Optimizer
@Optimizer, нет, если холст ограничен таким образом, который можно каким-то образом сделать видимым (например, путем выделения «элемента проверки» вашего браузера), тогда вам не нужна граница. Черная граница должна быть нарисована только в том редком случае, когда технически невозможно определить размер холста.
Мартин Эндер
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

Python + Pycairo, 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))?
Лили Чунг
@IstvanChung Хороший вопрос.
Ell
32

HTML + CSS, 966 906 843 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>тега есть четкие границы, которые могут наблюдаться инспектором или подобными инструментами, как указано в ОП

ПРИМЕЧАНИЕ Работает только в Firefox (или Chrome canary / 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
Используйте LESS или SASS для CSS, который должен дать вам довольно много вариантов, чтобы немного его сократить. Кроме того , :before{content:''}и :after{content:''}больше , чем просто добавить еще один элемент (несмотря на это , на самом деле выглядит лучше).
Дэвид Малдер
@DavidMulder Я хотел получить забавный фактор в этом, а не более коротком коде. Люди могут относиться к чистому CSS легче, чем LESS или SASS :)
Оптимизатор
Работает и в последней версии Chrome. @ 200_success Вы должны быть в состоянии заставить его работать в Safari, добавив -webkit-перед ним все transform:s, но само собой разумеется, что это сделает его немного длиннее!
Ручка двери
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 micro выполняется с помощью машинных управляющих кодов ASCII, поэтому вместо использования высокоуровневых графических команд вы можете подавать байты прямо на контроллер VDU (как правило, короче, но с большим расходом на удобочитаемость). Значение, заканчивающееся точкой с запятой вместо запятой, представляет собой 16-разрядное представление с прямым порядком байтов в 2 байта.

Неуправляемая версия

  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-м обороте, просто когда синий в правом нижнем углу находится в правильном положении, чтобы выровняться с барами (которые должны быть нанесены на график)

Когда угол правильный, я рисую одну из полос. вектор x, y для рисования текущего маленького синего круга служит для указания, в каком направлении должна быть полоса. Для каждого из 3 оборотов a*7DIV44вычисляется различное значение целого числа , которое указывает, следует ли рисовать первый, второй или третий столбец с внутренним краем в 6 / 8,7 / 8 или 8/8 единиц от центра ( в соответствии с единицами измерения, использованными в спецификации вопроса.) Поскольку программные единицы составляют 1/4 от единицы в спецификации, это все равно половина единицы, поэтому мы снова делим на 2 перед сохранением в переменную «b», чтобы избежать повторного деления пополам потом.

Столбцы нарисованы сплошными, затем середина удаляется при необходимости. Это предотвращает сгибание перегибов половин. Переменная z указывает, должен ли быть отрезан стержень. То есть, когда у отрицательных для средних баров и когда х положительно для других баров.

MOVEэто абсолютный ход. MOVEBYэто относительный ход. PLOT133рассматривает последние две графические позиции курсора, плюс новую, указанную (в относительных координатах) как три угла параллелограмма, и строит этот параллелограмм.

Вывод (и обсуждение языковых ограничений)

Я выбрал режим экрана 1280x800 логических пикселей = 640x400 физических пикселей, который по умолчанию имеет черный фон. Для этого я рисую белый прямоугольник от -600, -400 до 600400, чтобы действовать как «холст».

BBC Basic может обрабатывать 16 цветов одновременно с перепрограммируемого поддона. Но он поддерживает только 18-битный цвет, тогда как вопрос определяет цвета как 24-битный. Цвета как можно ближе.

введите описание изображения здесь

Уровень реки St
источник
2
Я переписал спецификацию относительно границы немного. То, как вы справились с этим, в значительной степени соответствует моим намерениям.
Мартин Эндер
16

Python 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(), и я понятия не имею, почему ...

Sp3000
источник
Я считаю, что кто-то реализовал Python (с черепахой!) На посте Stack Snippets; если вы хотите понять, как, вы могли бы быть одним из первых, кто использовал эту новую функцию! ;)
Дверная ручка
@ Doorknob Мне пришлось уничтожить половину моего кода, чтобы заставить его даже смутно делать то, что я хотел, но по крайней мере это визуально делает то же самое, что и в Python сейчас. (Но по какой-то причине он не работает на моем Chrome ...)
Sp3000 22.10.14
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 или запустить фрагмент.

Он создает флаг из некоторых основных форм, сначала поворачивая холст, чтобы учесть углы.

GRC
источник
Просто обратите внимание, что это не работает в Chrome 39, отлично работает в FF> 29.
JBCP
<canvas width=576 height=384 id=D><script>c=D.getContext('2d')на 9 байт меньше. Кроме того, поскольку вся страница белая, я думаю, вам нужно нарисовать границу.
Оптимизатор
@Optimizer Спасибо. Насколько я понимаю, граница нужна только тогда, когда у вас бесконечный холст.
GRC
5
Вы можете попробовать это с помощью фрагментов стека!
бета-распад
@BetaDecay это действительно сработало: o
grc
6

Mathematica 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]}}]

флаг

DavidC
источник
3

С ++ СЛИШКОМ БОЛЬШОЙ

Попытка сделать это с помощью моей собственной библиотеки чертежей PPM . Это технически масштабируемо, но я ограничен моей функцией рекурсивного заполнения, потому что она ненадежна и любит segfault, я думаю, что она использует слишком много памяти, поэтому я не позволю пользователю устанавливать масштаб. Изображение нерегулярное, потому что координаты, которые я ввел для каждого угла столбцов, немного смещены. введите описание изображения здесь

Я установил его, чтобы начать с черного фона, затем поместил белый круг в середине, а затем красные и синие круги. Используются рекурсивные заливки, чтобы добавить остаток красного и синего. Затем нарисуйте прямоугольники с белыми линиями, чтобы отметить черные полосы. Разделите черный фон на 4 секции с белыми линиями и используйте 4 рекурсивных заливки, чтобы сделать каждую секцию белой. Выполнение этого за 1 проход вызвало бы ошибку. Это все еще очень медленно, чтобы сделать.

Основной код Ungolfed (остальная часть библиотеки слишком большая, игра в гольф это не имеет значения)

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

}
user137
источник
@SohamChowdhury Совершенно непреднамеренно, SEXY - это юго-восточный угол, точка X, координата Y.
user137
3
Твое единственное решение, где флаг развевается на ветру!
CJ Деннис
2

PostScript , 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

Python 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, константы греха
  • двоичный 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
Карл Напф
источник