Великий, Білий, Північний!


11

Е-е!

Ви знаєте, проблема з нами, канадцями, полягає в тому, що іноді, після довгого дня полювання на лося та ремонту греблі, ми забуваємо свій шлях назад до наших кабін! Хіба не було б чудово, якби наш зручний ноутбук (який завжди знаходиться поруч) мав би якийсь спосіб вказати на нас додому? Ну, давно сказано, що якщо ви покажете компас на своєму комп’ютері, він буде найяскравішим, коли він вказує на Північ. Я хотів би перевірити це, але мені потрібна компактна програма, щоб взяти з собою в мою наступну поїздку, тому що мій жорсткий диск вже наповнений рецептами кленового сиропу (і ті, хто не може). Отже, ваше завдання - створити мені програму, яка під час запуску зберігає або відображає зображення наступної троянди компаса:

Компас піднявся

Букви можуть бути різним шрифтом. Пам'ятайте, що найменше найкраще, тому виграє найменший байт!

Технічні умови

Кольори

  • Світло-фіолетовий: # 9999FF
  • Сірий: # E5E5E5

Довжини та кути

Технічні характеристики троянди

  • Кут a= 45 °
  • Кут b= 90 °
  • Довжина c= 250 одиниць
  • Довжина d= 200 одиниць
  • Довжина e= 40 одиниць
  • Довжина f= 45 одиниць

Роз'яснення

  • Текст може бути будь-яким відповідним шрифтом, де доречно позначає, що він читабельний для середньої, освіченої людини.
  • Текст повинен бути на відстані 3 одиниць від шипів у найближчій його точці, не повинен торкатися троянди і повинен бути вертикальним
  • Якщо лінія намальована від центру троянди, через кінцеву точку шипа і далі, вона повинна перетинати центр тексту з точністю +/- 2 одиниці (текст повинен бути по центру осі a, де aпростягається від середини сторінки, через кінець шипа і далі)
  • Кожен символ повинен бути не менше 15 одиниць на 15 одиниць і мати співвідношення x / y або y / x не більше 2: 1 (відсутність розтягування - читабельність)
  • Тьмяне коло, що проходить через довші шипи та текст, найближчий до середини на еталонному зображенні, не малюється.
  • Зображення має бути квадратним і не менше 400 пікселів на 400 пікселів
  • Стиснене зображення в межах джерела заборонено
  • Одиниця повинна бути не менше 1 пікселя

Коли ви говорите "рецепти кленового сиропу", ви маєте на увазі рецепти виготовлення кленового сиропу чи рецепти, щоб зробити речі з кленового сиропу? Тому що я не можу уявити собі, що вони будуть колишніми ...
Джо Z.

@JoeZ. Обоє, очевидно ... (;
глобі

Відповіді:


7

HTML + CSS, 487 + 189 = 676

Роза компаса побудована з кордонів CSS за допомогою трикутної техніки та деяких основних перетворень. Листи просто задані фіксованими положеннями, так що вийшло досить довго: /

Фрагмент знизу зменшується, щоб він все підходив. Ви можете перевірити JSFiddle тут . Крім того, я не впевнений, наскільки добре букви будуть вирівнюватися у різних браузерах (з різними шрифтами, стилями за замовчуванням тощо).

html{transform:scale(0.2)}body{margin:5em}hr{margin:0;float:left;border:250px solid transparent;border-right:58px solid #E5E5E5;border-bottom:58px solid #9999FF}a{position:fixed;width:616px;font-size:4em}#a{transform:rotate(90deg)}#b{transform:rotate(270deg)}#c{transform:rotate(180deg)}#d{transform:rotate(45deg)scale(.8)}#n{top:20px;left:365px}#e{top:356px;left:700px}#s{top:700px;left:370px}#w{top:356px;left:10px}#N{top:150px;left:550px}#E{top:560px;left:550px}#S{top:560px;left:140px}#W{top:150px;left:140px}
<a id=n>N</a><a id=e>E</a><a id=s>S</a><a id=w>W</a><a id=N>NE</a><a id=E>SE</a><a id=S>SW</a><a id=W>NW</a><a id=d><hr><hr id=a><hr id=b><hr id=c></a><a><hr><hr id=a><hr id=b><hr id=c></a>


Схоже, на середині є невеликий сірий ящик, який зробив компас непридатним. Чи є якийсь шанс, що ви могли це виправити?
глобі

1
@globby це не відображається для мене. Чи можете ви опублікувати скріншот?
grc

imgur.com/dYQoLcM,sSrR94O Використання Mozilla Firefox 35.0 у Windows 8.1
глобі

@globby, що може бути наслідком масштабування. Чи трапляється це на повнорозмірному JSFiddle?
grc

3

Обробка 2 - 636

Швидке рішення, яке просто малює всі трикутники методом трикутника обробки, а потім розміщує літери на їхніх кінчиках.

int s,h,m,b,n,t;void setup(){s=400;h=s/2;b=125;t=71;n=32;m=28;size(s,s);noStroke();fill(229);t(h-t,h-t,h-m,h);t(h-t,h+t,h,h+m);t(h+t,h-t,h,h-m);t(h+t,h+t,h+m,h);fill(#9999FF);t(h-t,h-t,h,h-m);t(h-t,h+t,h-m,h);t(h+t,h-t,h+m,h);t(h+t,h+t,h,h+m);t(h-b,h,h-n,h-n);t(h+b,h,h+n,h+n);t(h,h-b,h+n,h-n);t(h,h+b,h-n,h+n);fill(229);t(h-b,h,h-n,h+n);t(h+b,h,h+n,h-n);t(h,h-b,h-n,h-n);t(h,h+b,h+n,h+n);fill(color(0));text("NW",h-t-14,h-t-2);text("NE",h+t+2,h-t-2);text("SW",h-t-14,h+t+10);text("SE",h+t,h+t+10);text("N",h-5,h-b-5);text("S",h-5,h+b+12);text("E",h+b+2,h+5);text("W",h-b-14,h+5);}void t(int a,int b,int c,int d){triangle(h,h,a,b,c,d);}

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

ви можете отримати обробку тут


3

PHP, 628 байт

для зручності додано кілька перерв на рядки.

$c=$z.create;$h=$c($w=250,$w);$i=$c(530,533);$a=$z.colorallocate;$a($h,$f=255,$f,$f);$a($i,$f,$f,$f);$a($h,229,229,229);$a($h,153,153,$f);
$p=$z.filledpolygon;$p($h,$o=[0,64,0,0,141,141,],3,2);$p($h,[64,0]+$o,3,1);$p($h,$o=[0,$w,0,0,57,57],3,1);$p($h,[$w,0]+$o,3,2);
$c=$z.copy;$r=$z.rotate;$c($i,$h,263,267,0,0,$w,$w);$c($i,$r($h,90,0),263,17,0,0,$w,$w);$c($i,$r($h,180,0),13,17,0,0,$w,$w);$c($i,$r($h,270,0),13,267,0,0,$w,$w);
$s=$z.string;$s($i,5,259,0,N,3);$s($i,5,259,518,S,3);$s($i,5,0,259,W,3);$s($i,5,518,259,E,3);$s($i,5,106,108,NW,3);$s($i,5,406,108,NE,3);$s($i,5,406,410,SE,3);$s($i,5,106,410,SW,3);
imagepng($i,"n.png");

Бігайте з -r. Створює файл n.pngіз зображенням; одиниця - 2 пікселя.

Я мушу визнати, що я знайшов координати для вітрів методом проб і помилок, і вони, ймовірно, трохи відключені. Зробимо розрахунки незабаром; але обіцяю: вони не змінять кількість байтів.
Мені було весело зараз розкопати мою тригнонометрію і боротися з imagecopy... що за сиси!

з гольфу: не багато фокусів; але ці кілька заощадили багато:

  • Присвоєння імен функцій та двох значень змінним, ймовірно, мало найбільший вплив.
    Я навіть не рахував раніше, ніж замінив імена функцій.
  • Магія з +оператором масиву дала 42 байти.
  • Написання файлу замість надсилання зображення в браузер зберегло 27 байт.
  • Переміщення призначень до першого використання змінних дало ще кілька.

PHP Північна зірка

зламатися

// create images and allocate colors
$c=imagecreate;
$h=$c($w=250,$w);   // helper image - just as large as needed or imagecopy will screw up 
$i=$c(530,533);     // main image

$a=imagecolorallocate;
$a($h,$f=255,$f,$f);    // white is 0
$a($i,$f,$f,$f);    // must be assigned to both images
$a($h,229,229,229); // grey is 1
$a($h,153,153,$f);  // purple is 2

// draw the south-east quadrant
$p=imagefilledpolygon;
// small triangle purple first
$p($h,$o=[
// point 3: 0.8*e *2
    0,64,
// point 1: center
    0,0,
// point 2: a=45 degrees, d=200 units
    141,141,// d/sqrt(2)=141.421356
],3,2);
// small triangle grey
$p($h,[64,0]+$o,3,1);

// large triangles
$p($h,$o=[
    0,$w,
    0,0,
    57,57   // e*sqrt(2)=56.5685424949
],3,1);

$p($h,[$w,0]+$o,3,2);

// create rose
$c=imagecopy;
$r=imagerotate;
$c($i,$h,263,267,0,0,$w,$w);            // copy quadrant to main image (SE)
$c($i,$r($h,90,0),263,17,0,0,$w,$w);    // rotate quadrant and copy again (NE)
$c($i,$r($h,180,0),13,17,0,0,$w,$w);    // rotate and copy again (NW)
$c($i,$r($h,270,0),13,267,0,0,$w,$w);// rotate and copy a last time (SW)

// add circle
#imageellipse($i,263,267,500,500,2);    // grey is now 2: imagecopy shuffled colors

// add names
$s=imagestring;
$s($i,5,259,  0,N,3);   // 5 is actually the largest internal font PHP provides
$s($i,5,259,518,S,3);   // unassigned colors are black
$s($i,5,  0,259,W,3);
$s($i,5,518,259,E,3);

$s($i,5,106,108,NW,3);
$s($i,5,406,108,NE,3);
$s($i,5,406,410,SE,3);
$s($i,5,106,410,SW,3);

// output
#header("Content-Type:image/png");
#imagepng($i);
imagepng($i,"n.png");

1

R, 877 850 813

У цьому є багато місця для гольфу, я підозрюю, але я хотів щось зрозуміти, чи вдалось дотримуватися правил.

Редагувати: Втратив кілька прибирань навколо створення полігону, набрав кілька контурів

a=45;b=90;c=125;e=40;h=c(0,0,b,a,a,0,a,b)*pi/180;i=c(0,c,c,100,e,a,(2*a^2)^.5,a);x=i*sin(h);y=i*cos(h);q=x[6:7];r=x[7:8];s=x[2:3];t=x[c(5,5)];u=y[6:7];v=y[7:8];w=y[2:3];z=y[c(5,5)];m=(s-t);n=(w-z);o=(q-r);p=(u-v);i=((q*v-u*r)*m-o*(s*z-w*t))/(o*n-p*m);x=c(x,i)[c(1,2,5,1,3,5,5,4,10,5,4,9)];y=c(y,rev(i))[c(1,2,5,1,3,5,5,4,10,5,4,9)];png("1.png",400,400);par(mar=rep(0,4));a=c(-200:200);plot(a,a,type="n");for(b in 0:3){for(i in(0:3)*3+1){a=c(1,1,1,-1,-1,-1,-1,1);polygon(x[(i):(i+3)]*a[b*2+1],y[(i):(i+3)]*a[b*2+2],border=NA,col=c("#9999FF","#E5E5E5")[(i%%6%/%4+b%%2)%%2+1]);}};for(i in 1:4){a=c("N","NE","E","SE","S","SW","W","NW");b=a[i*2-1];c=a[i*2];o=c(1,1,-1,-1,1);n=o[i+1];m=o[i];e=c(5,2)[i%%2+1];text((x[e]+(11*abs(i%%2-1)))*m,(y[e]+(12*i%%2))*n,b,cex=1.8);text((x[8]+10)*m,(y[8]+12)*n,c,cex=1.8)};dev.off()

Це створює наступне зображення PNG

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

Трохи пояснення того, що я роблю

a=45;
b=90;
c=125;
e=40;
h=c(0,0,b,a,a,0,a,b)*pi/180;            # angles to known vertices in one quadrant
i=c(0,c,c,100,e,a,(2*a^2)^.5,a);        # distances to known vertices
x=i*sin(h);                             # calculate x ordinates
y=i*cos(h);                             # calculate y ordinates
q=x[6:7];                               #-----------------------
r=x[7:8];                               #
s=x[2:3];                               # Get the lines required 
t=x[c(5,5)];                            # to determine the vertex
u=y[6:7];                               # for the minor pointers
v=y[7:8];                               #
w=y[2:3];                               # 
z=y[c(5,5)];                            #------------------------ 
m=(s-t);                                # Intersect them
n=(w-z);                                # to give coordinate.
o=(q-r);                                # Just calculate the x's
p=(u-v);                                # as they can be reversed
i=((q*v-u*r)*m-o*(s*z-w*t))/(o*n-p*m);  #------------------------
x=c(x,i)[c(1,2,5,1,3,5,5,4,10,5,4,9)];      # X Triangle groups
y=c(y,rev(i))[c(1,2,5,1,3,5,5,4,10,5,4,9)]; # Y Triangle groups
png("1.png",400,400);                   # Set output to png
par(mar=rep(0,4));                      # Make margins 0
a=c(-200:200);
plot(a,a,type="n");                     # Start plot
for(b in 0:3){for(i in(0:3)*3+1){       # draw polygons, alternating colors and drawing all quadrants
a=c(1,1,1,-1,-1,-1,-1,1);
polygon(x[(i):(i+3)]*a[b*2+1],y[(i):(i+3)]*a[b*2+2],border=NA,col=c("#9999FF","#E5E5E5")[(i%%6%/%4+b%%2)%%2+1]);
}};
for(i in 1:4){                          # Add text to compass points for each quadrant
a=c("N","NE","E","SE","S","SW","W","NW");b=a[i*2-1];c=a[i*2];
o=c(1,1,-1,-1,1);n=o[i+1];m=o[i];
e=c(5,2)[i%%2+1];
text((x[e]+(11*abs(i%%2-1)))*m,(y[e]+(12*i%%2))*n,b,cex=1.8);
text((x[8]+10)*m,(y[8]+12)*n,c,cex=1.8)
};
dev.off()                               # Close PNG

1

Математика, 347 байт

p=q={{0,0},{0,125},40{1/Sqrt[2],1/Sqrt[2]}};q[[3,1]]*=-1;m=5p[[3]]/2;s=u={{0,0},m,{32,0}};u[[3]]={0,32};r={{0,1},{-1,0}};t=Polygon[#]&;z=MatrixPower[r,#]&;a[v_]:=Table[t[z[n].#&/@v],{n,4}];i=Table[Text[#[[j]],z[j].#2],{j,4}]&;G=RGBColor["#E5E5E5"];Graphics[{i[{E,S,W,N},{0,130}],i[{NE,SE,SW,NW},1.06m],G,a[u],RGBColor["#9999FF"],a[s],a[p],G,a[q]}]

Попередньо:

p = q = {{0, 0}, {0, 125}, 40 {1/Sqrt[2], 1/Sqrt[2]}}; (*defining points*)
q[[3, 1]] *= -1;                                       (*for triangles*)
m = 5 p[[3]]/2;
s = u = {{0, 0}, m, {32, 0}};
u[[3]] = {0, 32};
r = {{0, 1}, {-1, 0}};                                 (*-pi/2 rotation matrix*)

t = Polygon[#] &;
z = MatrixPower[r, #] &;
a[v_] := Table[t[z[n].# & /@ v], {n, 4}];              (*rotate the sets of points*)
                                                       (*four times*)

i = Table[Text[#[[j]], z[j].#2], {j, 4}] &;
G = RGBColor["#E5E5E5"];                               (*need to use this twice*)
                                                       (*so triangles overlap*)
                                                       (*properly so define a variable*)

Graphics[{i[{E, S, W, N}, {0, 130}], 
  i[{NE, SE, SW, NW}, 1.06 m], G, a[u], RGBColor["#9999FF"], a[s], 
  a[p], G, a[q]}]

Nі E(основа природного журналу) є вбудованими в Mathematica, але оскільки текст E стає стилізованим до малого шрифту, який ви бачите на зображенні, але проблема не зовсім говорить про те, що ми можемо використовувати лише один шрифт для всього тексту. Якщо цю вимогу , то замінити Eз "E"і я отримую два байта.

Sqrt[2]в Mathematica можна стилізувати на два символи, тож якщо рахувати кожного Sqrt[2]як два символи, то мій новий байт - 339 замість 349.

Зображення, представлене нижче, створюється.

Компас

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.