Le Grand, Blanc, Nord!


11

Eh!

Vous savez, le problème avec nous, Canadiens, c'est que parfois, après une longue journée de chasse à l'orignal et de réparation de barrages, nous oublions notre chemin de retour vers nos chalets! Ne serait-il pas formidable que notre portable pratique (qui est toujours à nos côtés) puisse nous diriger vers la maison? Eh bien, on dit depuis longtemps que si vous affichez une boussole sur votre ordinateur, elle sera la plus brillante lorsqu'elle sera pointée vers le nord. Je voudrais tester cela, mais j'ai besoin d'un programme compact à emporter avec moi lors de mon prochain voyage, car mon disque dur est déjà rempli de recettes de sirop d'érable (et celles-ci NE PEUVENT PAS aller). Donc, votre tâche est de me concevoir un programme qui, une fois exécuté, enregistre ou affiche une image de la rose des vents suivante:

Rose des Vents

Les lettres peuvent être dans une police différente. N'oubliez pas que le moins est le meilleur, donc le nombre d'octets le plus bas gagne!

Caractéristiques

Couleurs

  • Violet clair: # 9999FF
  • Gris: # E5E5E5

Longueurs et angles

Spécifications Rose

  • Angle a= 45 °
  • Angle b= 90 °
  • Longueur c= 250 unités
  • Longueur d= 200 unités
  • Longueur e= 40 unités
  • Longueur f= 45 unités

Clarifications

  • Le texte peut être dans n'importe quelle police appropriée , le cas échéant indiquant qu'il est lisible pour l'être humain moyen et instruit.
  • Le texte doit être à 3 unités des pointes à son point le plus proche, ne doit pas toucher la rose et doit être droit
  • Si une ligne est tracée à partir du centre de la rose, à travers le point final de la pointe et au-delà, elle doit traverser le centre du texte avec une précision de +/- 2 unités (le texte doit être centré le long d'un axe a, où as'étend du milieu de la page, jusqu'à la fin du pic et au-delà)
  • Chaque caractère doit être d'au moins 15 unités par 15 unités et avoir un rapport x / y ou y / x ne dépassant pas 2: 1 (pas d'étirement - lisibilité)
  • Le cercle sombre passant par les pointes plus longues et le texte le plus proche du milieu sur l'image de référence ne doit pas être tracé.
  • L'image doit être carrée et d'au moins 400 pixels sur 400 pixels
  • Une image compressée dans la source est interdite
  • Une unité doit être d'au moins 1 pixel

Quand vous dites «recettes de sirop d'érable», voulez-vous dire des recettes pour faire du sirop d'érable, ou des recettes pour faire des choses avec du sirop d'érable? Parce que je ne peux pas vraiment imaginer qu'ils seraient les anciens ...
Joe Z.

@JoeZ. Les deux, évidemment ... (;
globby

Réponses:


7

HTML + CSS, 487 + 189 = 676

La rose des vents est construite à partir des bordures CSS en utilisant la technique du triangle et quelques transformations de base. Les lettres ont juste des positions fixes, ce qui s'est avéré assez long: /

L'extrait de code ci-dessous est réduit afin qu'il corresponde parfaitement. Vous pouvez consulter le JSFiddle ici . De plus, je ne sais pas dans quelle mesure les lettres s'aligneront sur différents navigateurs (avec différentes polices, styles par défaut, etc.).

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>


Il semble qu'il y ait une petite boîte grise au milieu, ce qui a rendu la boussole inutilisable. Y a-t-il une chance que vous puissiez résoudre ce problème?
globby

1
@globby ça ne se présente pas pour moi. Peux-tu envoyer une capture d'écran?
grc

imgur.com/dYQoLcM,sSrR94O Utilisation de Mozilla Firefox 35.0 sur Windows 8.1
globby

@globby qui pourrait simplement être un effet de la mise à l'échelle. Cela se produit-il sur le JSFiddle en taille réelle?
grc

3

Traitement 2 - 636

Une solution rapide qui dessine tous les triangles à l'aide de la méthode du triangle de traitement, puis place les lettres à leur extrémité.

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);}

entrez la description de l'image ici

vous pouvez obtenir le traitement ici


3

PHP, 628 octets

ajouté quelques sauts de ligne pour plus de commodité.

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

Courez avec -r. Crée un fichier n.pngavec l'image; l'unité est de 2 pixels.

Je dois admettre que j'ai trouvé les cordons pour les vents par essais et erreurs, et ils sont probablement un peu décalés. Fera bientôt les calculs; mais je vous le promets: ils ne changeront pas le nombre d'octets.
Je me suis amusé à creuser ma trignonométrie et à me débattre avec imagecopy... quelle poule mouillée !

sur le golf: pas beaucoup de tours; mais ces quelques-uns ont économisé beaucoup:

  • L'attribution de noms de fonction et de deux des valeurs aux variables a probablement eu le plus grand impact.
    Je ne comptais même pas avant de remplacer les noms de fonction.
  • La magie avec l' +opérateur de tableau a donné 42 octets.
  • L'écriture d'un fichier au lieu d'envoyer l'image au navigateur a permis d'économiser 27 octets.
  • Le déplacement des affectations à la première utilisation des variables en a donné quelques autres.

PHP North Star

panne

// 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

Beaucoup de place pour jouer au golf, je suppose, mais je voulais obtenir quelque chose pour voir si j'ai réussi à respecter les règles.

Edit: perdu quelques nettoyages autour de la création du polygone, gagné quelques-uns en supprimant les contours

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

Cela produit l'image png suivante

entrez la description de l'image ici

Une petite explication de ce que je fais

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 octets

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

Prégolfé:

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

Net E(base du journal naturel) sont tous deux intégrés dans Mathematica, mais lorsque le texte E est stylisé en une police en minuscules que vous voyez dans l'image, mais le problème ne dit pas tout à fait que nous ne pouvons utiliser qu'une seule police pour tout le texte. Si c'est une exigence, remplacez-la Epar "E"et je gagne deux octets.

Sqrt[2]dans Mathematica peut être stylisé en deux caractères, donc si nous comptons chacun Sqrt[2]comme deux caractères, mon nouveau nombre d'octets est de 339 au lieu de 349.

L'image ci-dessous est produite.

Boussole

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.