Tenangkan Google Overlords Anda: Gambarkan Logo "G"

136

Tulis program atau fungsi yang menghasilkan bilangan bulat positif N, dan menghasilkan gambar piksel N × N dari logo "G" Google sesuai dengan konstruksi * ini:

Konstruksi logo "G"

Misalnya, jika N adalah 400, logo 400 × 400 piksel harus dihasilkan, dengan dimensi dan warna yang benar:

Contoh "G" logo 400x400

Seharusnya terlihat akurat terlepas dari seberapa besar atau kecil N. misal di sini adalah N = 13:Contoh "G" logo 13x13

Kode Anda seharusnya tidak perlu terhubung ke internet. Misalnya, penskalaan svg yang di-host secara eksternal tidak diizinkan. (Melakukan penskalaan svg yang dikodekan dalam kode Anda akan baik-baik saja.)

Anti-aliasing dapat digunakan atau tidak. Terserah kamu.

Perhatikan bahwa bilah horizontal "G" tidak memanjang sampai ke tepi kanan gambar. Kurva lingkaran biasanya ke dalam di tepi kanan sebelum terputus.

Kode terpendek dalam byte menang.


* Konstruksi logo telah disederhanakan untuk tantangan ini. Konstruksi yang benar dapat dilihat di sini dan di sini .

Hobi Calvin
sumber
1
Apakah ada N minimum? Gambar 1x1 kemungkinan akan menghasilkan keluaran yang tidak dapat dikenali terlepas dari seberapa bagus solusinya.
jpmc26
@ jpmc26 N adalah bilangan bulat positif, jadi minimum 1. Tentu saja gambar 1x1 tidak dapat dikenali, tetapi artinya "Seharusnya terlihat akurat", misalnya gambar hitam tidak masuk akal, bahkan pada skala itu.
Calvin Hobbies
4
Apa hasil yang diharapkan untuk gambar 1x1? Satu piksel dari salah satu warna dalam gambar? Gambar putih? Bagaimana dengan 2x2? Masih ada lebih banyak warna dalam gambar daripada piksel untuk ukuran itu. Jika ada gambar yang tidak dapat diterima pada skala tersebut, tantangan harus menentukan apa yang bisa dan tidak bisa diterima, karena Anda tidak dapat menghasilkan gambar bahkan mendekati penampilan yang benar, bukan? (Jika itu tantangan saya, saya akan mengecualikan mereka agar tetap sederhana, tetapi keputusan Anda. Anda juga perlu memverifikasi bahwa Anda tidak mengecualikan jawaban yang ada dengan spesifikasi baru, saya pikir.)
jpmc26
@ jpmc26 Tidak. Orang dapat menggunakan akal sehat untuk mengetahui apakah 1x1 atau gambar kecil lainnya terlihat akurat.
Calvin Hobi
Apakah kami diizinkan mengunduh yang sudah dibuat sebelumnya .svgdan menyandikannya ke dalam solusi kami, atau apakah pada awalnya kami harus membuatnya?
juniorRubyist

Jawaban:

55

Mathematica, 229 226 225 224 221 206 169 byte

Terima kasih @MartinEnder untuk 1 byte, @ChipHurst untuk 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]&

Tantangan yang menyenangkan!

Penjelasan

...&~Array~4

Iterasi mulai 1 hingga 4 ...

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

Konversikan kode heksa warna menjadi RGBColorobjek, sehingga dapat diterapkan ke grafik logo Google. Ubah palet <input>warna ke warna th.

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

Buat persegi panjang terisi (2D berbentuk kubus), yang memiliki sudut diagonal (0, -1) dan (sqrt (24), 1).

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

Hasilkan empat perempat terisi Annulus, berpusat di titik asal, dengan jari-jari dalam 3 dan jari-jari luar 5. Jangan melewati ArcCsc@5(di mana segmen biru berakhir).

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

Buat grafik dengan ukuran N x N, dari x = -5 hingga x = 5 (menghapus bantalan).

Keluaran

N = 10

masukkan deskripsi gambar di sini

N = 100

masukkan deskripsi gambar di sini

N = 200

masukkan deskripsi gambar di sini

N = 10.000 (klik gambar untuk resolusi penuh)

masukkan deskripsi gambar di sini

JungHwan Min
sumber
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);}}

Membawa "N" sebagai argumen baris perintah dan menggambar langsung di layar.

Tidak golf:

#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! */
}
Martin Rosenau
sumber
Anda bisa menyimpan 0xF48542dan 0xFFFFFFdalam bilangan bulat.
Yytsi
Kompiler / tautan apa yang Anda gunakan? Tidak bekerja dengan mingw
vsz
@vsz Agaknya, kompiler Visual Studio.
Kroltan
@vsz Saya bisa mengkompilasinya dengan gcc g.c -lgdi32di mingw.
jingyu9575
2
-1>>8mungkin juga berfungsi
Mark K Cowan
33

Python 2, 244 220 byte

menggunakan transformasi Martin Rosenau di pesawat [-1,1] ^ 2 dan bermain golf kecil seperti melepas 0.atau tanda kurung

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)

Penjelasan:

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
 )

Output sebagai PPM biner, penggunaan:

python golf_google.py > google.ppm

Contohnya

  • 13

13

  • 50

50

  • 100

100

  • 1337

1337

solusi 244 byte sebelumnya

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

Versi beta yang tidak dikolomisasi sebelumnya jika eliminasi:

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
Karl Napf
sumber
Hmm, tidak yakin kalau 1forberhasil.
Yytsi
1
@ TuukkaX Ya .
mbomb007
Bisakah Anda memasukkan sampel output?
Cyoce
@TuukkaX terima kasih atas 1forsampel sampel @Cyoce yang ditambahkan
Karl Napf
Semua desimal dalam kode Anda yang dalam bentuk 0.xdapat dikurangi menjadi .x:)
Yytsi
27

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

384 383 371 367 359 327 316 308 304 byte JavaScript + 24 13 byte untuk elemen kanvas

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

1 byte disimpan dengan menggambar berlawanan arah jarum jam.
11 byte disimpan di HTML berkat Conor O'Brien.
12 byte disimpan menggunakan withblok terima kasih kepada Prinzhorn.
4 byte disimpan dengan penggunaan yang lebih baik z=q-y/2.
8 byte disimpan dengan menggunakan parentNodedan backgroundterima kasih kepada Alexis Tyler.
32 byte disimpan dengan menggunakan gambar yang lebih tepat dari arc / bar biru jadi saya tidak perlu menghapus bagian dari itu lagi.
11 byte disimpan dengan mengatur kanvas css bukan parentNode-nya berkat Tejas Kale.
8 byte disimpan menggunakan withdan mapdengan satu pernyataan, `2d` bukan ('2d'), n/5bukannya .2*nmenginisialisasi dan latar belakang di prompt(...).
4 byte disimpan menggantikan Math.PI/4oleh.7854 yang tampaknya cukup presisi berkat RobAu.


Penjelasan:

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

Dimensi kanvas diinisilisasi dengan input pengguna dan latar diatur ke putih. qdiinisialisasi.

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

Untuk setiap warna gambarlah bagian lingkaran, dengan beberapa penyesuaian untuk yang terakhir (biru). Bilah digambar untuk setiap warna di tempat yang sama dengan dimensi yang sama sehingga hanya yang terakhir (biru) yang terlihat.

Hedi
sumber
2
<canvas id=d></canvas>harus bekerja, dan <canvas id=d>mungkin berhasil.
Conor O'Brien
1
Anda dapat kehilangan 5 karakter lagi dengan mengganti backgroundColor dengan latar belakang.
Alexis Tyler
1
Juga gunakan d.parentNode alih-alih d.parentElement
Alexis Tyler
1
Mengapa Anda mengatur dimensi parentNode. Hanya d.stylebekerja juga. Yang memungkinkan(f = d.style).width = f.height = n = prompt() + 'px';
Tejas Kale
1
Anda bisa menggunakan .785398bukannya Math.PI/4memotong 2 byte (atau lebih jika presisi kurang ok
RobAu
25

BBC BASIC, 177 byte

Unduh juru bahasa di http://www.bbcbasic.co.uk/bbcwin/download.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 menggunakan 2 unit = 1 piksel, jadi kami memplot G nunit radius (= n / 2 piksel) di tengah n,n.

Idenya adalah untuk merencanakan serangkaian garis radial, mengubah warna yang sesuai. Ditemukan bahwa ada celah kecil antara garis karena pemotongan angka ketika dikonversi menjadi piksel, jadi segitiga tipis sebenarnya diplot sebagai gantinya.

Setelah sapuan garis selesai, kursor berada di sudut kanan atas area biru. Koordinat tunggal untuk sudut berlawanan diagonal diberikan untuk menggambar persegi panjang untuk melengkapi bentuk.

Tidak disatukan

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.
Level River St
sumber
Kerja bagus! Saya melakukan tambang di Logo menggunakan metode yang sama sebelum saya melihat jawaban Anda. Anda telah mengalahkan saya sekitar 81 byte.
GuitarPicker
21

HTML / JS, 680 624 byte

Untuk mendapatkan 624 byte, hapus yang terakhir ;, ini diperlukan untuk cuplikan di bawah karena cara mengimpor HTML. Selain itu, Firefox tampaknya tidak mendukung image-rendering: pixelateddan membutuhkannya -moz-crisp-edges(terima kasih @alldayremix !) Yang membuat solusi Firefox +7 tetapi ini berfungsi di Chrome seperti yang diharapkan.

Memanfaatkan JavaScript untuk meminta Ndan <style>memblokir untuk memposisikan / mewarnai elemen. Menggunakan elemen HTML dasar, daripada menerapkan gaya ke kanvas (yang, tampaknya, merupakan pendekatan yang jauh lebih pendek!). Ini adalah pendekatan yang dirubah menggunakan data:gambar latar belakang URI bukan hanya elemen berwarna. Saya telah menyimpan pendekatan sebelumnya di bawah kalau-kalau ini baru bekerja pada browser yang lebih sedikit.

Saya pikir ini akan menjadi jauh lebih kecil daripada akhirnya, tapi tetap saja ini merupakan latihan yang menarik!

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

Versi sebelumnya:

<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

Dom Hastings
sumber
1
Pengkhianat! (hanya bercanda, bagus ;-))
Dada
Di browser saya, versi lama menunjukkan sedikit kesenjangan antara warna, dan versi baru memberikan transisi gradien antara warna (Firefox 49.0.1 32-bit pada Win10 x64)
alldayremix
1
@alldayremix hmmm, tampak seperti Firefox perlu memiliki image-rendering: -moz-crisp-edgesbukan pixelated. Akan menambahkan catatan untuk efek itu. Saya cukup suka gaya gradien! :)
Dom Hastings
Saya telah memodifikasi header untuk membaca "HTML / JS", karena Anda menggunakan HTML dan Javascript.
Mego
20

Bash dengan Imagemagick (tapi benar-benar 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

Menggandakan penskalaan untuk menghapus setlinewidth, mengganti satu faktor skala dengan dup, dan menggabungkan spasi ke dalam Avariabel (tidak bisa dengan Ckarena $C45diuraikan sebagai "variabel C45").

Terima kasih kepada joojaa karena menyarankan suntingan ini!

Skala Lama, 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

Membawa N sebagai satu-satunya argumen dan menghasilkan o.png.

Postscript Tidak Dikumpulkan untuk Skala Lama

%!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
NighttimeDriver50000
sumber
2
Anda dapat membuat ini lebih pendek dengan memotong satu char dari garis skala 61.2 dup scaleAnda juga dapat menambahkan spasi dalam C like C=' setrgbcolor 5 5 4 'dan mencukur 4 spasi. Jika Anda mendesain ini pada skala setengah maka Anda bisa menghilangkan2 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])

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])
Rainer P.
sumber
19

Perl 5, 486 477 476 450 (+7 untuk -MImagerflag) = 457 byte

Saya menyimpan beberapa byte berkat Dada dengan menggunakan newpanggilan fungsional dan menghilangkan parens, dan dengan menggunakan popalih-alih $ARGV[0]serta titik koma akhir. Saya menyimpan lebih banyak dengan meletakkannya di $n=poptempat yang pertama kali digunakan, dan dengan menggunakan notasi namespace Perl 4 'sebagai ganti ::.

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

Ini membutuhkan Imager modul , yang perlu diinstal dari CPAN. Mengambil satu integer sebagai argumen baris perintah. Gambar tidak anti-alias, jadi agak jelek.

Salin kode di bawah ini ke file g.pl. Kami membutuhkan +7 byte tambahan untuk -MImagerflag, tetapi ia menyimpan beberapa byte karena kami tidak perlu melakukannya use Imager;.

$ perl -MImager g.pl 200

Berikut berbagai ukuran:

N = 10

10px

N = 100

100px

N = 200

200px

Kode yang benar-benar tidak diserang adalah lurus-maju.

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

Posting ini sebelumnya memiliki kode berbentuk seperti gambar keluaran. Karena itu melanggar aturan untuk kode golf saya harus menghapusnya. Lihat riwayat revisi jika Anda ingin melihatnya. Saya menggunakan Acme :: EyeDrops untuk membuat itu, dengan bentuk yang saya buat dari gambar yang dibuat dengan program itu sendiri yang saya konversi ke seni ASCII. Kode saya dikaburkan sudah golf, yang dapat dilihat dengan mengganti yang pertama evaldengan a print.

simbabque
sumber
Sangat bagus! Hanya beberapa detail tentang golf: popbukan $ARGV[0]. $h=($n=pop)/2bukannya $n=pop;...;$h=$n/2. new Imager::Color"#$_"bukannya Imager::Color->new("#$_"). (dan Anda lupa untuk melepaskan titik koma terakhir). Tetapi sekali lagi, itu hanya beberapa detail kecil, kode Anda benar-benar hebat! (Aku tidak bisa melakukannya! Aku bahkan tidak tahu Imager, yang mana cukup nyaman!)
Dada
@Dada terima kasih. Sebenarnya itu kode yang cukup mudah. Saya mengoreksi banyak orang tentang menggunakan notasi metode pada SO sehingga sangat sulit untuk tidak melakukannya dengan sengaja. Tapi kamu benar. Ini adalah pertama kalinya saya menggunakan Imager. Saya pikir saya melihatnya di Perl Weekly.
simbabque
@Dada menggunakan Imager'Colordengan pembatas namespace Perl 4 menghemat byte lain. :)
simbabque
Memang, pertama kali saya melihat penggunaan untuk sintaks itu! Juga, -MImagerlebih pendek dari use Imager;:)
Dada
1
@ Dada saya akan melakukan itu pula: P Dan memasukkan $n=popke dalam newargumen menyimpan parens dan titik koma
simbabque
14

PHP + SVG, 300 Bytes

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

Bagian penskalaan adalah width=<?=$_GET[w]?>

Output untuk nilai 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>

Jörg Hülsermann
sumber
1
Tidak bisakah Anda menempatkan jarak antara tanda kutip ganda atribut ( ") dan atribut berikutnya? Misalnya <svg width="333" viewBox="0 0 10 10">-><svg width="333"viewBox="0 0 10 10">
Bojidar Marinov
@BojidarMarinov Ya itu benar itu menghemat beberapa Bytes. Terima Kasih
Jörg Hülsermann
1
Hapus spasi antara huruf dan angka dalam data jalur: 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
Tentu. Juga, untuk echopernyataan Anda , gunakan string tanda kutip ganda untuk memungkinkan variabel sebaris dan menghapus tanda titik koma: 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
Saya pikir sebagian besar tanda kutip ganda dapat dihapus dengan aman. Seperti <rect x=5 y=4 fill=#4285f4 width=4.9 height=2 />(Di sini, Anda akan membutuhkan ruang sebelum itu /.)
Arnauld
14

Logo, 258 byte

... karena saya pikir logo harus dibuat menggunakan Logo . Ini diimplementasikan sebagai fungsi. Saya mengembangkannya menggunakan penerjemah Logo online Calormen.com

Awalnya saya mencoba menggambar setiap segmen dan mengisinya, tapi ternyata lebih besar dari yang diharapkan. Ada banyak gerakan mundur yang terbuang dan semacamnya. Sebagai gantinya, saya memutuskan untuk melakukan sapuan grafik polar, menyesuaikan warna berdasarkan judulnya. Bagian yang lebih sulit dari matematika adalah melakukan geometri untuk kurva di bagian atas persegi G. Anda dapat memotong beberapa desimal dan kurang akurat, tetapi saya ingin ini akurat hingga sekitar 3 digit untuk mengakomodasi ukuran layar yang khas.

Golf

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

Sampel

g 200 Logo Google, ukuran 200px

Tidak disatukan

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
GuitarPicker
sumber
12

JavaScript (ES7), 285 258 254 252 251 byte

Meminta lebar logo (hingga 999) dan menggambarnya dalam kanvas, piksel per piksel.

Sunting : Versi awal mengonversi koordinat Cartesian (x,y)ke koordinat Polar (r,a), tetapi kami tidak terlalu membutuhkan sudutnya. Lebih mudah (dan jauh lebih singkat) untuk melakukan perbandingan di antara xdan yuntuk mengetahui di kuartal mana kita berada.

Sunting : Disimpan 1 byte berkat produk ETH.

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>

Versi ES6: 258 231 227 225 224 + 34 = 258 byte

Lebar maksimum yang disarankan untuk cuplikan: 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>

Arnauld
sumber
Saya melihat-lihat bagian JavaScript dan langsung berpikir, "Apa-apaan ini <-dan -->operator ??" Saya kira itulah yang terjadi ketika Anda telah berpikir tentang operator hipotetis untuk bahasa hipotetis selama 24 jam ...: P
ETHproduk
@ ETHproductions Mereka juga membingungkan Highlighter Notepad ++ sintaks yang menafsirkan -->sebagai awal (?) Dari komentar html jika ini dimasukkan ke dalam <script>tag dalam file html.
Arnauld
Percaya atau tidak, Notepad ++ agak benar (meskipun tidak sepenuhnya). Lihatlah item terakhir dalam tabel compat ES6 .
ETHproduksi
@ ETProduksi - Wow. Saya kira ada alasan bagus di balik sintaks ini, tetapi saya gagal melihatnya. Terima kasih telah menunjukkan ini.
Arnauld
Asal tahu saja, saya percaya itu hanya valid pada awal baris. 123 --> commentmelempar kesalahan di konsol browser saya (Firefox 49), sementara --> commenttidak.
ETHproduk
10

C #, 276 + 21 = 297 byte

276 byte untuk metode + 21 byte untuk System.Drawing impor.

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

Berdasarkan algoritma Martin Rosenau. Terima kasih telah melakukan bagian yang sulit dengan cara membangun gambar!

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

susu
sumber
Anda dapat menyimpan byte dengan tidak memasukkan transparansi dalam kode warna yaitu0xFF...
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>

Menggunakan gradien linier daripada transformasi. Sunting: Disimpan 140 byte berkat @darrylyeo. Menyimpan 20 byte dengan menggunakan elemen tambahan, bukan gradien. Disimpan 24 byte berkat @DBS. Disimpan 16 byte berkat @Hedi. Dari belakang ke depan, berbagai lapisan adalah:

  • a Lingkaran biru
  • b Kotak putih untuk mengaburkan bagian di atas bilah
  • c Bagian kiri atas merah / kuning
  • d Oktan merah atas kanan
  • e Bagian kiri bawah kuning / hijau
  • f Bagian kanan bawah hijau / biru
  • g Lingkaran putih bagian dalam
  • h Bilah biru horizontal
Neil
sumber
Alih-alih ID, Anda harus menggunakan nama elemen seperti a, b, i, s, dll Gunakan *bukan divuntuk pemilih CSS.
darrylyeo
Juga, gunakan backgroundsebagai singkatan untuk background-image.
darrylyeo
@dryrylyeo Terima kasih, itu membuat perbedaan besar pada skor saya, tidak terbantu oleh saya bahkan lupa menghapus tanda kutip dari HTML saya ...
Neil
Heh, tidak masalah!
darrylyeo
Saya yakin Anda dapat menyimpan beberapa karakter di sana-sini dengan menggunakan kompon border-radius. Misalnya, c{border-radius:100% 0 0;bukannyac{border-top-left-radius:100%;
DBS
8

Ruby 2.3.1, 376 359 byte

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

Contohnya

50x50

50x50

250x250

masukkan deskripsi gambar di sini

500x500

masukkan deskripsi gambar di sini

1000x1000

masukkan deskripsi gambar di sini

File mengambil dua parameter - yang pertama adalah dimensi dan yang kedua adalah nama file untuk menyimpan output sebagai.

Tidak disatukan

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

Saya awalnya mulai memecahkan ini menggunakan oily_png / chunky_png tapi itu mungkin akan berakhir terlalu rumit dibandingkan dengan RMagick. Fungsi elips RMagick menjadikannya mudah dan pekerjaan utamanya adalah menyelaraskan bentuk / ukuran segalanya.

Ini adalah pengajuan Code Golf pertama saya (jawaban SE pertama juga) dan saya hanya menganggap diri saya agak menengah dengan Ruby. Jika Anda memiliki masukan tentang peningkatan / kiat, jangan ragu untuk berbagi!

metropolis
sumber
Tampaknya saya tidak dapat mengedit posting saya (kesalahan 404) tetapi jika saya harus menghapus baris yang diperlukan dari solusi golf saya yang akan mencukur 17 byte dan membawanya ke 359 byte.
metropolis
5

Python 2, 378 373 byte

Saya benar-benar ingin melakukan ini menggunakan turtle. Saya harus menghapus pengetahuan saya tentang Geometri untuk ini, menghitung sudut dan panjang yang tidak disediakan dalam deskripsi tantangan.

Sunting: dihapus up(), karena hal itu menghilangkan sepotong kecil putih antara hijau dan biru dan membuat lingkaran bagian dalam terlihat lebih baik. Ini lebih memperlambat program.

Sunting: diganti 9*ndengan 2*nuntuk membuat lebih cepat. Saya memutuskan bahwa itu masih akan membuat lingkaran halus.

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)

Catatan:

  1. Pernak-pernik menggunakan Python 3, jadi input harus dilemparkan ke int.
  2. Pernak-pernik menjadi sangat lambat untuk ukuran besar njika Anda melepas speed(0), yang saya tambahkan hanya untuk kecepatan.
  3. Kelambatan kode sebagian besar disebabkan oleh parameter ketiga circlepertumbuhan O(n), karena menentukan berapa banyak sisi poligon tertulis untuk menggambar lingkaran.

Cobalah online

Tidak Dicampur: Cobalah secara online

Fakta menyenangkan: Trinket adalah sebuah anagram dari Tkinter, paket GUI Python dan fondasi untuk turtle.

mbomb007
sumber
Juga, jika seseorang telah menginstal Python, dapatkah mereka menjalankannya dengan nilai besar nuntuk saya? Jika itu tidak terlihat bagus, saya mungkin perlu meletakkan beberapa sqrtdi sana untuk lebih tepatnya. Saya membulatkan ke seperseribu.
mbomb007
Hanya nilai-nilai besar yang saya khawatirkan. Kanvas pada Trinket memiliki maksimal 400.
mbomb007
@daHugLenny Tidak tahu. Ini mungkin masalah memori, karena 10.000 adalah nilai yang sangat besar.
mbomb007
5

PHP + GD, 529 449 byte

Ini mengambil parameter string kueri ndan menampilkan versi PNG dari logo dengan ukuran yang ditentukan.

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

Tidak Terkumpul:

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

Kodos Johnson
sumber
Sebagian besar konstanta string tidak memerlukan tanda kutip. Gambar warna sejati tidak perlu imagecolorallocate; cukup beri 0xRRGGBB sebagai warna pada fungsi menggambar. Beberapa lagi bermain golf dan turun ke 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");dijalankan dengan -r, mengambil input dari baris perintah dan output ke g.png.
Titus
Maaf golf saya sebelumnya terlalu pendek dua byte: [$kharus [+$k. Tapi yang ini juga bisa digunakan: 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 Terima kasih. Saya menemukan setelah jawaban ini bahwa Anda tidak perlu imagecolorallocate. Saya akan memperbarui jawaban saya dengan kode Anda. Tetapi apakah Anda perlu menampilkan ke nama file? Tidak bisakah Anda meninggalkan nama file imagepngdan hanya output ke stdout?
Kodos Johnson
5

Java, 568 byte

Bukan bahasa terkuat untuk bermain golf, tapi inilah upaya saya yang sungguh-sungguh:

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

Pemakaian:

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

Versi tidak golf - ide dasarnya adalah bekerja dalam sistem koordinat u, v ∈ [−0,5, 0,5] dan menghitung jarak dan sudut setiap piksel dari pusat gambar:

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

}

Implementasi saya menghitung dan menggambar piksel mentah. Dimungkinkan untuk membuat implementasi alternatif yang menggunakan rutinitas grafis tingkat tinggi seperti Graphics2D dan Arc2D untuk melakukan menggambar, terutama dengan anti-aliasing.

Nayuki
sumber
4

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

Fungsi ini fmengambil intargumen tunggal (faktor skala) dan menghasilkan gambar SVG yang diskalakan dengan tepat.

Cobalah online di Ideone.

Contoh output:

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

Tampaknya salah untuk menenangkan penguasa Google kami dalam bahasa pemrograman apa pun kecuali bahasa mereka sendiri.

Mego
sumber
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*

Cobalah online

Menghasilkan gambar dalam format ASCII ppm.
Untuk versi ASCII-art yang lebih baik dilihat di browser, coba kode ini . Ini membantu memvisualisasikan algoritma juga.

Penjelasan:

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
aditsu
sumber
3

JavaScript (ES6) (+ SVG), 293 byte, tidak bersaing

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)

Sayangnya, garis bulat bergabung tidak cukup efek yang diminta, tetapi cukup dekat.

Neil
sumber
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}

Dengan asumsi prosesor FreeMarker dijalankan dengan nset variabel , mewakili input.

Penjelasan angka ajaib:

Semuanya didasarkan pada pembungkus 10x10px, kemudian diskalakan oleh n/10.

  • Jarak ke kanan kotak horizontal biru [px]: 5 - sqrt (5 ^ 2 - 1 ^ 2) = 0,10102051443 ( Pythagoras )
  • Rotasi arc biru [deg]: 45 - arcsin (1/5) = 33,4630409671 ( Sine )

JSFiddle tidak digolfkan

Cedric Reichenbach
sumber
Masukkan Bagian CSS dalam elemen gaya dan gunakan Javascript atau PHP. ganti transform:scale(n)dengan transform:scale(<?=$_GET[n])?>(PHP). Dalam javascript, Anda dapat menambahkan Bagian CSS ke elemen style
Jörg Hülsermann
Saya berpikir tentang JS tetapi tidak ingin merusak kode terlalu banyak. Namun, bahasa templating tampak ok, jadi saya menggunakan FreeMarker dan dengan cepat menyesuaikan jawaban saya, terima kasih.
Cedric Reichenbach
Bilah biru terlalu jauh ke kanan di sisi kanannya
RobAu
Tidak, Anda dapat dengan mudah menghitungnya dengan membayangkan segitiga siku-siku dengan panjang sisi 0,5, 0,1 dan x, di mana x menunjukkan lebar bilah biru, atau sesuai dengan itu 0,5-x jaraknya ke kanan. x kemudian dapat ditentukan dengan menggunakan teorema Pythagoras (lihat penjelasan yang saya tambahkan).
Cedric Reichenbach
JSFiddle tidak ditampilkan dengan benar di dua browser yang saya coba (Win10 x64) - dengan Chrome 54.0.2840.59 m (64-bit) bilah biru memanjang terlalu jauh ke kanan, dan dengan Firefox 49.0.1 (32) -bit) ada sedikit celah di tengah-tengah bagian melengkung biru
alldayremix
3

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

Penjelasan

  • "P3" == plaintext portable pixmap
  • show == menghasilkan desimal ASCII karena takut akan korupsi UTF-8 untuk "\ xFF \ xFF \ xFF"
  • unlines == memisahkan desimal menjadi garis
  • m = n-1 untuk simetri dalam n == panjang [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) ² == di luarInnerCircle
  • mxy> 0 == x + y <m == inUpperLeft
  • xy> 0 == x> y == diUpperRight
  • 5y-2m> 0 == y> m2 / 5 == belowGbarTop
  • 3y-5y> 0 == y <m3 / 5 == aboveGbarBot
  • 2x-m> 0 == x> m / 2 == inRightHalf
  • [234,67,53] == merah
  • [251.188,5] == kuning
  • [52,168,83] == hijau
  • [66,13.244] == biru
  • [255.255.255] == putih
Roman Czyborra
sumber
1
Kecuali jika Anda menyandikan semuanya dengan ASCII 7-bit (yang dapat Anda lakukan sejak titik kode tertinggi yang Anda gunakan adalah 0x7C/ 124/ |) dalam hal ini akan menjadi 338 septet Haskell . Tetapi mengingat bagaimana standar 8-bit-ke-byte dalam penyimpanan data dalam beberapa dekade terakhir, saya pikir istilah "byte" cukup spesifik tanpa mengalahkan kuda mati.
Slipp D. Thompson
3

SAS - 590 536 521 byte

Ini menggunakan fasilitas GTL Annotation . Input ditentukan dalam variabel makro di baris pertama. Untuk beberapa byte tambahan, Anda dapat mendefinisikan semuanya sebagai makro. Itu masih menyelinap di bawah Java dan beberapa jawaban HTML, meskipun Anda harus mendefinisikan template grafik nol hanya untuk dapat merencanakan apa saja!

Saya telah meninggalkan garis istirahat untuk sedikit keterbacaan, tetapi saya tidak menghitung mereka terhadap total karena berfungsi tanpa mereka.

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

Sunting: mengurangi beberapa byte lagi melalui penggunaan vars makro, pengaturan default dan pilihan operator.

Sunting 2: singkirkan do-endblok untuk if-then-elselogika dan entah bagaimana masih berfungsi - saya tidak sepenuhnya mengerti bagaimana. Juga, saya menemukan euclidfungsinya!

pengguna3490
sumber
2

SCSS - 415 byte

Mengambil input sebagai $N: 100px;dan <div id="logo"></div>, tidak yakin apakah ini harus dihitung dalam total ...

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

Demo di JSFiddle

Niet the Dark Absol
sumber
1

Haskell dengan paket 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

Contoh penggunaan:

main = writePng "google.png" $ f 1001

Ini mungkin bisa diperbaiki. Idenya adalah untuk melewatkan fungsi ke generateImageyang memilih piksel (warna benar-benar) yang harus pergi pada posisi x, y. Untuk itu kami menggunakan lambda yang menambahkan nsebagai parameter dan mengonversikan semuanya menjadi mengapung pada saat yang sama. The #Fungsi dasarnya memeriksa jika kita berada di ring, bar, atau tidak. Jika itu cincin yang kita berikan tongkat estafet %, jika bar kita hanya mengembalikan biru, jika tidak putih. %memeriksa kuadran mana kita berada dan mengembalikan warna yang sesuai jika bukan biru. Biru adalah kasus khusus karena kita perlu memastikan itu tidak membungkus merah, jadi kita hanya mengembalikan biru jika di ybawah "garis bar" kalau tidak kita kembali putih. Itulah gambaran umum.

pengguna1472751
sumber
0

Processing.py - 244 byte + 1 byte untuk jumlah digit dalam N

Mari kita mulai dengan kodenya. Ini dapat ditempel di lingkungan Pemrosesan dan berlari (berubah Nuntuk ukuran yang berbeda).

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)

Cheat kecil: lingkaran yang memotong bagian dari logo digambar dalam warna abu-abu Pemrosesan 205, yang merupakan warna latar belakang default. Mengekspor ini ke gambar tidak akan terlihat sama. Ini menghemat panggilan ke background(255).

Penjelasan

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

Contohnya

N = 400

N = 400

N = 13 (Ukuran minimum pemrosesan adalah 100x100)

masukkan deskripsi gambar di sini

Catatan

Jika kami mengizinkan kami mengedit secara manual dalam beberapa nilai untuk Npanggilan eksplisit ke setupdan drawtidak diperlukan dan turun ke 213 byte + 3 byte per digit pada 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)
PidgeyDigunakanGust
sumber
Dengan sendirinya, ini bukan program lengkap
Sapi dukun
Cukup adil. Saya menghapus program yang tidak lengkap dan menggantikannya dengan versi lengkap.
PidgeyUsedGust