Khiếu nại các Overlords Google của bạn: Vẽ Logo của G G


136

Viết chương trình hoặc hàm nhận số nguyên dương N và xuất ra hình ảnh pixel N × N của logo "G" của Google theo cấu trúc * này:

Xây dựng logo "G"

Ví dụ: nếu N là 400, nên xuất ra logo 400 × 400 pixel, với kích thước và màu sắc chính xác:

Ví dụ "G" logo 400x400

Nó sẽ trông chính xác bất kể N lớn hay nhỏ. ví dụ ở đây là N = 13:Ví dụ "G" logo 13x13

Mã của bạn không cần kết nối với internet. Ví dụ, không cho phép mở rộng một Svg lưu trữ bên ngoài. (Chia tỷ lệ một Svg được mã hóa trong mã của bạn sẽ ổn thôi.)

Khử răng cưa có thể được sử dụng hoặc không. Tuỳ bạn.

Lưu ý rằng thanh ngang của "G" không mở rộng hết sang cạnh phải của hình ảnh. Vòng tròn cong bình thường vào bên trong cạnh phải trước khi nó bị cắt.

Mã ngắn nhất tính bằng byte thắng.


* Việc xây dựng logo đã được đơn giản hóa cho thử thách này. Việc xây dựng chính xác có thể được nhìn thấy ở đâyở đây .


1
Có tối thiểu N không? Một hình ảnh 1x1 có thể sẽ tạo ra đầu ra không thể nhận ra bất kể giải pháp tốt như thế nào.
jpmc26

@ jpmc26 N là số nguyên dương, vì vậy tối thiểu 1. Tất nhiên hình ảnh 1x1 không thể nhận ra được, nhưng "Nó sẽ trông chính xác", ví dụ: hình ảnh màu đen sẽ không có ý nghĩa, ngay cả ở tỷ lệ đó.
Sở thích của Calvin

4
Đầu ra dự kiến ​​cho hình ảnh 1x1 là gì? Một pixel của bất kỳ màu nào trong ảnh? Một hình ảnh trắng? Còn 2x2 thì sao? Vẫn còn nhiều màu sắc trong hình ảnh hơn pixel cho kích thước đó. Nếu bất kỳ hình ảnh nào không được chấp nhận ở các tỷ lệ đó, thử thách sẽ xác định những gì là và không thể chấp nhận được, vì bạn không thể tạo ra một hình ảnh thậm chí gần với diện mạo chính xác, phải không? (Nếu đó là thử thách của tôi, tôi sẽ loại trừ chúng để đơn giản, nhưng quyết định của bạn. Bạn cũng cần xác minh rằng bạn không loại trừ câu trả lời hiện có với thông số kỹ thuật mới, tôi nghĩ vậy.)
jpmc26

@ jpmc26 Không. Mọi người có thể sử dụng thông thường để biết liệu 1x1 hoặc hình ảnh nhỏ khác có vẻ chính xác hay không.
Sở thích của Calvin

Chúng tôi có được phép tải xuống một bản dựng sẵn .svgvà mã hóa nó vào giải pháp của chúng tôi không, hay chúng tôi phải tạo ra nó ban đầu?
juniorRubyist

Câu trả lời:


55

Mathicala, 229 226 225 224 221 206 169 byte

Cảm ơn @MartinEnder cho 1 byte, @ChipHurst cho 37 byte!

Graphics[{RGBColor@{"#EA4335","#FBBC05","#34A853","#4285F4"}[[#]],{0,-1}~Cuboid~{√24,1},Annulus[0{,},{3,5},{(2#-9)Pi/4,ArcCsc@5}]}&~Array~4,ImageSize->#,PlotRange->5]&

Thật là một thử thách thú vị!

Giải trình

...&~Array~4

Lặp lại từ 1 đến 4 ...

RGBColor@{"#EA4335","#FBBC05","#34A853","#4285F4"}[[#]]

Chuyển đổi mã hex màu thành RGBColorcác đối tượng, để chúng có thể được áp dụng cho đồ họa logo của Google. Thay đổi bảng màu thành <input>màu thứ.

{0,-1}~Cuboid~{√24,1}

Tạo một hình chữ nhật đầy (hình khối 2D), có các góc chéo là (0, -1) và (sqrt (24), 1).

Annulus[0{,},{3,5},{(2#-9)Pi/4,ArcCsc@5}]}

Tạo bốn phần tư đầy Annulus, tập trung ở điểm gốc, với bán kính trong 3 và bán kính ngoài 5. Không vẽ quá khứ ArcCsc@5(nơi đoạn màu xanh kết thúc).

Graphics[ ... , ImageSize->#,PlotRange->5]

Tạo một đồ họa có kích thước N x N, từ x = -5 đến x = 5 (loại bỏ phần đệm).

Đầu ra

N = 10

nhập mô tả hình ảnh ở đây

N = 100

nhập mô tả hình ảnh ở đây

N = 200

nhập mô tả hình ảnh ở đây

N = 10000 (nhấp vào hình ảnh để có độ phân giải đầy đủ)

nhập mô tả hình ảnh ở đây


44

C (Windows), 311 byte

#include <windows.h>
main(int c,char**v){float x,y,a,b,N=atoi(*++v);HDC d=GetDC(GetDesktopWindow());for(x=0;x<N;x+=1)for(y=0;y<N;y+=1){a=2*x/N-1;b=2*y/N-1;SetPixel(d,x,y,(a>0&&a<.8&&b*b<.04)?0xF48542:(a*a+b*b>1||a*a+b*b<.36)?0xFFFFFF:(a*a<b*b)?((b<0)?3490794:5482548):(a<0)?376059:(b<-.2)?0xFFFFFF:0xF48542);}}

Lấy "N" làm đối số dòng lệnh và vẽ trực tiếp trên màn hình.

Chưa chơi gôn:

#include <windows.h>
// atoi() will work fine without any #include file!
// -> don't #include it!

main(int c,char **v)
{
    float x,y,a,b,N=atoi(*++v);

    /* Access the screen for directly drawing! */
    HDC d=GetDC(GetDesktopWindow());

    /* Iterate over the pixels */
    for(x=0;x<N;x+=1)
        for(y=0;y<N;y+=1)
    {
        /* Convert x,y into "relative" coordinates: The image
         * is 2.0x2.0 in size with (0.0,0.0) in the center */
        a=2*x/N-1;
        b=2*y/N-1;

        /* Draw each pixel */
        SetPixel(d,x,y,
            (a>0 && a<.8 && b*b<.04)?0xF48542: /* The bar of the "G" in the middle */
            (a*a+b*b>1 || a*a+b*b<.36)?0xFFFFFF: /* Not on one of the circle segments */
            (a*a<b*b)?((b<0)?0x3543EA:0x53A834): /* Top and bottom segments */
            (a<0)?0x5BCFB: /* Left segment */
            (b<-.2)?0xFFFFFF:0xF48542); /* Right segment: A bit more complicated... */
    }

    /* Note: Under good old Windows 3.x we would require to
     * call "ReleaseDC" here; otherwise the system would
     * "crash" (however the image would have been drawn!)
     * No need for this in modern Windows versions! */
}

Bạn có thể giữ 0xF485420xFFFFFFtrong số nguyên.
Yytsi

Trình biên dịch / liên kết nào bạn đã sử dụng? Không hoạt động với mingw
vsz

@vsz Có lẽ, trình biên dịch của Visual Studio.
Kroltan

@vsz Tôi có thể biên dịch nó gcc g.c -lgdi32trên mingw.
jingyu9575

2
-1>>8cũng có thể làm việc
Mark K Cowan

33

Python 2, 244 220 byte

sử dụng phép biến đổi Martin Rosenau trên mặt phẳng [-1,1] ^ 2 và chơi gôn nhỏ như loại bỏ 0.hoặc dấu ngoặc

N=input()
R=[2*z/(N-1.)-1for z in range(N)]
B="\xFF"*3,"B\x85\xF4"
print"P6 %d %d 255 "%(N,N)+"".join([B[0<x<.8and.04>y*y],["4\xA8S",B[y>-.2],"\xFB\xBC\x05","\xEAC5"][(x>y)+2*(-x>y)]][.36<x*x+y*y<1]for y in R for x in R)

Giải trình:

N=input()
R=[2*z/(N-1.)-1for z in range(N)]
#N*N points on the [-1,1]^2 plane

B="\xFF"*3,"B\x85\xF4"
#white and blue

print"P6 %d %d 255 "%(N,N) + "".join(
#binary PPM header
 [
  B[0<x<.8and.04>y*y],
  #blue rectangle part of the G, or white
  ["4\xA8S",B[y>-.2],"\xFB\xBC\x05","\xEAC5"][(x>y)+2*(-x>y)]
  #[green, [white,blue], yellow, red]-arcs with 4 way selector
 ]
 [.36<x*x+y*y<1]
 #radius checker, outside=0 blue rectangle or white, inside=1 colored arcs
  for y in R for x in R
  #for all points
 )

Đầu ra dưới dạng PPM nhị phân, sử dụng:

python golf_google.py > google.ppm

Ví dụ

  • 13

13

  • 50

50

  • 100

100

  • 1337

1337

giải pháp 244 byte trước đó

N=input()
S="P6 %d %d 255 "%(N,N)
R=range(N)
B=["\xFF"*3,"B\x85\xF4"]
for Y in R:
 for X in R:y=Y-N/2;x=X-N/2;S+=[B[0<x<0.4*N and abs(y)<0.1*N],["4\xA8S",B[y>-0.1*N],"\xFB\xBC\x05","\xEAC5"][(x>y)+2*(-x>y)]][0.3*N<(y**2+x**2)**.5<0.5*N]
print S

Phiên bản beta đã bị hủy trước khi loại bỏ nếu / khác:

N=input()
print"P3 %d %d 255 "%(N,N)
R=range
M=N/2
r="255 0 0 "
g="0 255 0 "
b="0 0 255 "
c="255 255 0 "
w="255 255 255 "
for Y in R(N):
 for X in R(N):
  y=Y-M
  x=X-M
  d=(y**2+x**2)**.5 #radius
  if 0.3*N<d<0.5*N: #inside circle
   if x>y:          #diagonal cut bottom-left to top right
    if -x>y:        #other diagonal cut
     print r
    else:
     if y>-0.1*N:print b #leave some whitespace at blue
     else: print w
   else:
     if -x>y:
      print c
     else:
      print g
  else:
   if 0<x<0.4*N and -0.1*N<y<0.1*N: #the straight part of G
    print b
   else:
    print w

Hmm, không chắc chắn nếu 1forhoạt động.
Yytsi

1
@TuukkaX Nó làm.
mbomb007

Bạn có thể bao gồm đầu ra mẫu?
Cyoce

@TuukkaX cảm ơn vì 1for đầu ra mẫu @Cyoce đã được thêm vào
Karl Napf

Tất cả số thập phân trong mã của bạn ở dạng 0.xcó thể được giảm xuống .x:)
Yytsi

27

JavaScript (ES6), 408 ... 321 317 byte

384 383 371 367 359 327 316 308 304 byte JavaScript + 24 13 byte cho phần tử canvas

(f=d.style).width=f.height=(d.width=d.height=n=prompt(f.background='#FFF'))+'px';q=n/2;with(d.getContext`2d`)['#EA4335','#FBBC05','#34A853','#4285F4'].map((c,i)=>beginPath(lineWidth=y=n/5,strokeStyle=fillStyle=c,arc(q,q,z=q-y/2,(j=2*i+1)*(r=-.7854),(j+(i-3?2:1.256))*r,1),stroke(),fillRect(q,z,q*.98,y)))
<canvas id=d>

Lưu 1 byte bằng cách vẽ ngược chiều kim đồng hồ.
11 byte được lưu trên HTML nhờ Conor O'Brien.
12 byte được lưu bằng cách sử dụng withkhối nhờ Prinzhorn.
4 byte được lưu với việc sử dụng tốt hơnz=q-y/2 .
8 byte được lưu bằng cách sử dụng parentNodebackgroundcảm ơn Alexis Tyler.
32 byte được lưu bằng cách sử dụng bản vẽ chính xác hơn của cung / thanh màu xanh để tôi không cần phải xóa một phần của nó nữa.
11 byte được lưu bằng cách đặt canvas css thay vì chaNode của nó nhờ Tejas Kale.
8 byte được lưu bằng cách sử dụng withmapvới một câu lệnh duy nhất, `2d` thay vì ('2d'), n/5thay vì .2*nvà khởi tạo nền trong prompt(...). có vẻ đủ chính xác nhờ RobAu.
4 byte được lưu thay thế Math.PI/4bởi.7854


Giải trình:

(f=d.style).width=f.height=(d.width=d.height=n=prompt(f.background='#FFF'))+'px';q=n/2 

Kích thước vải được khởi tạo với đầu vào của người dùng và nền được đặt thành màu trắng. qđược khởi tạo.

with(d.getContext`2d`)['#EA4335','#FBBC05','#34A853','#4285F4'].map((c,i)=>beginPath(lineWidth=y=n/5,strokeStyle=fillStyle=c,arc(q,q,z=q-y/2,(j=2*i+1)*(r=-.7854),(j+(i-3?2:1.256))*r,1),stroke(),fillRect(q,z,q*.98,y)))

Đối với mỗi màu vẽ phần hình tròn, với một số điều chỉnh cho phần cuối cùng (màu xanh). Thanh được vẽ cho mỗi màu tại cùng một vị trí có cùng kích thước để chỉ có thể nhìn thấy màu cuối cùng (màu xanh).


2
<canvas id=d></canvas>nên làm việc, và <canvas id=d>có thể làm việc.
Conor O'Brien

1
Bạn có thể mất thêm 5 ký tự bằng cách thay thế nềnColor bằng nền.
Alexis Tyler

1
Đồng thời sử dụng d.parentNode thay vì d.parentEuity
Alexis Tyler

1
Tại sao bạn lại đặt kích thước ParentNode. Chỉ d.stylehoạt động quá. Cho phép(f = d.style).width = f.height = n = prompt() + 'px';
Tejas Kale

1
Bạn có thể sử dụng .785398thay vì Math.PI/4cạo đi 2 byte (hoặc nhiều hơn nếu độ chính xác thấp hơn là được.
RobAu

25

BBC BASIC, 177 byte

Tải xuống thông dịch viên tại http://www.bbcbasic.co.uk/bbcwin/doad.html

I.n
V.19;16,234,67,53,275;64272;1468;531;16,43060;83,787;16,34114;7668;n;n;
F.t=1TO8.256S.1/n
a=t*PI/4y=n*SIN(a)x=n*COS(a)V.18;t-1>>1,25,85,x*.6;y*.6;25,85,x;y;
N.PLOT101,0,-n/5

BBC BASIC sử dụng 2 đơn vị = 1 pixel, vì vậy chúng tôi vẽ một G nđơn vị bán kính (= n / 2 pixel) ở giữa n,n.

Ý tưởng là vẽ một loạt các đường xuyên tâm, thay đổi màu sắc cho phù hợp. Nó đã được tìm thấy rằng có những khoảng trống nhỏ giữa các dòng do cắt ngắn các số khi được chuyển đổi thành pixel, vì vậy các hình tam giác mỏng thực sự được vẽ thay thế.

Khi quá trình quét các dòng được hoàn thành, con trỏ nằm ở góc trên cùng bên phải của khu vực màu xanh. Một tọa độ duy nhất cho góc đối diện chéo được đưa ra để vẽ một hình chữ nhật để hoàn thành hình dạng.

Ung dung

INPUTn
REM reprogram pallette
VDU19;16,&EA,&43,&35,275;16,&FB,&BC,5,531;16,&34,&A8,&53,787;16,&42,&85,&F4
ORIGINn,n               :REM move origin to position n,n on screen.
FORt=1TO8.256STEP1/n    :REM from 1/8 turn to 8.56 turns in small steps
  GCOL0,t-1>>1          :REM set the colours, 0=red, 1=yellow, 2=green, 3=blue
  a=t*PI/4              :REM convert angle from 1/8 turns into radians
  y=n*SIN(a)            :REM find position of outer end of ray
  x=n*COS(a)            :REM plot to coordinates of inner and outer ends of ray
  PLOT85,x*.6,y*.6      :REM PLOT85 actually draws a triangle between the specified point              
  PLOT85,x,y            :REM and the last two points visited.
NEXT                    
PLOT101,0,-n/5          :REM once all is over, cursor is at top right corner of blue rectangle. Draw a rectangle to the bottom left corner as specified.

Công việc tốt đẹp! Tôi đã khai thác Logo bằng một phương pháp tương tự trước khi tôi thấy câu trả lời của bạn. Bạn đã đánh bại tôi khoảng 81 byte.
GuitarPicker

21

HTML / JS, 680 624 byte

Để có được 624 byte, hãy xóa cái cuối cùng ;, điều này là cần thiết cho đoạn mã dưới đây do cách nó nhập HTML. Ngoài ra, Firefox dường như không hỗ trợ image-rendering: pixelatedvà nhu cầu -moz-crisp-edgesthay thế (cảm ơn @alldayremix !), Điều này tạo ra một giải pháp Firefox +7 nhưng điều này không hoạt động trong Chrome như mong đợi.

Sử dụng JavaScript để yêu cầu Nvà một <style>khối để định vị / tô màu các phần tử. Sử dụng các yếu tố HTML cơ bản, thay vì áp dụng các kiểu cho khung vẽ (mà nó xuất hiện là một cách tiếp cận ngắn hơn nhiều!). Đây là một cách tiếp cận được tân trang lại bằng cách sử dụng data:hình nền URI thay vì chỉ các phần tử được tô màu. Tôi đã giữ cách tiếp cận trước đây bên dưới trong trường hợp cách mới này hoạt động trên ít trình duyệt hơn.

Tôi nghĩ rằng nó sẽ nhỏ hơn rất nhiều so với cuối cùng, nhưng dù sao nó cũng là một bài tập thú vị!

<body id=x onload=x.style.fontSize=prompt()+'px'><u><a></a><b></b><i></i><s><style>u,a,b,i,s{position:relative;display:block}b,i,s{position:absolute}a,u{width:1em;height:1em}a,b{border-radius:50%}a{image-rendering:pixelated;background:url(data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAIAAAACCAIAAAD91JpzAAAAFklEQVQI12N45Wzq1PqF4fceVpMVwQAsHQYJ1N3MAQAAAABJRU5ErkJggg)no-repeat;background-size:100%;transform:rotate(45deg)}b{top:.2em;left:.2em;width:.6em;height:.6em;background:#fff}i{border-top:.4em solid transparent;border-right:.4em solid#fff;top:0;right:0}s{top:.4em;right:.1em;width:.4em;height:.2em;background:#4285f4;

Phiên bản trước:

<body id=x onload=x.style.fontSize=prompt()+'px'><a b><b l style=padding-left:.5em></b><b y></b><b g></b></a><i style=height:.4em></i><i style="background:#ea4335;border-radius:0 1em 0 0;transform-origin:0%100%;transform:rotate(-45deg)"></i><i b z style=top:.2em;left:.2em;width:.6em;height:.6em></i><i l z style="top:.4em;height:.2em;border-radius:0 2%10%0/0 50%50%0;width:.4em"><style>*{position:relative;background:#fff}a,b,i{display:block;float:left;width:.5em;height:.5em}a{height:1em;width:1em;transform:rotate(45deg);overflow:hidden}i{position:absolute;top:0;left:.5em}[b]{border-radius:50%}[g]{background:#34a853}[l]{background:#4285f4}[y]{background:#fbbc05}[z]{z-index:1


1
Kẻ phản bội! (đùa thôi, một cái hay đấy ;-))
Dada

Trên trình duyệt của tôi, phiên bản cũ hiển thị các khoảng trống nhỏ giữa các màu và phiên bản mới cho phép chuyển đổi độ dốc giữa các màu (Firefox 49.0.1 32-bit trên Win10 x64)
alldayremix

1
@alldayremix hmmm, có vẻ như Firefox cần phải có image-rendering: -moz-crisp-edgesthay vì pixelated. Sẽ thêm một ghi chú cho hiệu ứng đó. Tôi khá thích phong cách gradient! :)
Dom Hastings

Tôi đã sửa đổi tiêu đề để đọc "HTML / JS", vì bạn sử dụng cả HTML và Javascript.
Mego

20

Bash với ImageMagick (nhưng thực sự Postscript), 268 255 249 byte

C=' setrgbcolor 2.5 2.5 2'
A=' arc stroke '
echo "%!PS
122.4 dup scale
.92 .26 .21$C 45 136$A.98 .74 .02$C 135 226$A.20 .66 .33$C 225 316$A.26 .52 .96$C 315 371$A
4.95 2.5 moveto
2.5 2.5 lineto
stroke"|convert - -crop 612x612+0+180 -scale "$1" o.png

Nhân đôi tỷ lệ để loại bỏ setlinewidth, thay thế một yếu tố tỷ lệ dupvà hợp nhất một khoảng trắng vào Abiến (không thể C$C45 được phân tích thành "biến C45").

Cảm ơn joojaa đã gợi ý những chỉnh sửa này!

Tỷ lệ cũ, 255 byte

C=' setrgbcolor 5 5 4'
A=' arc stroke'
echo "%!PS
61.2 61.2 scale
2 setlinewidth
.92 .26 .21$C 45 136$A
.98 .74 .02$C 135 226$A
.20 .66 .33$C 225 316$A
.26 .52 .96$C 315 371$A
9.9 5 moveto
5 5 lineto
stroke"|convert - -crop 612x612+0+180 -scale "$1" o.png

Mất N làm đối số đơn độc và xuất ra o.png.

Postcript Ungolfed cho quy mô cũ

%!PS
% Scale so default page has width of 10
61.2 61.2 scale
2 setlinewidth
% Red arc
.92 .26 .21 setrgbcolor
5 5 4 45 136 arc
stroke
% Yellow arc
.98 .74 .02 setrgbcolor
5 5 4 135 226 arc
stroke
% Green arc
.20 .66 .33 setrgbcolor
5 5 4 225 316 arc
stroke
% Blue arc
.26 .52 .96 setrgbcolor
5 5 4 315 371 arc
% Blue in-tick
9.9 5 moveto
5 5 lineto
stroke

2
Bạn có thể làm cho nó ngắn hơn bằng cách cạo một char từ dòng tỷ lệ, 61.2 dup scalebạn cũng có thể thêm một C=' setrgbcolor 5 5 4 'khoảng trắng trong C like và cạo 4 khoảng trắng. Nếu bạn thiết kế cái này ở một nửa tỷ lệ thì bạn có thể bỏ qua2 setlinewidth
joojaa

19

MATLAB, 189 184 byte

[X,Y]=meshgrid(-5:10/(input("")-1):5);[A,R]=cart2pol(-X,Y);I=round(A*2/pi+3);I(R<3)=1;I(X>0&Y.^2<1)=5;I(R>5)=1;image(I)
colormap([1,1,1;[234,67,53;251,188,5;52,168,83;66,133,244]/255])

vô dụng

[X,Y]=meshgrid(-5:10/(input("")-1):5);    % coordinates in 10th of image width
[A,R]=cart2pol(-X,Y);                     % angle and radius
I=round(A*2/pi+3); % map [0-45,45-135,135-225,225-315,315-360] to [1,2,3,4,5]
I(R<3)=1;                                 % clear inner pixels
I(X>0&Y.^2<1)=5;                          % draw horizontal line
I(R>5)=1;                                 % clear outer pixels
image(I)
colormap([1,1,1;[234,67,53;251,188,5;52,168,83;66,133,244]/255])

19

Perl 5, 486 477 476 450 (+7 cho-MImager cờ) = 457 byte

Tôi đã tiết kiệm được một vài byte nhờ Dada bằng cách sử dụng các newcuộc gọi chức năng và loại bỏ parens, và bằng cách sử dụng popthay vì $ARGV[0]dấu chấm phẩy cuối cùng. Tôi đã tiết kiệm thêm một số bằng cách đặt $n=popnó ở nơi nó được sử dụng lần đầu tiên và bằng cách sử dụng ký hiệu không gian tên Perl 4 'thay vì ::.

$i=new Imager xsize=>$n=pop,ysize=>$n;$h=$n/2;$s=$n*.6;$f=$n*.4;$c='color';($b,$r,$y,$g,$w)=map{new Imager'Color"#$_"}qw(4285f4 ea4335 fbbc05 34a853 fff);$i->box(filled=>1,$c,$w);$i->arc($c,$$_[0],r=>$h,d1=>$$_[1],d2=>$$_[2])for[$b,315,45],[$r,225,315],[$y,135,225],[$g,45,135];$i->circle($c,$w,r=>$n*.3,filled=>1);$i->box($c,$b,ymin=>$f,ymax=>$s,xmin=>$h,xmax=>$n*.9,filled=>1);$i->polygon($c,$w,x=>[$n,$n,$s],y=>[0,$f,$f]);$i->write(file=>'g.png')

Nó đòi hỏi Imager mô-đun , cần được cài đặt từ CPAN. Lấy một số nguyên làm đối số dòng lệnh. Hình ảnh không bị khử răng cưa, vì vậy nó hơi xấu.

Sao chép mã dưới đây vào một tệp g.pl. Chúng tôi cần thêm 7 byte cho -MImagercờ, nhưng nó sẽ tiết kiệm được một vài byte vì chúng tôi không cần use Imager;.

$ perl -MImager g.pl 200

Dưới đây là các kích cỡ khác nhau:

N = 10

10px

N = 100

100px

N = 200

200px

Các mã hoàn toàn vô căn cứ là đơn giản.

use Imager;
my $n = $ARGV[0];
my $i = Imager->new( xsize => $n, ysize => $n );

my $blue   = Imager::Color->new('#4285f4');
my $red    = Imager::Color->new('#ea4335');
my $yellow = Imager::Color->new('#fbbc05');
my $green  = Imager::Color->new('#34a853');
my $white  = Imager::Color->new('white');

$i->box( filled => 1, color => 'white' );
$i->arc( color => $blue,   r => $n / 2, d1 => 315, d2 => 45 );     # b
$i->arc( color => $red,    r => $n / 2, d1 => 225, d2 => 315 );    # r
$i->arc( color => $yellow, r => $n / 2, d1 => 135, d2 => 225 );    # y
$i->arc( color => $green,  r => $n / 2, d1 => 45,  d2 => 135 );    # g
$i->circle( color => $white, r => $n * .3, filled => 1 );
$i->box(
    color  => $blue,
    ymin   => $n * .4,
    ymax   => $n * .6,
    xmin   => $n / 2,
    xmax   => $n * .9,
    filled => 1
);
$i->polygon( color => $white, x => [ $n, $n, $n * .6 ], y => [ 0, $n * .4, $n * .4 ] );
$i->write( file => 'g.png' );

Bài đăng này trước đây có mã hình giống như hình ảnh đầu ra. Vì đó là trái với quy tắc cho mã golf, tôi đã phải loại bỏ nó. Xem lịch sử sửa đổi nếu bạn muốn xem qua. Tôi đã sử dụng Acme :: EyeDrops để tạo ra nó, với hình dạng mà tôi đã tạo từ một hình ảnh được tạo bằng chính chương trình mà tôi đã chuyển đổi sang nghệ thuật ASCII. Mã tôi đã xáo trộn đã được đánh golf, có thể được nhìn thấy bằng cách thay thế mã đầu tiên evalbằng a print.


Rất đẹp! Chỉ cần một vài chi tiết về việc chơi golf: popthay vì $ARGV[0]. $h=($n=pop)/2thay vì $n=pop;...;$h=$n/2. new Imager::Color"#$_"thay vì Imager::Color->new("#$_"). (và bạn đã quên bỏ dấu chấm phẩy cuối cùng). Nhưng một lần nữa, đó chỉ là một số chi tiết nhỏ, mã của bạn thực sự tuyệt vời! (Tôi không thể làm được! Tôi thậm chí còn không biết Imager, điều này khá thuận tiện!)
Dada

@Dada cảm ơn. Trên thực tế, đó là mã khá đơn giản. Tôi sửa cho mọi người rất nhiều về việc sử dụng ký hiệu phương pháp trên SO đến nỗi thật khó để không làm điều đó trên mục đích. Nhưng bạn nói đúng. Đây là lần đầu tiên tôi sử dụng Imager. Tôi nghĩ rằng tôi đã nhìn thấy nó trong Tuần báo Perl.
simbabque

@Dada sử dụng Imager'Colorvới dấu phân cách không gian tên Perl 4 sẽ lưu một byte khác. :)
simbabque

Thật vậy, lần đầu tiên tôi thấy việc sử dụng cú pháp đó! Ngoài ra, -MImagerngắn hơn use Imager;:)
Dada

1
@Dada Dù sao tôi cũng sẽ làm điều đó: P Và đưa $n=popvào các cuộc tranh luận sẽ newcứu các parens và một dấu chấm phẩy
simbabque

14

PHP + SVG, 300 byte

<svg width=<?=$_GET["w"]?> viewBox=0,0,10,10><def><path id=c d=M0,5A5,5,0,0,1,5,0V2A3,3,0,0,0,2,5 /></def><?foreach(["fbbc05"=>-45,"ea4335"=>45,"4285f4"=>168.5,"34a853"=>225]as$k=>$v)echo"<use xlink:href=#c fill=#$k transform=rotate($v,5,5) />"?><rect x=5 y=4 fill=#4285f4 width=4.9 height=2 /></svg>

Phần chia tỷ lệ là width=<?=$_GET[w]?>

Đầu ra cho giá trị 333

<svg width="333" viewBox="0 0 10 10">
<def><path id="c" d="M 0,5 A 5 5 0 0 1 5,0 V 2 A 3,3 0 0 0 2,5"/></def>
<use xlink:href="#c" fill="#fbbc05" transform="rotate(-45,5,5)"/><use xlink:href="#c" fill="#ea4335" transform="rotate(45,5,5)"/><use xlink:href="#c" fill="#4285f4" transform="rotate(168.5,5,5)"/><use xlink:href="#c" fill="#34a853" transform="rotate(225,5,5)"/>
<rect x="5" y="4" fill="#4285f4" width="4.9" height="2"/>
</svg>


1
Bạn không thể đánh khoảng trống giữa dấu ngoặc kép của các thuộc tính ( ") và thuộc tính tiếp theo? Ví dụ: <svg width="333" viewBox="0 0 10 10">><svg width="333"viewBox="0 0 10 10">
Bojidar Marinov

@BojidarMarinov Vâng, đó là corecct, nó tiết kiệm được một vài byte. Cảm ơn bạn
Jörg Hülsermann

1
Xóa khoảng trắng giữa các chữ cái và số trong dữ liệu đường dẫn: M 0,5 A 5 5 0 0 1 5,0 V 2 A 3,3 0 0 0 2,5=>M0,5A5 5 0 0 1 5,0V2A3,3 0 0 0 2,5
darrylyeo

1
Chắc chắn rồi. Ngoài ra, đối với echocâu lệnh của bạn , hãy sử dụng chuỗi trích dẫn kép để cho phép các biến nội tuyến và xóa dấu chấm phẩy: echo'<use xlink:href="#c"fill="#'.$k.'"transform="rotate($v,5,5)"/>';=>echo"<use xlink:href='#c'fill='#$k'transform='rotate($v,5,5)'/>"
darrylyeo

2
Tôi nghĩ rằng hầu hết các trích dẫn đôi có thể được gỡ bỏ một cách an toàn. Giống như <rect x=5 y=4 fill=#4285f4 width=4.9 height=2 />(Ở đây, bạn sẽ cần một không gian trước /, mặc dù vậy.)
Arnauld

14

Logo, 258 byte

... bởi vì tôi hình logo nên được thực hiện bằng Logo . Điều này được thực hiện như là một chức năng. Tôi đã phát triển nó bằng trình thông dịch Logo trực tuyến của Calormen.com

Ban đầu tôi đã cố vẽ từng đoạn và tô màu cho nó, nhưng hóa ra nó lớn hơn dự kiến. Có rất nhiều chuyển động lãng phí quay trở lại và như vậy. Thay vào đó, tôi quyết định thực hiện quét đồ thị cực, điều chỉnh màu dựa trên tiêu đề. Phần khó hơn của toán học là làm hình học cho đường cong ở đầu hình chữ nhật của G. Bạn có thể cắt bớt một số số thập phân và có độ chính xác thấp hơn, nhưng tôi muốn điều này chính xác đến khoảng 3 chữ số để phù hợp với kích thước màn hình thông thường.

Chơi gôn

to g:n
ht
make"a arctan 1/:n
seth 78.46
repeat 326.54/:a[make"h heading
pu fd:n/2 pd
setpc"#4285f4
if:h>135[setpc"#34a853]if:h>225[setpc"#fbbc05]if:h>315[setpc"#ea4335]bk:n*.2 pu bk:n*.3
rt:a]home bk:n*.1
filled"#4285f4[fd:n/5 rt 90 fd:n*.49 rt 90 fd:n/5]end

Mẫu vật

g 200 Logo Google, kích thước 200px

Ung dung

to g :n ; Draw a G of width/height n

hideturtle ; Hide the turtle, since she's not part of the Google logo

;Determine the proper size of the angle to rotate so that the circle stays smooth within 1 px at this size
make "a arctan 1/:n 

setheading 78.46 ; Point toward the top corner of the upcoming rectangle

repeat 326.54 / :a [ ; Scoot around most of the circle, :a degrees at a time

  make"h heading ; Store heading into a variable for golfing purposes

  ; Position pen at the next stroke
  penup 
  forward :n / 2
  pendown

  ; Set the pen color depending on the heading
  setpencolor "#4285f4
  if :h > 135 [ setpencolor "#34a853]
  if :h > 225 [ setpencolor "#fbbc05]
  if :h > 315 [ setpencolor "#ea4335]

  ; Draw the stroke and return to center
  back :n * .2
  penup
  back :n * .3

  right :a ; Rotate to the next sweep heading
]

; Draw the rectangle
home
back :n * .1
filled "#4285f4 [
  forward :n/5
  right 90
  forward :n * .49 ;This is just begging to be :n / 2 but I couldn't bring myself to do it.  Proper math is more like :n * (sqrt 6) / 5
  right 90 
  forward :n / 5
]

end

12

JavaScript (ES7), 285 258 254 252 251 byte

Nhắc về chiều rộng của logo (tối đa 999) và vẽ nó trong một khung vẽ, pixel trên mỗi pixel.

Chỉnh sửa : Phiên bản ban đầu đã chuyển đổi tọa độ Cartesian sang tọa độ (x,y)Polar (r,a), nhưng chúng tôi không thực sự cần góc. Thật đơn giản (và ngắn hơn đáng kể) để chỉ so sánh giữa xyđể tìm hiểu xem chúng ta đang ở quý nào.

Chỉnh sửa : Đã lưu 1 byte nhờ vào ETHproductions.

JS, 251 224 220 218 217 byte

for(w=x=y=prompt(c=c.getContext`2d`)/2;r=(x*x+y*y)**.5,q=(x<y)+2*(x<-y),c.fillStyle='#'+'4285F434A853EA4335FBBC05FFF'.substr(x>0&r<w&y*y<w*w/25?0:r<w*.6|r>w|!q&y<0?24:q*6,6),x-->-w||y-->-(x=w);)c.fillRect(x+w,y+w,1,1)

HTML, 34 byte

<canvas id=c width=999 height=999>

Phiên bản ES6: 258 231 227 225 224 + 34 = 258 byte

Chiều rộng tối đa được đề xuất cho đoạn trích: 190.

for(w=x=y=prompt(c=c.getContext`2d`)/2;r=Math.pow(x*x+y*y,.5),q=(x<y)+2*(x<-y),c.fillStyle='#'+'4285F434A853EA4335FBBC05FFF'.substr(x>0&r<w&y*y<w*w/25?0:r<w*.6|r>w|!q&y<0?24:q*6,6),x-->-w||y-->-(x=w);)c.fillRect(x+w,y+w,1,1)
<canvas id=c width=999 height=999>


Tôi đã xem qua phần JavaScript và ngay lập tức nghĩ, "Cái này là gì <-và các -->toán tử ??" Tôi đoán đó là những gì xảy ra khi bạn nghĩ về các nhà khai thác giả định cho một ngôn ngữ giả định trong 24 giờ ...: P
Sản xuất ETH

@ETHproductions Họ cũng nhầm lẫn cú pháp tô sáng Notepad ++ đang diễn giải -->là bắt đầu (?) Của một nhận xét html nếu điều này được đặt trong <script>các thẻ trong một tệp html.
Arnauld

Dù bạn có tin hay không, Notepad ++ vẫn đúng (mặc dù không hoàn toàn). Kiểm tra mục cuối cùng trong bảng compat ES6 .
Sản xuất ETH

@ETHproductions - Wow. Tôi cho rằng có một lý do chính đáng đằng sau cú pháp này, nhưng tôi không thấy nó. Cảm ơn đã chỉ ra điều này.
Arnauld

Chỉ để bạn biết, tôi tin rằng nó chỉ có giá trị khi bắt đầu một dòng. 123 --> commentném lỗi trong bảng điều khiển trình duyệt của tôi (Firefox 49), trong khi --> commentkhông.
Sản xuất ETH

10

C #, 276 + 21 = 297 byte

276 byte cho phương thức + 21 byte cho nhập System.Drawing.

using System.Drawing;n=>{var q=new Bitmap(n,n);uint W=0xFFFFFFFF,B=0xFF4285F4;for(int y=0,x=0;x<n;y=++y<n?y:x-x++){float a=2f*x/n-1,b=2f*y/n-1,c=b*b;q.SetPixel(x,y,Color.FromArgb((int)(a>0&&a<.8&&c<.04?B:a*a+c>1||a*a+c<.36?W:a*a<c?b<0?0xFFEA4335:0xFF34A853:a<0?0xFFFBBC05:b<-.2?W:B)));}return q;};

Dựa trên thuật toán Martin Rosenau. Cảm ơn bạn đã làm phần khó khăn trong việc đưa ra một cách để xây dựng hình ảnh!

using System.Drawing;             // Import System.Drawing
/*Func<int, Bitmap>*/ n =>
{
    var q = new Bitmap(n, n);     // Create nxn output bitmap
    uint W=0xFFFFFFFF,            // White, color used more than once
         B=0xFF4285F4;            // Blue, color used more than once
    for(int y = 0, x = 0; x < n;  // Loops for(x=0;x<N;x+=1) for(y=0;y<N;y+=1) combined
        y = ++y < n               // Increment y first until it reaches n
            ? y           
            : x - x++)            // Then increment x, resetting y
    {
        float a = 2f * x / n - 1, // Relative coords. Refer to Martin Rosenau's
              b = 2f * y / n - 1, // for what this magic is.
              c = b * b;          // b*b is used more than 3 times

        q.SetPixel(x, y,          // Set pixel (x,y) to the appropriate color
            Color.FromArgb((int)  // Cast uint to int :(
            ( // Here lies magic
                a > 0 && a < .8 && c < .04 
                    ? B
                    : a * a + c > 1 || a * a + c < .36
                        ? W
                        : a * a < c 
                            ? b < 0 
                                ? 0xFFEA4335
                                : 0xFF34A853
                            : a < 0
                                ? 0xFFFBBC05
                                : b < -.2
                                    ? W
                                    : B
            )));
    }
    return q;
};

26: 26

400: 400


Bạn có thể lưu byte bằng cách không bao gồm độ trong suốt trong mã màu tức là0xFF...
TheLethalCoder

8

JS / CSS / HTML (+ JS), 40 0 + 701 644 617 593 + 173 90 97 121 = 914 774 754 730 714 byte

*{position:absolute}a,h{height:100%;background:#4285F4}a,g{width:100%;border-radius:100%}h{width:30%;height:20%;top:40%}b,c,d,e,f{width:50%;height:50%}b,d,f,h{left:50%}e,f{top:50%}c{border-radius:100% 0 0;background:linear-gradient(45deg,#FBBC05 50%,#EA4335 50%)}d{border-radius:0 100% 0 0;background:linear-gradient(-45deg,transparent 50%,#EA4335 50%)}e{border-radius:0 0 0 100%;background:linear-gradient(-45deg,#34A853 50%,#FBBC05 50%)}f{border-radius:0 0 100%;background:linear-gradient(45deg,#34A853 50%,#4285F4 50%)}b,g{height:40%;background:#FFF}g{width:60%;height:60%;top:20%;left:20%}
<input oninput=with(o.style)height=width=value+"px"><o id=o><a></a><b></b><c></c><d></d><e></e><f></f><g></g><h></h></o>

Sử dụng gradient tuyến tính hơn là biến đổi. Chỉnh sửa: Đã lưu 140 byte nhờ @darrylyeo. Đã lưu 20 byte bằng cách sử dụng một phần tử phụ thay vì gradient. Đã lưu 24 byte nhờ @DBS. Đã lưu 16 byte nhờ @Hedi. Từ sau ra trước, các lớp khác nhau là:

  • a Vòng tròn màu xanh
  • b Một hình chữ nhật màu trắng để che khuất phần phía trên thanh
  • c Quý trên cùng màu đỏ / vàng
  • d Góc trên bên phải màu đỏ
  • e Phần dưới cùng màu vàng / xanh bên trái
  • f Quý dưới cùng màu xanh lá cây / xanh dương
  • g Vòng tròn trắng bên trong
  • h Thanh ngang màu xanh

Thay vì ID, bạn nên sử dụng tên nguyên tố như a, b, i, s, vv Sử dụng *thay vì divcho bộ chọn CSS.
darrylyeo

Ngoài ra, sử dụng backgroundnhư một tốc ký cho background-image.
darrylyeo

@darrylyeo Cảm ơn, điều đó đã tạo ra sự khác biệt lớn đối với điểm số của tôi, không giúp tôi quên ngay cả việc xóa các trích dẫn khỏi HTML của mình ...
Neil

Heh, không vấn đề gì!
darrylyeo

Tôi tin rằng bạn có thể lưu một vài ký tự ở đây và ở đó bằng cách sử dụng hợp chất border-radius. Ví dụ c{border-radius:100% 0 0;thay vìc{border-top-left-radius:100%;
DBS

8

Ruby 2.3.1, 376 359 byte

Sử dụng đá quý RMagick.

d,f=$*[0].to_i,2.5;g,h,e,c=d-1,d/2,Magick::ImageList.new,Magick::Draw.new;e.new_image(d,d);c.stroke('#EA4335').fill_opacity(0).stroke_width(d*0.2).ellipse(h,h,g/f,g/f,225,315).stroke('#FBBC05').ellipse(h,h,g/f,g/f,135,225).stroke('#34A853').ellipse(h,h,g/f,g/f,45,135).stroke('#4285F4').ellipse(h,h,g/f,g/f,348.5,45).line(h,h,d*0.989,h).draw(e);e.write($*[1])

Ví dụ

50x50

50x50

250x250

nhập mô tả hình ảnh ở đây

500x500

nhập mô tả hình ảnh ở đây

1000x1000

nhập mô tả hình ảnh ở đây

Tệp có hai tham số - đầu tiên là thứ nguyên và thứ hai là tên tệp để lưu đầu ra dưới dạng.

Ung dung

require "RMagick"

# Take the user's input for dimension
d = $*[0].to_i

e = Magick::ImageList.new
e.new_image(d, d)

c = Magick::Draw.new

# Start by setting the color to red
c.stroke('#EA4335')

  # set opacity to nothing so that we don't get extra color.
  .fill_opacity(0)

  # set thickness of line.
  .stroke_width(d*0.2)

  # #ellipse creates an ellipse taking
  # x, y of center
  # width, height,
  # arc start, arc end
  .ellipse(d / 2, d / 2, (d - 1) / 2.5, (d - 1) / 2.5, 225, 315)

  # change to yellow and draw its portion
  .stroke('#FBBC05')
  .ellipse(d / 2, d / 2, (d - 1) / 2.5, (d - 1) / 2.5, 135, 225)

  # change to green and draw its portion
  .stroke('#34A853')
  .ellipse(d / 2, d / 2, (d - 1) / 2.5, (d - 1) / 2.5, 45, 135)

  # change to blue and draw its portion
  .stroke('#4285F4')
  .ellipse(d / 2, d / 2, (d-1)/2.5, (d - 1)/2.5, 348.5, 45)

  # creates the chin for the G
  .line(d/2, d/2, d*0.99, d/2)

  # draws to the created canvas
  .draw(e)

# save out the file
# taking the filename as a variable saves a byte over
# "a.png"
e.write($*[1])

Ban đầu tôi đã bắt đầu giải quyết vấn đề này bằng cách sử dụng oily_png / chunky_png nhưng điều đó có thể sẽ trở nên quá phức tạp so với RMagick. Chức năng .ellipse của RMagick làm cho điều này trở nên dễ dàng và công việc chính là xoay quanh việc điều chỉnh hình dạng / kích thước của mọi thứ.

Đây là lần gửi Code Golf đầu tiên của tôi (cũng là câu trả lời SE đầu tiên) và tôi chỉ xem mình là người trung gian với Ruby. Nếu bạn có bất kỳ đầu vào về cải tiến / mẹo, xin vui lòng chia sẻ!


Tôi dường như không thể chỉnh sửa bài đăng của mình (lỗi 404) nhưng nếu tôi xóa dòng yêu cầu khỏi giải pháp đánh gôn của mình, nó sẽ tắt 17 byte và đưa nó xuống còn 359 byte.
đô thị

5

Python 2, 378 373 byte

Tôi thực sự muốn làm điều này bằng cách sử dụng turtle. Tôi đã phải loại bỏ kiến ​​thức về Hình học cho việc này, tính toán các góc và độ dài không được cung cấp trong mô tả thử thách.

Chỉnh sửa: loại bỏ up(), vì làm như vậy sẽ loại bỏ các mảnh nhỏ màu trắng giữa màu xanh lá cây và màu xanh lam và làm cho vòng tròn bên trong trông đẹp hơn. Điều này làm chậm chương trình hơn nữa.

Chỉnh sửa: thay thế 9*nbằng 2*nđể làm cho nhanh hơn. Tôi xác định rằng nó vẫn sẽ tạo ra một vòng tròn trơn tru.

from turtle import*
n=input()
C=circle
F=fill
K=color
q=90
w="white"
t=n*.3
lt(45)
def P(c,x,A):K(c);F(1);fd(x);lt(q);C(x,A,2*n);F(0);goto(0,0);rt(q)
for c in"#EA4335","#FBBC05","#34A853":P(c,n/2,q)
P(w,t,360)
K("#4285F4")
F(1)
fd(n/2)
lt(q)
a=11.537
C(n/2,45+a,2*n)
seth(0)
bk(.489*n)
rt(q)
fd(n/5)
lt(q)
fd(t)
F(0)
bk(t)
K(w)
F(1)
fd(.283*n)
lt(94-2*a)
C(t,a-45,2*n)
F(0)

Ghi chú:

  1. Các trinkets sử dụng Python 3, vì vậy đầu vào phải được chuyển thành int.
  2. Các trinkets đi rất chậm cho lớn nnếu bạn loại bỏ speed(0), mà tôi chỉ thêm vào cho tốc độ.
  3. Sự chậm chạp của mã phần lớn là do tham số thứ ba của circlesự tăng trưởng O(n), vì nó xác định có bao nhiêu cạnh đa giác được ghi để vẽ đường tròn có.

Dùng thử trực tuyến

Ungolfed: Hãy thử trực tuyến

Sự thật thú vị: Trinket là một đảo chữ Tkinter, gói GUI của Python và là nền tảng cho turtle.


Ngoài ra, nếu ai đó đã cài đặt Python, họ có thể chạy nó với giá trị lớn ncho tôi không? Nếu nó trông không đẹp, tôi có thể cần phải đặt một số sqrts ở đó để chính xác hơn. Tôi làm tròn đến hàng ngàn.
mbomb007


Đó chỉ là những giá trị lớn mà tôi lo lắng. Canvas trên Trinket có tối đa 400.
mbomb007


@daHugLenny Không có ý kiến. Nó có thể là một vấn đề bộ nhớ, vì 10000 là một giá trị lớn như vậy.
mbomb007

5

PHP + GD, 529 449 byte

Cái này lấy tham số chuỗi truy vấn nvà xuất ra phiên bản PNG của logo có kích thước được chỉ định.

<?php $n=$_GET['n'];$h=$n/2;$c='imagecolorallocate';$a='imagefilledarc';$i=imagecreatetruecolor($n,$n);$m=[$c($i,66,133,244),$c($i,52,168,83),$c($i,251,188,5),$c($i,234,67,53),$c($i,255,255,255)];imagefill($i,0,0,$m[4]);$j=-11.6;foreach([45,135,225,315]as$k=>$e){$a($i,$h,$h,$n,$n,$j,$e,$m[$k],0);$j=$e;}$a($i,$h,$h,$n*.6,$n*.6,0,0,$m[4],0);imagefilledrectangle($i,$h,$h-$n*.1,$h+$h*.98,$h+$h*.2,$m[0]);header('Content-Type:image/png');imagepng($i);

Ung dung:

<?php

$n = $_GET['n'];$h=$n/2;
$c = 'imagecolorallocate';$a='imagefilledarc';
$i = imagecreatetruecolor($n,$n);

// Create array of colors
$m=[$c($i,66,133,244),$c($i,52,168,83),$c($i,251,188,5),$c($i,234,67,53),$c($i,255,255,255)];

// Fill background with white
imagefill($i, 0, 0, $m[4]);

// Create four arcs
$j=-11.6;
foreach([45,135,225,315]as$k=>$e){
    $a($i, $h, $h, $n, $n, $j, $e, $m[$k], 0);$j=$e;
}

// Hollow out the center and fill with white
$a($i, $h, $h, $n*.6,$n*.6,0,0,$m[4],0);

// create the horizontal bar
imagefilledrectangle($i,$h,$h-$n*.1,$h+$h*.98,$h+$h*.2,$m[0]);

// Output
header('Content-Type: image/png');
imagepng($i);

N = 13:
13x13

N = 200:
200x200


Hầu hết các hằng chuỗi không cần dấu ngoặc kép. Hình ảnh màu sắc trung thực không cần imagecolorallocate; chỉ cần cung cấp 0xRRGGBB làm màu cho các chức năng vẽ. Một số hoạt động chơi gôn khác và nó giảm xuống còn 329 byte : imagefill($i=imagecreatetruecolor($n=$argv[1],$n),0,0,($m=[4359668,3450963,0xfbbc05,0xea4335,0xffffff])[4]);for($j=-11.6;$e=[45,135,225,315][$k];$j=$e)($a=imagefilledarc)($i,$h=$n/2,$h,$n,$n,$j,$e,$m[$k++],0);$a($i,$h,$h,$n*.6,$n*.6,0,0,$m[4],0);imagefilledrectangle($i,$h,$h-$n*.1,$h+$h*.98,$h+$h*.2,$m[0]);imagepng($i,"g.png");, chạy với -r, lấy đầu vào từ dòng lệnh và xuất ra g.png.
Tít

Xin lỗi, golf trước đây của tôi quá ngắn hai byte: [$kphải như vậy [+$k. Nhưng cái này cũng hoạt động tốt: imagefill($i=imagecreatetruecolor($n=$argv[1],$n),0,0,$w=2**24-1);$j=-11.6;foreach([$b=4359668,3450963,0xfbbc05,0xea4335]as$c)($a=imagefilledarc)($i,$h=$n/2,$h,$n,$n,$j,$j=45+90*$k++,$c,0);$a($i,$h,$h,$p=$n*.6,$p,0,0,$w,0);imagefilledrectangle($i,$h,$n*.4,$n*.99,$p,$b);imagepng($i,"g.png");(291 byte)
Tít

@Titus Cảm ơn. Tôi phát hiện ra sau câu trả lời này mà bạn không cần imagecolorallocate. Tôi sẽ cập nhật câu trả lời của tôi với mã của bạn. Nhưng bạn có cần xuất ra tên tập tin? Bạn không thể bỏ tên tập tin vào imagepngvà chỉ có đầu ra cho thiết bị xuất chuẩn?
Kodos Johnson

5

Java, 568 byte

Không phải ngôn ngữ mạnh nhất để chơi gôn, nhưng đây là nỗ lực nghiêm túc của tôi:

import java.awt.image.*;class G{public static void main(String[]b)throws Exception{int n=Integer.parseInt(b[0]),x,y,a,c;BufferedImage p=new BufferedImage(n,n,BufferedImage.TYPE_INT_RGB);for(y=0;y<n;y++){for(x=0;x<n;x++){double u=(x+.5)/n-.5,v=.5-(y+.5)/n,r=Math.hypot(u,v);a=(int)(Math.atan2(v,u)*4/Math.PI);c=0xFFFFFF;if(0<u&u<.4&-.1<v&v<.1)c=0x4285F4;else if(r<.3|r>.5);else if(a==0&v<.1)c=0x4285F4;else if(a==1|a==2)c=0xEA4335;else if(a==-1|a==-2)c=0x34A853;else if(a!=0)c=0xFBBC05;p.setRGB(x,y,c);}}javax.imageio.ImageIO.write(p,"png",new java.io.File("G.png"));}}

Sử dụng:

> javac G.java
--> Compiles to G.class
> java G 400
--> Writes G.png in current working directory

Phiên bản không chơi gôn - ý tưởng cơ bản là làm việc trong hệ tọa độ u, v ∈ [.50,5, 0,5] và tính khoảng cách và góc của mỗi pixel từ trung tâm hình ảnh:

import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;

public class Google {

    public static void main(String[] args) throws IOException {
        int n = Integer.parseInt(args[0]);
        int[] pixels = new int[n * n];

        for (int y = 0; y < n; y++) {
            for (int x = 0; x < n; x++) {
                double u = (x + 0.5) / n - 0.5;
                double v = 0.5 - (y + 0.5) / n;
                double r = Math.hypot(u, v);
                int a = (int)(Math.atan2(v, u) * 4 / Math.PI);
                int c = 0xFFFFFF;
                if (0 < u && u < 0.4 && Math.abs(v) < 0.1)
                    c = 0x4285F4;
                else if (r < 0.3 || r > 0.5)
                    /*empty*/;
                else if (a == 0 && v < 0.1)
                    c = 0x4285F4;
                else if (a == 1 || a == 2)
                    c = 0xEA4335;
                else if (a == -1 || a == -2)
                    c = 0x34A853;
                else if (a != 0)
                    c = 0xFBBC05;
                pixels[y * n + x] = c;
            }
        }

        BufferedImage image = new BufferedImage(n, n, BufferedImage.TYPE_INT_RGB);
        image.setRGB(0, 0, n, n, pixels, 0, n);
        ImageIO.write(image, "png", new File("G.png"));
    }

}

Việc thực hiện của tôi tính toán và vẽ các pixel thô. Có thể tạo một triển khai thay thế sử dụng các thói quen đồ họa cấp cao như Graphics2DArc2D để thực hiện bản vẽ, đặc biệt là với khử răng cưa.


4

Đi, 379 byte

import ."fmt"
func f(a int)(s string){
m:=map[string]float64{"fbbc05":-45,"ea4335":45,"4285f4":168.5,"34a853":225}
for k,v:=range m{s+=Sprintf("<use xlink:href=#c fill=#%v transform=rotate(%v,5,5) />",k,v)}
return Sprintf("<svg width=%v viewBox=0,0,10,10><def><path id=c d=M0,5A5,5,0,0,1,5,0V2A3,3,0,0,0,2,5 /></def>%v<rect x=5 y=4 fill=#4285f4 width=4.9 height=2 /></svg>",a,s)}

Hàm fmất mộtint đối số (hệ số tỷ lệ) và đưa ra hình ảnh SVG được chia tỷ lệ thích hợp.

Dùng thử trực tuyến tại Ideone.

Ví dụ đầu ra:

<svg width=333 viewBox=0,0,10,10><def><path id=c d=M0,5A5,5,0,0,1,5,0V2A3,3,0,0,0,2,5 /></def><use xlink:href=#c fill=#34a853 transform=rotate(225,5,5) /><use xlink:href=#c fill=#fbbc05 transform=rotate(-45,5,5) /><use xlink:href=#c fill=#ea4335 transform=rotate(45,5,5) /><use xlink:href=#c fill=#4285f4 transform=rotate(168.5,5,5) /><rect x=5 y=4 fill=#4285f4 width=4.9 height=2 /></svg>

Có vẻ sai khi xoa dịu các lớp phủ Google của chúng tôi bằng bất kỳ ngôn ngữ lập trình nào ngoại trừ ngôn ngữ lập trình của họ.


4

CJam, 141

ri:M.5*:K5/:T;'P3NMSMN255NM2m*[K.5-_]f.-{:X:mh:IK>0{X~0<\zT>|{IT3*<0{X~>X~W*>:Z2+{Z{X0=TW*>}4?}?}?}1?}?}%"^^G_8:nEhB%P9IW@zA"102b256b3/f=:+N*

Dùng thử trực tuyến

Xuất hình ảnh ở định dạng ppm ASCII.
Để có phiên bản nghệ thuật ASCII đẹp hơn trong trình duyệt, hãy thử mã này . Nó cũng giúp hình dung thuật toán.

Giải trình:

ri:M                 read input, convert to int and store in M
.5*:K                multiply by 0.5 and store in K (M/2)
5/:T;                divide by 5 and store in T (M/10) and pop
'P3NMSMN255N         ppm header (N=newline, S=space)
M2m*                 generate all pixel coordinates - pairs of numbers 0..M-1
[K.5-_]              push the center (coordinates K-0.5, K-0.5)
f.-                  subtract the center from every pixel
{…}%                 map (transform) the array of coordinate pairs
  :X                 store the current pair in X
  :mh:I              calculate the hypotenuse of X (distance from the center)
                      and store in I
  K>0                if I>K (outside the big circle), push 0
  {…}                else…
    X~               dump X's coordinates (row, column)
    0<               check if the column is <0
    \zT>|            or the absolute value of the row is >T
    {…}              if true (outside the G bar)…
      IT3*<0         if I<T*3 (inside the small circle) push 0
      {…}            else (between the circles)…
        X~>          dump X and check if row>column (diagonal split)
        X~W*>:Z      also check if row>-column (other diagonal) and store in Z
                      (W=-1)
        2+           if in lower-left half, push Z+2 (2 for left, 3 for bottom)
        {…}          else (upper-right half)…
          Z{…}       if it's in the right quadrant
            X0=      get the row coordinate of X
            TW*>     compare with -T, resulting in 0 (above the bar) or 1
          4          else (top quadrant) push 4
          ?          end if
        ?            end if
      ?              end if
    1                else (inside the G bar) push 1
    ?                end if
  ?                  end if
"^^G … @zA"          push a string containing the 5 colors encoded
102b                 convert from base 102 to a big number
                      (ASCII values of chars are treated as base-102 digits)
256b                 convert to base 256, splitting into 15 bytes
3/                   split into triplets (RGB)
f=                   replace each generated number (0..4)
                      with the corresponding color triplet
:+N*                 join all the triplets, and join everything with newlines

3

JavaScript (ES6) (+ SVG), 293 byte, không cạnh tranh

document.write(`<svg id=o width=${prompt()} viewbox=0,0,50,50>`);m=`39,11`;`#EA433511,11
#FBBC0511,39
#34A85339,39
#4285F445,25L25,25`.replace(/(.{7})(.{5})(.*)/g,(_,s,t,u)=>m=document.write(`<path stroke=${s} d=M${m}A20,20,0,0,0,${t+u} fill=none stroke-width=10 stroke-linejoin=round />`)||t)

Đáng buồn thay, tham gia đường tròn không hoàn toàn là hiệu ứng được yêu cầu, nhưng nó khá gần.


3

FreeMarker + HTML / CSS, 46 + 468 = 514 byte

HTML:

<div><div></div><div></div><span></span></div>

CSS:

div div,div span{position:absolute}div{width:10px;height:10px;box-sizing:border-box;transform-origin:top left;position:relative;transform:scale(${n*.1})}div div{border:2px solid;border-radius:9px;border-color:transparent #4285f4 transparent transparent;transform:rotate(33.4630409671deg);transform-origin:center}div div+div{border-color:#ea4335 transparent #34a853 #fbbc05;transform:none}div span{display:block;top:4px;bottom:4px;left:5px;right:.1px;background:#4285f4}

Giả sử bộ xử lý FreeMarker được thực thi với một bộ biến n, đại diện cho đầu vào.

Giải thích về số ma thuật:

Tất cả mọi thứ được dựa trên một trình bao bọc 10x10px, sau đó được thu nhỏ lại n/10.

  • Khoảng cách bên phải của hộp ngang màu xanh [px]: 5 - sqrt (5 ^ 2 - 1 ^ 2) = 0.10102051443 ( Pythagoras )
  • Xoay vòng cung màu xanh [deg]: 45 - arcSin (1/5) = 33,4630409671 ( sin )

JSFiddle lộn xộn


Đặt Phần CSS trong thành phần kiểu và sử dụng Javascript hoặc PHP. thay thế transform:scale(n)bằng transform:scale(<?=$_GET[n])?>(PHP). Trong javascript, bạn có thể nối Phần CSS vào Phần tử kiểu
Jörg Hülsermann

Tôi đã nghĩ về JS nhưng không muốn làm hỏng mã quá nhiều. Tuy nhiên, ngôn ngữ tạo khuôn có vẻ ổn, vì vậy tôi đã sử dụng FreeMarker và nhanh chóng điều chỉnh câu trả lời của mình, cảm ơn.
Cedric Reichenbach

Thanh màu xanh quá xa về phía bên phải, nó nghĩ
RobAu

Không, bạn có thể dễ dàng tính toán nó bằng cách tưởng tượng một tam giác vuông có độ dài cạnh 0,5, 0,1 và x, trong đó x biểu thị chiều rộng của thanh màu xanh hoặc theo đó khoảng 0,5 x x khoảng cách của nó sang phải. x sau đó có thể được xác định bằng cách sử dụng định lý Pythagoras (xem phần giải thích tôi đã thêm).
Cedric Reichenbach

JSFiddle không hiển thị chính xác trong hai trình duyệt tôi đã thử (Win10 x64) - với Chrome 54.0.2840.59 m (64-bit), thanh màu xanh kéo dài quá xa về bên phải và với Firefox 49.0.1 (32 -bit) có một khoảng cách nhỏ ở giữa phần cong màu xanh
alldayremix

3

343 octet của Haskell

roman@zfs:~$ cat ppmG.hs
ppmG n='P':unlines(map show([3,n,n,255]++concat[
 case map signum[m^2-(2*x-m)^2-(2*y-m)^2,
 (10*x-5*m)^2+(10*y-5*m)^2-(3*m)^2,
 m-x-y,x-y,5*y-2*m,3*m-5*y,2*x-m]of
 1:1:1:1:_->[234,67,53]
 1:1:1:_->[251,188,5]
 [1,_,_,_,1,1,1]->[66,133,244]
 1:1:_:1:1:_->[66,133,244]
 1:1:_:_:1:_->[52,168,83]
 _->[255,255,255]|m<-[n-1],y<-[0..m],x<-[0..m]]))
roman@zfs:~$ wc ppmG.hs
 10  14 343 ppmG.hs
roman@zfs:~$ ghc ppmG.hs -e 'putStr$ppmG$42'|ppmtoxpm
ppmtoxpm: (Computing colormap...
ppmtoxpm: ...Done.  5 colors found.)

/* XPM */
static char *noname[] = {
/* width height ncolors chars_per_pixel */
"42 42 6 1",
/* colors */
"  c #4285F4",
". c #EA4335",
"X c #FBBC05",
"o c #34A853",
"O c #FFFFFF",
"+ c None",
/* pixels */
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOO............OOOOOOOOOOOOOOO",
"OOOOOOOOOOOO..................OOOOOOOOOOOO",
"OOOOOOOOOO......................OOOOOOOOOO",
"OOOOOOOOO........................OOOOOOOOO",
"OOOOOOOO..........................OOOOOOOO",
"OOOOOOO............................OOOOOOO",
"OOOOOOXX..........................OOOOOOOO",
"OOOOOXXXX........................OOOOOOOOO",
"OOOOXXXXXX.......OOOOOOOO.......OOOOOOOOOO",
"OOOXXXXXXXX....OOOOOOOOOOOO....OOOOOOOOOOO",
"OOOXXXXXXXXX.OOOOOOOOOOOOOOOO.OOOOOOOOOOOO",
"OOXXXXXXXXXXOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOXXXXXXXXXOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OOXXXXXXXXXOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OXXXXXXXXXOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OXXXXXXXXXOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO",
"OXXXXXXXXOOOOOOOOOOOO                    O",
"OXXXXXXXXOOOOOOOOOOOO                    O",
"OXXXXXXXXOOOOOOOOOOOO                    O",
"OXXXXXXXXOOOOOOOOOOOO                    O",
"OXXXXXXXXOOOOOOOOOOOO                    O",
"OXXXXXXXXOOOOOOOOOOOO                    O",
"OXXXXXXXXOOOOOOOOOOOO                    O",
"OXXXXXXXXOOOOOOOOOOOO                    O",
"OXXXXXXXXXOOOOOOOOOOOOOOOOOOOOOO         O",
"OXXXXXXXXXOOOOOOOOOOOOOOOOOOOOOO         O",
"OOXXXXXXXXXOOOOOOOOOOOOOOOOOOOO         OO",
"OOXXXXXXXXXOOOOOOOOOOOOOOOOOOOO         OO",
"OOXXXXXXXXXXOOOOOOOOOOOOOOOOOO          OO",
"OOOXXXXXXXXooOOOOOOOOOOOOOOOOoo        OOO",
"OOOXXXXXXXoooooOOOOOOOOOOOOooooo       OOO",
"OOOOXXXXXooooooooOOOOOOOOoooooooo     OOOO",
"OOOOOXXXoooooooooooooooooooooooooo   OOOOO",
"OOOOOOXoooooooooooooooooooooooooooo OOOOOO",
"OOOOOOOooooooooooooooooooooooooooooOOOOOOO",
"OOOOOOOOooooooooooooooooooooooooooOOOOOOOO",
"OOOOOOOOOooooooooooooooooooooooooOOOOOOOOO",
"OOOOOOOOOOooooooooooooooooooooooOOOOOOOOOO",
"OOOOOOOOOOOOooooooooooooooooooOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOooooooooooooOOOOOOOOOOOOOOO",
"OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"
};

Giải trình

  • "P3" == sơ đồ di động plaintext
  • hiển thị == tạo số thập phân ASCII sợ tham nhũng UTF-8 cho "\ xFF \ xFF \ xFF"
  • unlines == số thập phân riêng biệt thành dòng
  • m = n-1 cho tính đối xứng theo n == length [0..m]
  • ²- (2x-m) ²- (2y-m) ²> 0 == (xm / 2) ² + (ym / 2) ² <(m / 2) ² == bên trongOuterCircle
  • (10x-5m) ² + (10y-5m) ²- (3 m) ²> 0 == (xm / 2) ² + (ym / 2) ²> (m3 / 10) ² == bên ngoàiInnerCircle
  • mxy> 0 == x + y <m == inUpperLeft
  • xy> 0 == x> y == inUpperRight
  • 5y-2m> 0 == y> m2 / 5 == bên dướiGbarTop
  • 3y-5y> 0 == y <m3 / 5 == trênGbarBot
  • 2x-m> 0 == x> m / 2 == inRightHalf
  • [234,67,53] == đỏ
  • [251.188,5] == màu vàng
  • [52,168,83] == màu xanh lá cây
  • [66,13,244] == màu xanh
  • [255,255,255] == trắng

1
Trừ khi bạn mã hóa tất cả bằng ASCII 7 bit (điều mà bạn có thể làm được vì mật mã ký tự cao nhất bạn đang sử dụng là 0x7C/ 124/ |) trong trường hợp đó sẽ là 339 vách ngăn của Haskell . Nhưng xem xét làm thế nào 8-bit-byte-byte tiêu chuẩn đã trở thành lưu trữ dữ liệu trong vài thập kỷ qua, tôi nghĩ thuật ngữ các byte byte là đủ cụ thể mà không đánh bại con ngựa chết.
Slipp D. Thompson

3

SAS - 590 536 521 byte

Điều này sử dụng cơ sở chú thích GTL . Đầu vào được chỉ định trong một biến vĩ mô trên dòng đầu tiên. Đối với một vài byte bổ sung, bạn có thể định nghĩa toàn bộ là một macro. Nó vẫn lẻn vào bên dưới Java và một vài câu trả lời HTML, mặc dù bạn phải xác định một mẫu biểu đồ null để có thể vẽ mọi thứ!

Tôi đã rời khỏi dòng ngắt trong một chút về khả năng đọc, nhưng tôi không tính những thứ đó vào tổng số vì nó hoạt động mà không có chúng.

%let R=;
%let F=FILLCOLOR;
ods graphics/width=&R height=&R;
proc template;
define statgraph a;
begingraph;
annotate;
endgraph;
end;
data d;
retain FUNCTION "RECTANGLE" DISPLAY "FILL" DRAWSPACE "graphPERCENT";
length &F$8;
_="CX4285F4";
P=100/&R;
HEIGHT=P;
width=P;
do i=1to &R;
x1=i*P;
U=x1-50;
do j=1to &R;
y1=j*P;
V=y1-50;
r=euclid(U,V);
&F="";
if 30<=r<=50then if V>U then if V>-U then &F="CXEA4335";
else &F="CXFBBC05";
else if V<-U then &F="CX34A853";
else if V<10then &F=_;
if &F>'' then output;
end;
end;
x1=65;
y1=50;
width=30;
height=20;
&F=_;
output;
proc sgrender sganno=d template=a;

Chỉnh sửa: loại bỏ thêm một vài byte thông qua việc sử dụng các macro macro, cài đặt mặc định và lựa chọn toán tử.

Chỉnh sửa 2: loại bỏ các do-endkhối cho if-then-elselogic và bằng cách nào đó nó vẫn hoạt động - Tôi hoàn toàn không hiểu làm thế nào. Ngoài ra, tôi phát hiện ra euclidchức năng!


2

SCSS - 415 byte

Có đầu vào là $N: 100px;<div id="logo"></div>, không chắc chắn nếu những thứ này sẽ được tính trong tổng số ...

$d:$N*.6;$b:$d/3;#logo{width:$d;height:$d;border:$b solid;border-color:#ea4335 transparent #34a853 #fbbc05;border-radius:50%;position:relative;&:before,&:after{content:'';position:absolute;right:-$b;top:50%;border:0 solid transparent}&:before{width:$b*4;height:$d/2;border-width:0 $b $b 0;border-right-color:#4285f4;border-bottom-right-radius:50% 100%}&:after{width:$N/2;margin:-$b/2 0;border-top:$b solid #4285f4}}

Bản trình diễn trên JSFiddle


1

Haskell với gói JuicyPixels , 306 byte

import Codec.Picture
p=PixelRGB8
c=fromIntegral
b=p 66 133 244
w=p 255 255 255
(n%x)y|y<=x,x+y<=n=p 234 67 53|y>x,x+y<=n=p 251 188 5|y>x,x+y>n=p 52 168 83|y>=0.4*n=b|1>0=w
(n#x)y|d<=h,d>=0.3*n=n%x$y|x>=h,d<=h,abs(y-h)<=n/10=b|1>0=w where h=n/2;d=sqrt$(x-h)^2+(y-h)^2
f n=generateImage(\x y->c n#c x$c y)n n

Ví dụ sử dụng:

main = writePng "google.png" $ f 1001

Điều này có lẽ có thể được cải thiện. Ý tưởng là để truyền một hàm tới generateImageđó chọn pixel (màu thực sự) sẽ đi ở vị trí x, y. Vì vậy, chúng tôi sử dụng lambda thêm vào nnhư một tham số và chuyển đổi tất cả chúng thành float cùng một lúc. Các #chức năng cơ bản để kiểm tra nếu chúng ta đang ở trong vòng, quán bar, hay không. Nếu đó là chiếc nhẫn chúng ta chuyển dùi cui đến %, nếu thanh chúng ta chỉ trả lại màu xanh, nếu không thì màu trắng. %kiểm tra góc phần tư nào chúng ta đang ở và trả về màu thích hợp nếu nó không có màu xanh. Màu xanh là một trường hợp đặc biệt vì chúng ta cần đảm bảo nó không bao quanh màu đỏ, vì vậy chúng ta chỉ trả lại màu xanh nếuy nằm dưới "vạch vạch" nếu không chúng ta sẽ trả về màu trắng. Đó là tổng quan chung.


0

Đang xử lý - 244 byte + 1 byte cho số chữ số trong N

Hãy bắt đầu với mã. Điều này có thể được dán trong môi trường Xử lý và chạy (thay đổi Ncho các kích cỡ khác nhau).

N=400
n=N/2
f=fill
a=['#34A853','#FBBC05','#EA4335','#4285F4']
def setup():
 size(N,N);noStroke()
def draw():
 for i in 1,3,5,7: f(a[i/2]);arc(n,n,N,N,i*PI/4+[0,.59][i>6],(i+2)*PI/4)
 f(205);ellipse(n,n,.6*N,.6*N);f(a[3]);rect(n,n-.1*N,.98*n,.2*N)

Gian lận nhỏ: vòng tròn cắt ra một phần từ logo được vẽ trong sắc độ xám 205 của chế biến, là màu nền mặc định. Xuất cái này sang hình ảnh sẽ không giống nhau. Điều này tiết kiệm một cuộc gọi đếnbackground(255) .

Giải trình

N=400                 # set size
n=N/2                 # precompute center point
f=fill                # 3 usages, saves 3 bytes
a=['#34A853','#FBBC05','#EA4335','#4285F4']
                      # list of colors
def setup():          # called when starting sketch
 size(N,N)            # set size
 noStroke()           # disable stroking
def draw():           # drawing loop
 for i in 1,3,5,7:    # loop over increments of PI/4
  f(a[i/2])           # set fill color using integer
                      # division
  arc(n,n,N,N,i*PI/4+[0,.59][i>6],(i+2)*PI/4)
                      # draw a pizza slice between
                      # two coordinates. The 
                      #     [0,.59][i>6]
                      # accounts for the white part
 f(205)               # set fill color to Processing's
                      # default background
 ellipse(n,n,.6*N,.6*N)
                      # cut out center
 f(a[3])              # set fill to blue
 rect(n,n-.1*N,.98*n,.2*N)
                      # draw the straight part

Ví dụ

N = 400

N = 400

N = 13 (Kích thước tối thiểu của chế biến là 100x100)

nhập mô tả hình ảnh ở đây

Ghi chú

Nếu chúng tôi cho phép chúng tôi chỉnh sửa thủ công nhiều giá trị cho Ncác cuộc gọi rõ ràng setupdrawkhông cần thiết và nó sẽ giảm xuống còn 213 byte + 3 byte mỗi chữ số N.

N=200
size(200,200)
n=N/2
f=fill
a=['#34A853','#FBBC05','#EA4335','#4285F4']
noStroke()
for i in 1,3,5,7:f(a[i/2]);arc(n,n,N,N,i*PI/4+[0,.59][i>6],(i+2)*PI/4)
f(205);ellipse(n,n,.6*N,.6*N);f(a[3]);rect(n,n-.1*N,.98*n,.2*N)

Chính nó, đây không phải là một chương trình đầy đủ
Bò lang băm

Đủ công bằng. Tôi đã gỡ bỏ chương trình chưa hoàn thành và thay thế nó cho một phiên bản hoàn chỉnh.
PidgeyUsedGust
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.