Google Overlords'ınızı Rahatlatın: “G” Logosunu Çizin


136

Olumlu bir tamsayı alan bir program veya işlev yazın ve Google'ın "G" logosunun N * N piksel görüntüsünü bu yapıya göre yazdırır:

"G" logo yapımı

Örneğin, N 400 ise, doğru boyutlarda ve renklerde 400 x 400 piksel bir logo çıktısı alınmalıdır:

"G" logosu 400x400 örnek

N'nin ne kadar büyük veya küçük olduğuna bakmaksızın doğru görünmelidir. örneğin burada N = 13:"G" logosu 13x13 örneği

Kodunuzun internete bağlanması gerekmez. Örneğin, harici olarak barındırılan bir svg'nin ölçeklendirilmesine izin verilmez. (Kodunuzda kodlanmış bir svg'yi ölçeklendirmek yine de iyi olabilir.)

Kenar yumuşatma kullanılabilir veya kullanılamaz. Sana kalmış.

"G" nin yatay çubuğunun resmin sağ kenarına kadar uzanmadığına dikkat edin. Daire kesilmeden önce normal olarak sağ kenardan içeriye doğru kıvrılır.

Bayt cinsinden en kısa kod kazanır.


* Bu zorluk için logonun yapımı basitleştirildi. Doğru yapı burada ve burada görülebilir .


1
Minimum N var mı? 1x1 görüntü, çözümün ne kadar iyi olduğuna bakmaksızın büyük olasılıkla tanınmayan bir çıktı üretecektir.
jpmc26

@ jpmc26 N pozitif bir tamsayıdır, bu yüzden en az 1. Tabii ki 1x1 görüntü algılanamaz, ancak "Doğru görünmelidir" anlamına gelir, örneğin siyah bir görüntü o ölçekte bile anlamlı olmaz.
Calvin'in Hobileri

4
Öyleyse 1x1 görüntü için beklenen çıktı nedir? Görüntüdeki renklerden herhangi birinin tek pikseli? Beyaz bir görüntü? Peki ya 2x2? Görüntüde hala bu boyut için piksellerden daha fazla renk var. Herhangi bir görüntü ya da üstünde kabul edilemez ise, zorluk nedir ve siz bu yana, kabul edilemez tanımlamak gerekir olamaz bu olmamalı, hatta doğru görünümüne yakın gelen bir görüntü üretmek? (Benim sorunum olsaydı, onları basit tutmak için hariç
tutardım

@ jpmc26 Hayır. İnsanlar 1x1 veya başka bir küçük resmin doğru görünüp görünmediğini anlamak için sağduyu kullanabilir.
Calvin'in Hobileri,

Önceden hazırlanmış bir .svgdosyayı indirebilir ve çözümümüze kodlayabilir miyiz, yoksa orijinal olarak mı yapmalıyız?
juniorRubyist

Yanıtlar:


55

Mathematica, 229 226 225 224 221 206 169 bayt

1 bayt için @MartinEnder, 37 bayt için @ChipHurst !

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

Ne eğlenceli bir mücadele!

açıklama

...&~Array~4

1'den 4'e tekrarlayın ...

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

Renkli altıgen kodları RGBColornesnelere dönüştürerek Google logo grafiğine uygulanabilsinler. Renk paletini <input>inci rengine değiştirin.

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

Çapraz köşeleri (0, -1) ve (sqrt (24), 1) olan doldurulmuş bir dikdörtgen (2D cuboid) oluşturun.

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

Orjinalinde Annulus, iç yarıçapı 3 ve dış yarıçapı 5 ile dört dolgulu çeyrekler oluşturun ArcCsc@5.

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

N x N boyutunda bir grafik oluşturun, x = -5 ila x = 5 (dolguyu siler).

çıktılar

N = 10

görüntü tanımını buraya girin

N = 100

görüntü tanımını buraya girin

N = 200

görüntü tanımını buraya girin

N = 10000 (tam çözünürlük için resme tıklayın)

görüntü tanımını buraya girin


44

C (Windows), 311 bayt

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

Komut satırı argümanı olarak "N" yi alır ve doğrudan ekrana çizer.

Un-golfed:

#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! */
}

Tutabilir 0xF48542ve 0xFFFFFFtamsayılar.
Yytsi

Hangi derleyiciyi / bağlayıcıyı kullandınız? MinGW ile çalışmaz
vsz

@vsz Muhtemelen, Visual Studio'nun derleyicisi.
Kroltan

@vsz gcc g.c -lgdi32mingw ile derleyebilirim .
jingyu9575,

2
-1>>8ayrıca çalışabilir
Mark K Cowan

33

Python 2,244 220 bayt

Martin Rosenau'nun [-1,1] ^ 2 uçağındaki dönüşümünü ve çıkarma 0.ya da parantez gibi küçük golf oynamalarını kullanma

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)

Açıklama:

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
 )

İkili PPM olarak çıktı, kullanım:

python golf_google.py > google.ppm

Örnekler

  • 13

13

  • 50

50

  • 100

100

  • 1337

1337

önceki 244 baytlık çözüm

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

Ungolfed beta Sürüm önce eğer / başka eleme:

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, 1forişe yarayıp yaramadığından emin değilim .
Yytsi

1
@TuukkaX Yapar .
mbomb007

Örnek çıktı ekleyebilir misiniz?
Cyoce

@TuukkaX, 1foreklenen @Cyoce numune çıktısı için teşekkür etti
Karl Napf 12:16

Kodunuzdaki tüm ondalık sayılar şeklinde 0.xazaltılabilir .x:)
Yytsi

27

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

384 383 371 367 359 327 316 308 Tuval öğesi için 304 bayt JavaScript + 24 13 bayt

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

Saat yönünün tersine çizim ile 1 bayt kaydedildi.
Conor O'Brien sayesinde HTML’de 11 bayt kaydedildi. Prinzhorn sayesinde blok
kullanılarak kaydedilen 12 bayt with.
4 bayt daha iyi kullanım ile kaydedildi z=q-y/2.
Kullanılarak kaydedilen 8 bayt parentNodeve backgroundAlexis Tyler sayesinde.
Mavi ark / çubuğu daha kesin bir çizim kullanarak kaydedilmiş 32 bayt, bu yüzden artık bir bölümünü silmeme gerek yok.
Tejas Kale sayesinde parentNode yerine canvas css ayarlayarak 11 bayt kaydedildi.
8 bayt kullanılarak withve maptek bir deyimle kaydedilmiş ('2d'), n/5bunun yerine `2d` yerine , içinde geçmiş .2*nve başlangıçta prompt(...). Tarafından
değiştirilen 4 bayt kaydedildiMath.PI/4.7854 RobAu sayesinde yeterince hassas görünüyor.


Açıklama:

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

Tuval boyutları kullanıcı girişi ile initilize edilir ve arka plan beyaz olarak ayarlanır. qbaşlatıldı.

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

Her renk için, sonuncu (mavi) renk için bir miktar ayar ile daire kısmını çizer. Çubuk, her renk için aynı yerde aynı boyutta çizilir, böylece yalnızca sonuncusu (mavi) görünür.


2
<canvas id=d></canvas>çalışmalı ve <canvas id=d>çalışmalı.
Conor O'Brien,

1
BackgroundColor öğesini background ile değiştirerek 5 karakter daha kaybedebilirsiniz.
Alexis Tyler

1
Ayrıca yerine d.parentElement ait d.parentNode kullanmak
Alexis Tyler

1
ParentNode boyutlarını neden ayarlıyorsunuz? Sadece d.stylebende çalışıyor. Hangi sağlar(f = d.style).width = f.height = n = prompt() + 'px';
Tejas Kale

1
2 .785398Math.PI/4
byte'ı

25

BBC BASIC, 177 bayt

Tercümanı http://www.bbcbasic.co.uk/bbcwin/download.html adresinden indirin.

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, 2 birim = 1 piksel kullanır, bu nedenle nmerkezde bir G yarıçap birimi (= n / 2 piksel) çizeriz n,n.

Fikir, rengini uygun şekilde değiştirerek bir dizi radyal çizgi çizmektir. Piksellere dönüştürüldüğünde sayıların kesilmesi nedeniyle çizgiler arasında küçük boşluklar olduğu tespit edildi, bu yüzden ince üçgenler aslında çizildi.

Çizgi taraması tamamlandığında, imleç mavi alanın sağ üst köşesindedir. Köşegen zıt köşe için tek bir koordinat, şekli tamamlamak için bir dikdörtgen çizmek üzere verilir.

Ungolfed

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.

İyi iş! Cevabınızı görmeden önce benim de Logo'da benzer bir yöntem kullandım. Beni 81 bayta kadar dövttün.
GuitarPicker

21

HTML / JS, 680 624 bayt

624 bayt almak için, sonuncuyu kaldırın ;, bu, HTML'yi içe aktarma biçimi nedeniyle aşağıdaki snippet için gereklidir. Ayrıca, Firefox'un yerine Firefox çözümü yapan +7, bunun yerine desteklemiyor image-rendering: pixelatedve ihtiyaç duyuyor -moz-crisp-edges(teşekkürler @ alldayremix !) Ancak bu beklendiği gibi Chrome'da çalışıyor.

İstenecek JavaScript'i ve öğeleri konumlandırmak / renklendirmek için Nbir <style>blok kullanır. Bir tuval üzerine stil uygulamak yerine temel HTML öğelerini kullanır (göründüğü kadarıyla çok daha kısa bir yaklaşımdır!). Bu data:sadece renkli elemanlar yerine URI arka plan görüntüsü kullanan yenilenmiş bir yaklaşımdır . Bu yeni yaklaşımın daha az tarayıcıda çalışması durumunda önceki yaklaşımı aşağıda tuttum.

Bunun sona erdiğinden çok daha küçük olacağını düşünmüştüm, ama yine de ilginç bir egzersizdi!

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

Önceki versiyon:

<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
Hain! (sadece şaka, güzel bir ;-))
Dada

Tarayıcımda eski sürüm renkler arasında hafif boşluklar gösteriyor ve yeni sürüm renkler arasında gradyan geçişi veriyor (Win10 x64'te Firefox 49.0.1 32-bit)
alldayremix

1
@ alldayremix hmmm, Firefox'un image-rendering: -moz-crisp-edgesyerine ihtiyaç duyduğu gibi görünüyor pixelated. Bu etkiye bir not ekleyecektir. Gradyan tarzını çok beğendim! :)
Dom Hastings

Hem HTML hem de Javascript kullandığınızdan, başlığı "HTML / JS" okumak üzere değiştirdim.
Mego

20

Imagemagick ile Bash (ama gerçekten Postscript), 268 255 249 bayt

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

Kaldırmak için ölçeklendirme Doubled setlinewidthile bir ölçek faktörü yerini dupve içine bir boşluk birleştirilmiş A(ile edemez değişken Cçünkü $C45"değişken olarak ayrıştırılır C45").

Bu düzenlemeleri önerdiğiniz için joojaa'ya teşekkür ederiz!

Eski Ölçek, 255 bayt

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

Alır N o.png için yalnız argüman ve çıkış.

Eski Ölçek için Ungolfed Postscript

%!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
Ölçek çizgisinden bir char'ı tıraş ederek bu kısaltmayı 61.2 dup scaleyapabilirsiniz. Ayrıca C benzeri bir boşluk ekleyebilir C=' setrgbcolor 5 5 4 've 4 boşluk tıraş edebilirsiniz. Bunu yarı ölçekte tasarladıysanız ihmal edersiniz2 setlinewidth
joojaa

19

MATLAB, 189 184 bayt

[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])

ungolfed

[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 ( -MImagerbayrak için +7 ) = 457 bayt

Fonksiyonel newçağrıları kullanarak ve parenlerden kurtularak , son noktalı virgül popyerine bunun yerine Dada sayesinde birkaç bayt kurtardım $ARGV[0]. $n=popİlk kullanıldığı yeri koyarak ve 'yerine Perl 4 ad boşluğu gösterimini kullanarak biraz daha tasarruf ettim ::.

$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')

CPAN'dan kurulması gereken Imager modülünü gerektirir . Komut satırı argümanı olarak bir tamsayı alır. Görüntü kenar yumuşatma değil, bu yüzden biraz çirkin.

Aşağıdaki kodu g.pl dosyasına kopyalayın. -MImagerBayrak için ek bir +7 bayta ihtiyacımız var , ancak birkaç bayttan tasarruf ediyor, çünkü buna ihtiyacımız yok use Imager;.

$ perl -MImager g.pl 200

İşte çeşitli ebatlar:

N = 10

10px

N = 100

100px

N = 200

200px

Tamamen ungolfed kod yalındır.

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

Bu yazı daha önce çıktı görüntüsü gibi bir biçime sahipti. Bu kod golf kurallarına aykırı olduğu için onu kaldırmak zorunda kaldım. Bkz düzeltme geçmişini , bakmak istiyorum. Bunu oluşturmak için Acme :: EyeDrops'u kullandım , ASCII sanatına dönüştürdüğüm programın kendisiyle oluşturduğum bir görüntüden yarattığım şekliyle. Ben şaşırttım kod zaten bir golf evalile değiştirildi, bu bir ilk ile değiştirilerek görülebilir print.


Çok hoş! Golf hakkında sadece birkaç detay: popyerine $ARGV[0]. $h=($n=pop)/2yerine $n=pop;...;$h=$n/2. new Imager::Color"#$_"yerine Imager::Color->new("#$_"). (ve son noktalı virgül bırakmayı unuttun). Ama bir kez daha, bu sadece bazı küçük detaylar, kodunuz gerçekten harika! (Yapamadım! Hatta Imagerhangisi uygun olduğunu bile bilmiyordum !)
Dada

@Dada teşekkürler. Aslında oldukça basit bir kod. İnsanları SO'da yöntem gösterimini kullanma konusunda çok fazla düzeltirim ki bunu bilerek yapmamak gerçekten zor. Ama sen haklısın. Imager'ı ilk defa kendim kullandım. Perl Weekly'de gördüm galiba.
simbabque 18:16

@ Per Imager'Colorile 4 ad alanı sınırlayıcı kullanarak da başka bir bayt kaydeder. :)
simbabque 18:16

Gerçekten, ilk defa bu sözdizimi için bir kullanım görüyorum! Ayrıca, :) -MImagerdaha kısadıruse Imager;
Dada

1
P Ve koyarak: @Dada Zaten Şunu yapacaktım $n=popiçine newargs parens ve noktalı virgül kaydeder
simbabque

14

PHP + SVG, 300 Bayt

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

Ölçekleme kısmı width=<?=$_GET[w]?>

333 değerinin çıkışı

<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
Özniteliklerin çift tırnak ( ") ve bir sonraki öznitelik arasındaki boşluğu dolduramaz mısınız? Örn <svg width="333" viewBox="0 0 10 10">- -<svg width="333"viewBox="0 0 10 10">
Bojidar Marinov

@BojidarMarinov Evet bu yanlış bir kaç Byte kaydeder. Teşekkür ederim
Jörg Hülsermann

1
Yol verileri içindeki harfler ve sayılar arasındaki boşlukları kaldırı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 12:16

1
Elbette. Ayrıca, echoecho'<use xlink:href="#c"fill="#'.$k.'"transform="rotate($v,5,5)"/>';echo"<use xlink:href='#c'fill='#$k'transform='rotate($v,5,5)'/>"
ifadeniz

2
Bence çoğu çift tırnak güvenle kaldırılabilir. Gibi <rect x=5 y=4 fill=#4285f4 width=4.9 height=2 />(Burada, daha önce bir boşluk gerekir /.)
Arnauld

14

Logo, 258 bayt

... çünkü logoları Logo kullanarak yapmalıyım . Bu bir işlev olarak uygulanır. Calormen.com'un çevrimiçi Logo tercümanını kullanarak geliştirdim

Başlangıçta her bölümü çizip boya doldurmayı denedim, ancak beklenenden daha büyük olduğu ortaya çıktı. Çok fazla boşa harcanmış hareket geri izleme faaliyeti vardı. Bunun yerine, başlığa göre rengi ayarlayarak, kutupsal bir grafik taraması yapmaya karar verdim. Matematiğin zor kısmı G dikdörtgenin üstündeki eğri için geometri yapıyordu. Bazı ondalık basamakları kırpabilir ve daha az kesinliğe sahip olabilirsiniz, ancak bunun tipik ekran boyutlarına uyması için yaklaşık 3 basamağa kadar doğru olmasını istedim.

golfed

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

Numune

g 200 Google logosu, boyut 200px

Ungolfed

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 bayt

Logonun genişliği için istekte bulunur (999'a kadar) ve onu tuvalde, piksel başına piksel cinsinden çizer.

Düzenleme : İlk sürüm, Kartezyen koordinatlarını (x,y)Polar koordinatlarına dönüştürüyordu (r,a), ancak gerçekten açıya ihtiyacımız yok. Sadece hangi çeyreğin içinde olduğumuzu bulmak xve karşılaştırma yapmak daha basit (ve çok daha kısa) y.

Düzenleme : ETHproductions sayesinde 1 bayt kaydedildi.

JS, 251 224 220 218 217 bayt

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 bayt

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

ES6 sürümü: 258 231 227 225 224 + 34 = 258 bayt

Snippet için önerilen maksimum genişlik: 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>


JavaScript kısmına baktım ve hemen düşündüm, "Bu <-ve -->operatörler nelerdir ?" Sanırım 24 saat boyunca varsayımsal bir operatör için varsayımsal operatörler hakkında düşündüğünüzde olan şey ...: P
ETHproductions

@ETHproductions Ayrıca, etiketleri bir html dosyasına -->yerleştirirse, bir html yorumunun başlangıcı (?) Olarak yorumlanan Notepad ++ sözdizimi vurgulayıcısının kafasını karıştırırlar <script>.
Arnauld,

İster inanın ister inanmayın, Notepad ++ bir tür haktır (tamamen olmasa da). ES6 uyumluluk tablosundaki son öğeye göz atın .
ETHProductions, 13:16

@ETHproductions - Vay. Sanırım bu sözdiziminin arkasında iyi bir sebep var, ama göremiyorum. Bunu gösterdiğin için teşekkürler.
Arnauld,

Sadece bilirsin, sadece bir satırın başında geçerli olduğuna inanıyorum. 123 --> commenttarayıcı konsolumda hata veriyor (Firefox 49), --> commentbunu yapmıyor.
ETHProductions

10

C #, 276 + 21 = 297 bayt

Sistem için 276 bayt + System.Drawing içe aktarma için 21 bayt.

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

Martin Rosenau'nun algoritmasına dayanıyor. Görüntüyü oluşturmanın bir yolunu bulmanın zor kısmını yaptığınız için teşekkür ederiz!

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


Renk kodunda saydamlığı dahil 0xFF...
etmeyerek

8

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

*{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>

Dönüşümler yerine doğrusal degradeler kullanır. Düzenleme: @darrylyeo sayesinde 140 bayt kaydedildi. Degrade yerine fazladan bir öğe kullanarak 20 bayt kaydedildi. @DBS sayesinde 24 bayt kaydedildi. @Hedi sayesinde 16 bayt kaydedildi. Arkadan öne, çeşitli katmanlar:

  • a Mavi daire
  • b Çubuğun üstündeki parçayı gizleyen beyaz bir dikdörtgen
  • c Kırmızı / sarı üst sol çeyrek
  • d Kırmızı oktant üst sağ
  • e Sarı / yeşil alt sol çeyrek
  • f Yeşil / mavi alt sağ çeyrek
  • g İç beyaz daire
  • h Yatay mavi çubuk

Bunun yerine kimlikleri, aşağıdakiler gibi eleman isimleri kullanmalıdır a, b, i, skullanın, vb *yerine divCSS seçicisi için.
darrylyeo

Ayrıca, backgroundbir steno olarak kullanın background-image.
darrylyeo

@darrylyeo Teşekkürler, bu benim puanımda büyük bir fark yarattı, HTML'den alıntıları çıkarmayı bile unutmam konusunda bana yardımcı olmadı ...
Neil

Heh, sorun değil!
darrylyeo

Bileşik kullanarak burada ve orada birkaç karakter kaydedebileceğinizi düşünüyorum border-radius. Örneğin, c{border-radius:100% 0 0;yerinec{border-top-left-radius:100%;
DBS,

8

Ruby 2.3.1, 376 359 bayt

RMagick gemini kullanma.

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

Örnekler

50x50

50x50

250x250

görüntü tanımını buraya girin

500x500

görüntü tanımını buraya girin

1000x1000

görüntü tanımını buraya girin

Dosya iki parametre alır; ilki boyut, ikincisi çıktıyı kaydetmek için kullanılan dosya adıdır.

Ungolfed

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

Başlangıçta bunu oily_png / chunky_png kullanarak çözmeye başlamıştım, ancak bu RMagick'e kıyasla çok daha karmaşık olacaktı. RMagick'in .ellipse işlevi bunu çok kolaylaştırdı ve asıl iş her şeyin şeklini / boyutunu ayarlamaktı.

Bu benim ilk Code Golf gönderim (aynı zamanda ilk SE cevabı) ve kendimi yalnızca Ruby ile ara bir şekilde görüyorum. İyileştirme / ipuçlarıyla ilgili girdileriniz varsa, lütfen paylaşmaktan çekinmeyin!


Gönderimimi (404 hatası) düzenleyemiyorum ama eğer 177 baytı kesen ve 359 bayt'a indiren golf çözümümden gerekli satırı çıkarsaydım.
metropol

5

Python 2, 378 373 bayt

Bunu kullanarak gerçekten yapmak istemiştim turtle. Bunun için Geometri konusundaki bilgimi mahvetmek zorunda kaldım, meydan okuma tanımında verilmeyen açı ve uzunlukları hesapladım.

Düzenleme: kaldırıldı up(), çünkü bunu yaparken yeşil ile mavi arasındaki küçük beyaz şeridi kaldırır ve iç dairenin daha iyi görünmesini sağlar. Bu, programı daha da yavaşlatır.

Düzenleme: daha hızlı yapmak için 9*nile değiştirildi 2*n. Hala pürüzsüz bir daire yaratacağına karar verdim.

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)

Notlar:

  1. Ivır zıvır Python 3 kullanır, bu nedenle giriş int.
  2. Sadece hız için eklediğim çıkarırsanız , biblolar gerçekten yavaştır .nspeed(0)
  3. Kodun yavaşlığı çoğunlukla, circlebüyümenin üçüncü parametresi nedeniyledir O(n), çünkü dairenin çizilmesi için yazılı poligonun kaç tarafı olduğunu belirler.

Çevrimiçi deneyin

Ungolfed: Çevrimiçi deneyin

Eğlenceli gerçek: Python'un GUI paketi ve temelini oluşturan Trinketbir programdır .Tkinterturtle


Ayrıca, eğer birileri Python kurulu ise, nbenim için büyük bir değerle çalıştırabilirler mi? Güzel gözükmüyorsa, sqrtdaha kesin olmak için bazı şeyleri içeri koymam gerekebilir . Ben bine yuvarladım.
mbomb007 12/16


Sadece endişelendiğim büyük değerler.
Biblodaki


@daHugLenny Fikrim yok. 10000 gibi büyük bir değer olduğundan, bu bir bellek sorunu olabilir.
mbomb007

5

PHP + GD, 529 449 bayt

Bu bir sorgu dizesi parametresi alır nve belirtilen boyutta logonun PNG sürümünü çıkarır.

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

Ungolfed:

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


Dize sabitlerinin çoğunun tırnaklara ihtiyacı yoktur. Gerçek renkli görüntünün ihtiyacı yok imagecolorallocate; sadece çizim fonksiyonlarına renk olarak 0xRRGGBB ver. Biraz daha golf oynamak ve 329 bayta kadar: 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");koşmak -r, komut satırından giriş almak ve çıkış yapmak g.png.
Titus

Üzgünüm önceki golf iki bayt çok kısa oldu: [$kolması gerekiyor [+$k. Ancak bunun da çalışması gerekir: 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 bytes)
Titus

@Titus Teşekkürler. Bu cevaptan sonra ihtiyacın olmadığını öğrendim imagecolorallocate. Cevabımı kodunuzla güncelleyeceğim. Ancak dosya adına çıktı göndermeniz gerekiyor mu? Dosya imagepngadını içeride bırakıp çıktıyı stdout'a gönderemez misiniz ?
Kodos Johnson

5

Java, 568 bayt

Golf için en güçlü dil değil, ama en ciddi girişim:

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

Kullanımı:

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

Golf edilmemiş versiyon - temel fikir u, v ∈ [−0,5, 0.5] koordinat sisteminde çalışmak ve her pikselin görüntü merkezinden uzaklık ve açısını hesaplamak:

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

}

Uygulamam ham pikselleri hesaplar ve çizer. Çizimi yapmak için Graphics2D ve Arc2D gibi yüksek seviye grafik yordamları kullanan alternatif bir uygulama oluşturmak mümkündür , özellikle de kenar yumuşatma ile.


4

Git, 379 bayt

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

İşlev ftek bir intargüman alır (ölçek faktörü) ve uygun şekilde ölçeklendirilmiş bir SVG görüntüsü çıkarır.

Ideone'da çevrimiçi olarak deneyin.

Örnek çıktı:

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

Google overlord'larımızı kendi dilleri dışındaki herhangi bir programlama dilinde yatıştırmak yanlış görünüyor.


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*

Çevrimiçi deneyin

Görüntüyü ASCII ppm formatında çıkarır.
Tarayıcıda bakması daha güzel olan bir ASCII-sanat sürümü için bu kodu deneyin . Algoritmanın görselleştirilmesine de yardımcı olur.

Açıklama:

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 bayt, rakipsiz

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)

Ne yazık ki yuvarlak hat birleştirme işlemi istenen etki değil, ancak oldukça yakın.


3

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

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}

FreeMarker işlemcisinin, ngirişi temsil eden değişken bir set ile yürütüldüğünü varsayalım .

Sihirli sayıların açıklaması:

Her şey bir 10x10 piksel sarıcıya dayanıyor ve ardından ölçeklendiriliyor n/10.

  • Mavi yatay kutunun sağına olan mesafe [px]: 5 - sqrt (5 ^ 2 - 1 ^ 2) = 0.10102051443 ( Pisagor )
  • Mavi arkın dönmesi: 45 - arkSin (1/5) = 33.4630409671 ( Sinüs )

Ungolfed JSFiddle


CSS Bölümünü bir stil öğesine yerleştirin ve Javascript veya PHP kullanın. (PHP) transform:scale(n)ile değiştirin transform:scale(<?=$_GET[n])?>. Javascript'te CSS Bölümünü Element stiline ekleyebilirsiniz
Jörg Hülsermann 13:16

JS hakkında düşündüm ama kodu çok fazla bozmak istemedim. Ancak, şablonlama dilleri iyi görünüyor, bu yüzden FreeMarker ile birlikte gittim ve cevabımı hızlıca ayarladım, teşekkürler.
Cedric Reichenbach

Mavi çubuk sanırım sağ tarafta çok sağ
RobAu 14:16

Hayır, x, mavi çubuğun genişliğini ifade eden ya da buna göre sağa olan mesafeyi 0,5 x x belirten, yan uzunlukları 0,5, 0,1 ve x olan bir dik üçgen hayal ederek kolayca hesaplayabilirsiniz. x daha sonra Pisagor teoremi kullanılarak belirlenebilir (eklediğim açıklamalara bakınız).
Cedric Reichenbach

JSFiddle, denediğim iki tarayıcıda (Win10 x64) doğru görüntülenmiyor - Chrome 54.0.2840.59 m (64-bit) ile mavi çubuk sağa çok uzağa uzanıyor ve Firefox 49.0.1 (32) -bit) mavi kavisli kısımda ortada hafif bir boşluk var
alldayremix 14:16

3

343 oktet 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"
};

açıklama

  • "P3" == düz metin taşınabilir pixmap
  • show == "\ xFF \ xFF \ xFF" için UTF-8 bozulmasından korkan ASCII ondalık değerleri üretti
  • unlines == Ondalık satırları satırlara ayırma
  • n == uzunluğunda simetri için m = n-1 [0..m]
  • m²- (2x-m) ²- (2y-m) ²> 0 == (xm / 2) ² + (ym / 2) ² <(m / 2) ² == insideOuterCircle
  • (10x-5m) ² + (10y-5m) ²- (3m) ²> 0 == (xm / 2) ² + (ym / 2) ²> (m3 / 10) ² == dışındaInnerCircle dışında
  • mxy> 0 == x + y <m == inUpperLeft
  • xy> 0 == x> y == inUpperRight
  • 5y-2m> 0 == y> m2 / 5 ==GbarTop altında
  • 3y-5y> 0 == y <m3 / 5 == yukarıdakiGbarBot
  • 2x-m> 0 == x> m / 2 == inRightHalf
  • [234,67,53] == kırmızı
  • [251,188,5] == sarı
  • [52,168,83] == yeşil
  • [66,13,244] == mavi
  • [255,255,255] == beyaz

1
Eğer 7 bit ASCII ile tüm kodlamak sürece (en yüksek karakter sen is kullandığınız codepoint beri Yapabileceğin hangi 0x7C/ 124/ |) , bu durumda olurdu Haskell 338 septets . Ancak son 8 yılda standart olarak 8 bitlik bir bayt veri depolama alanı haline geldiğinde, "bayt" teriminin ölü atı atmadan yeterli olduğunu düşünüyorum.
Slipp D. Thompson

3

SAS - 590 536 521 bayt

Bu GTL Ek Açıklama tesisini kullanır . Giriş, ilk satırdaki bir makro değişkeninde belirtilir. Fazladan bir kaç bayt için, her şeyi bir makro olarak tanımlayabilirsiniz. Hala bir şeyler gizlemek için boş bir grafik şablonu tanımlamanız gerekmesine rağmen Java'nın içine gizlice giriyor ve bir kaç HTML cevabı!

Bir satır okunabilirlik düzeyi için satır sonlarını bıraktım, ancak bunlar olmadan çalıştıkları için toplamları saymıyorum.

%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;

Düzenleme: makro değişkenleri, varsayılan ayarları ve operatör seçimi ile birkaç bayt daha fazla tıraş.

Düzenleme 2: mantık için do-endbloklardan kurtuldum if-then-elseve bir şekilde hala çalışıyor - nasıl olduğunu tam olarak anlamadım. Ayrıca, euclidişlevi keşfettim !


2

SCSS - 415 bayt

Girdileri alır $N: 100px;ve <div id="logo"></div>toplamları sayıp saymayacağından emin değiliz ...

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

JSFiddle'da Demo


1

Haskell ile JuicyPixels paketinde, 306 bayt

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

Kullanım örneği:

main = writePng "google.png" $ f 1001

Bu muhtemelen geliştirilebilir. Fikir, generateImagex, y konumunda olması gereken pikseli (gerçekten renk) seçen bir işlevi iletmektir. Bunun için nparametre olarak ekleyen ve hepsini aynı anda yüzdüren bir lambda kullanıyoruz . #Biz halka, çubuk veya hiçbiri iseniz fonksiyon temelde denetler. Eğer halka ise batonu geçersek %, çubuk maviye dönersek, aksi takdirde beyaz olur. %Hangi kadranda bulunduğumuzu kontrol eder ve mavi değilse uygun rengi döndürür. Mavi, kırmızıya dolaşmadığından emin olmamız gerektiğinden özel bir durumdur, bu nedenle yalnızca y"çubuk çizgisinin" altındaysa maviye döneriz , aksi takdirde beyaza döneriz. Genel bakış budur.


0

Processing.py - N'deki rakamların sayısı için 244 bayt + 1 bayt

Kod ile başlayalım. Bu İşleme ortamında yapıştırılabilir ve koştu ( Nfarklı boyutlarda değişen ).

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)

Küçük hile: logonun bir kısmını kesen daire, İşleme'nin varsayılan arka plan rengi olan gri tonlama gölgesinde (205) çizilir. Bunu bir görüntüye dışa aktarmak aynı olmazdı. Bu bir çağrıyı kaydeder background(255).

açıklama

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

Örnekler

N = 400

N = 400

N = 13 (İşlemenin minimum boyutu 100x100)

görüntü tanımını buraya girin

Not

Bize elle birden çok değerle düzenlemek için izin verirsek Niçin açık çağrılar setupve drawgerekli değildir ve aşağı 213 bayt rakam başına + 3 bayt etmektir 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)

Kendi başına, bu tam bir program değildir
İnekler,

Yeterince adil. Tamamlanmamış programı sildim ve programı tam sürümüyle değiştirdim.
PidgeyUsedGust
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.