Wielki, biały, północ!


11

Eh!

Problem z nami, Kanadyjczykami, polega na tym, że czasami po długim dniu polowań na łosie i naprawy tam zapominamy, jak wracamy do naszych kabin! Czy nie byłoby wspaniale, gdyby nasz poręczny laptop (który zawsze był po naszej stronie) miał jakiś sposób, aby skierować nas do domu? Cóż, od dawna mówiono, że jeśli wyświetlasz kompas na swoim komputerze, będzie najjaśniejszy, gdy wskaże północ. Chciałbym to przetestować, ale potrzebuję kompaktowego programu, który zabiorę ze sobą na następną podróż, ponieważ mój dysk twardy jest już wypełniony przepisami na syrop klonowy (i te NIE MOGĄ iść). Twoim zadaniem jest zaprojektowanie programu, który po uruchomieniu zapisuje lub wyświetla obraz następującej róży kompasu:

Róża wiatrów

Litery mogą mieć inną czcionkę. Pamiętaj, że najmniej jest najlepsze, więc wygrywa najmniejsza liczba bajtów!

Dane techniczne

Zabarwienie

  • Jasnofioletowy: # 9999FF
  • Szary: # E5E5E5

Długości i kąty

Specyfikacja Rose

  • Kąt a= 45 °
  • Kąt b= 90 °
  • Długość c= 250 jednostek
  • Długość d= 200 jednostek
  • Długość e= 40 jednostek
  • Długość f= 45 jednostek

Wyjaśnienia

  • Tekst może być dowolną odpowiednią czcionką, w stosownych przypadkach oznacza, że ​​jest czytelny dla przeciętnego, wykształconego człowieka.
  • Tekst musi znajdować się w odległości 3 jednostek od kolców w najbliższym punkcie, nie może dotykać róży i musi być ustawiony pionowo
  • Jeśli linia jest rysowana od środka róży, przez punkt końcowy kolca i dalej, powinna przecinać środek tekstu z dokładnością do +/- 2 jednostek (tekst musi być wyśrodkowany wzdłuż osi a, gdzie arozciąga się od środka strony, przez koniec piku i dalej)
  • Każda postać musi mieć co najmniej 15 jednostek na 15 jednostek i mieć stosunek x / y lub y / x nie większy niż 2: 1 (brak rozciągania - czytelność)
  • Nie należy rysować przyciemnionego koła przechodzącego przez dłuższe kolce i tekst znajdujący się najbliżej środka obrazu odniesienia.
  • Obraz musi być kwadratowy i mieć co najmniej 400 na 400 pikseli
  • Skompresowany obraz w źródle jest niedozwolony
  • Jednostka musi mieć co najmniej 1 piksel

Kiedy mówisz „przepisy na syrop klonowy”, masz na myśli przepisy na syrop klonowy, czy przepisy na syrop klonowy? Ponieważ nie mogę sobie wyobrazić, że byliby pierwsi ...
Joe Z.

@JoeZ. Oba, oczywiście ... (;
globby,

Odpowiedzi:


7

HTML + CSS, 487 + 189 = 676

Róża kompasu jest zbudowana z granic CSS przy użyciu techniki trójkąta i kilku podstawowych przekształceń. Litery mają właśnie ustalone pozycje, więc okazało się, że są dość długie: /

Poniższy fragment kodu jest skalowany w dół, dzięki czemu wszystko pasuje. Możesz sprawdzić JSFiddle tutaj . Ponadto nie jestem pewien, jak dobrze litery będą się układać w różnych przeglądarkach (z różnymi czcionkami, domyślnymi stylami itp.).

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>


Wygląda na to, że wokół środka znajduje się małe szare pudełko, które uniemożliwiło korzystanie z kompasu. Czy jest jakaś szansa, że ​​możesz to naprawić?
globby,

1
@globby nie pojawia się dla mnie. Czy możesz opublikować zrzut ekranu?
grc

imgur.com/dYQoLcM,sSrR94O Korzystanie z Mozilla Firefox 35.0 w systemie Windows 8.1
globby

@globby, które może być efektem skalowania. Czy dzieje się to na pełnowymiarowym JSFiddle?
grc

3

Przetwarzanie 2 - 636

Szybkie rozwiązanie, które rysuje wszystkie trójkąty za pomocą metody trójkąta przetwarzania, a następnie umieszcza litery na ich końcach.

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

wprowadź opis zdjęcia tutaj

możesz uzyskać przetwarzanie tutaj


3

PHP, 628 bajtów

dodano kilka podziałów liniowych dla wygody.

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

Uruchom z -r. Tworzy plik n.pngz obrazem; jednostka ma 2 piksele.

Muszę przyznać, że próbowałem znaleźć błędy dla wiatrów metodą prób i błędów i prawdopodobnie są one nieco wyłączone. Wkrótce wykona obliczenia; ale obiecuję: nie zmienią liczby bajtów.
Dobrze się bawiłem, odkrywając teraz swoją trignonometrię i walcząc z imagecopy... co za maminsynka!

w golfa: niewiele sztuczek; ale ci nieliczni wiele zaoszczędzili:

  • Największy wpływ miało prawdopodobnie przypisanie nazw funkcji i dwóch wartości do zmiennych.
    Nie liczyłem nawet przed zamianą nazw funkcji.
  • Magia z +operatorem macierzy dała 42 bajty.
  • Zapisanie pliku zamiast wysłania obrazu do przeglądarki pozwoliło zaoszczędzić 27 bajtów.
  • Przeniesienie przypisań do pierwszego użycia zmiennych dało jeszcze kilka.

PHP North Star

awaria

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

Podejrzewam, że jest dużo miejsca na grę w golfa, ale chciałem dostać coś, by sprawdzić, czy uda mi się spełnić zasady.

Edycja: Straciłem kilka porządków wokół tworzenia wielokąta, zyskałem kilka konturów usuwania

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

To daje następujący obraz png

wprowadź opis zdjęcia tutaj

Trochę wyjaśnienia tego, co robię

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 bajtów

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

Ni E(podstawa dziennika naturalnego) są wbudowane w Mathematica, ale gdy tekst E staje się stylizowany na małą czcionkę, którą widzisz na obrazie, ale problem nie do końca mówi, że możemy użyć tylko jednej czcionki dla całego tekstu. Jeśli tak jest to wymóg następnie zastąpić Ez "E"i zdobyć dwa bajty.

Sqrt[2]w Mathematica można stylizować na dwa znaki, więc jeśli policzymy każdy Sqrt[2]jako dwa znaki, to mój nowy bajt będzie miał 339 zamiast 349.

Poniższy obraz został utworzony.

Kompas

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.