Великий, Белый, Север!


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 пикселя

Когда вы говорите «рецепты кленового сиропа», вы имеете в виду рецепты приготовления кленового сиропа или рецепты приготовления чего-либо из кленового сиропа? Потому что я не могу себе представить, что они будут прежними ...
Джо З.

@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

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

Pregolfed:

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.