Умиротворите своих Google Overlords: нарисуйте логотип «G»


136

Напишите программу или функцию, которая принимает положительное целое число N и выводит N × N пиксельное изображение логотипа Google «G» в соответствии с этой * конструкцией:

"G" конструкция логотипа

Например, если N равно 400, должен быть выведен логотип 400 × 400 пикселей с правильными размерами и цветами:

Логотип "G" 400x400 пример

Он должен выглядеть точно независимо от того, насколько велико или мало N. например, здесь N = 13:Логотип "G" 13x13 пример

Ваш код не должен подключаться к Интернету. Например, масштабирование размещенного извне svg не допускается. (Масштабирование SVG, закодированного в вашем коде, было бы хорошо, хотя.)

Сглаживание может использоваться или нет. Тебе решать.

Обратите внимание, что горизонтальная полоса буквы «G» не распространяется до правого края изображения. Круг обычно изгибается внутрь по правому краю, прежде чем его отрезать.

Самый короткий код в байтах побеждает.


* Конструкция логотипа была упрощена для этой задачи. Правильную конструкцию можно увидеть здесь и здесь .


1
Есть ли минимум N? Изображение 1x1, скорее всего, даст неузнаваемый результат независимо от того, насколько удачное решение.
jpmc26

@ jpmc26 N - положительное целое число, поэтому минимум 1. Конечно, изображение 1x1 не может быть распознано, но оно должно выглядеть точно, например, черное изображение не имеет смысла даже в таком масштабе.
Увлечения Кэлвина

4
Каков ожидаемый результат для изображения 1x1? Один пиксель какого-либо цвета на изображении? Белое изображение? Как насчет 2x2? В изображении все еще больше цветов, чем пикселей для этого размера. Если какое-либо изображение неприемлемо в этих масштабах, задача должна определить, что является и не является приемлемым, поскольку вы не можете создать изображение, даже приближающееся к правильному виду, не так ли? (Если бы это была моя задача, я бы исключил их, чтобы они были простыми, но ваше решение. Вам также нужно убедиться, что вы не исключаете существующие ответы с новыми спецификациями, я думаю.)
jpmc26

@ jpmc26 Нет. Люди могут руководствоваться здравым смыслом, чтобы определить, выглядит ли точное изображение размером 1х1 или другое маленькое изображение.
Увлечения Кэлвина

Разрешено ли нам загружать готовый продукт .svgи кодировать его в наше решение, или мы должны сделать это изначально?
juniorRubyist

Ответы:


55

Mathematica, 229 226 225 224 221 206 169 байт

Спасибо @MartinEnder за 1 байт, @ChipHurst за 37 байт!

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

Какой интересный вызов!

объяснение

...&~Array~4

Итерация от 1 до 4 ...

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

Преобразуйте цветные шестнадцатеричные коды в RGBColorобъекты, чтобы их можно было применить к графическому логотипу Google. Измените цветовую палитру на <input>цвет.

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

Создайте заполненный прямоугольник (2D-кубоид), диагональные углы которого (0, -1) и (sqrt (24), 1).

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

Создайте четыре заполненных четверти Annulusс центром в начале координат, с внутренним радиусом 3 и внешним радиусом 5. Не ArcCsc@5проходите мимо (там, где заканчивается синий сегмент).

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

Создайте графику размером N x N от x = -5 до x = 5 (удаляет отступы).

Выходы

N = 10

введите описание изображения здесь

N = 100

введите описание изображения здесь

N = 200

введите описание изображения здесь

N = 10000 (нажмите на изображение для полного разрешения)

введите описание изображения здесь


44

C (Windows), 311 байт

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

Принимает «N» в качестве аргумента командной строки и рисует прямо на экране.

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

Вы можете оставить 0xF48542и 0xFFFFFFв целых числах.
Yytsi

Какой компилятор / компоновщик вы использовали? Не работает с mingw
vsz

@vsz Предположительно, компилятор Visual Studio.
Кролтан

@vsz Я могу скомпилировать его gcc g.c -lgdi32на mingw.
jingyu9575

2
-1>>8может также сработать
Марк К Коуэн

33

Python 2, 244 220 байт

используя преобразование Мартина Розенау на плоскости [-1,1] ^ 2 и незначительные игры в гольф, такие как удаление 0.или скобки

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)

Объяснение:

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
 )

Вывод в двоичном формате PPM, использование:

python golf_google.py > google.ppm

Примеры

  • 13

13

  • 50

50

  • 100

100

  • 1337

1337

предыдущее 244-байтовое решение

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 перед устранением if / else:

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

Хм, не уверен, что 1forработает.
Yytsi


Можете ли вы включить пример вывода?
Cyoce

@TuukkaX спасибо за 1forдобавленный пример вывода
@Cyoce

Все десятичные дроби в вашем коде в виде 0.xмогут быть уменьшены до .x:)
Yytsi

27

JavaScript (ES6), 408 ... 321 317 байт

384 383 371 367 359 327 316 308 304 байта JavaScript + 24 13 байтов для элемента canvas

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

1 байт сохраняется путем рисования против часовой стрелки.
Благодаря конору О'Брайену в HTML сохранено 11 байтов.
12 байт, сохраненных с помощью withблока, благодаря Prinzhorn.
4 байта сохранены с лучшим использованием z=q-y/2.
8 байтов сохранено с помощью parentNodeи backgroundблагодаря Alexis Tyler.
32 байта сохранены с использованием более точного рисунка синей дуги / полосы, поэтому мне больше не нужно стирать ее часть.
Благодаря Tejas Kale, 11 байтов были сохранены путем установки холста css вместо его parentNode.
8 байтов сохранены с использованием withи mapс одним оператором, `2d` вместо ('2d'), n/5вместо .2*nинициализации фона в prompt(...).
4 байта сохранены с заменой Math.PI/4на.7854 что кажется достаточно точным благодаря RobAu.


Объяснение:

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

Размеры холста инициируются с помощью пользовательского ввода, а фон задается белым. qинициализируется.

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

Для каждого цвета рисуется круговая часть, с некоторыми корректировками для последней (синей). Полоса отображается для каждого цвета в одном и том же месте с одинаковыми размерами, поэтому видна только последняя (синяя).


2
<canvas id=d></canvas>должно работать, и <canvas id=d>может работать.
Конор О'Брайен,

1
Вы можете потерять еще 5 символов, заменив backgroundColor на background.
Алексис Тайлер

1
Также используйте d.parentNode вместо d.parentElement
Алексис Тайлер

1
Почему вы устанавливаете размеры parentNode. Просто d.styleработает тоже. Что позволяет(f = d.style).width = f.height = n = prompt() + 'px';
Tejas Kale

1
Вы могли бы использовать .785398вместо того, чтобы Math.PI/4сбрить 2 байта (или больше, если меньшая точность в порядке.
RobAu

25

BBC BASIC, 177 байт

Скачать переводчик можно по адресу 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 использует 2 единицы = 1 пиксель, поэтому мы строим G nединиц радиуса (= n / 2 пикселя) в центре n,n.

Идея состоит в том, чтобы построить серию радиальных линий, меняя цвет соответствующим образом. Было обнаружено, что между линиями были небольшие промежутки из-за усечения чисел при преобразовании в пиксели, поэтому вместо этого фактически строятся тонкие треугольники.

После завершения сканирования линий курсор находится в верхнем правом углу синей области. Единственная координата для диагонально противоположного угла дана, чтобы нарисовать прямоугольник, чтобы завершить форму.

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.

Хорошо сделано! Я сделал мой в логотип, используя аналогичный метод, прежде чем я увидел ваш ответ. Вы побили меня примерно на 81 байт.
GuitarPicker

21

HTML / JS, 680 624 байта

Чтобы получить 624 байта, удалите последний ;, это необходимо для фрагмента ниже, так как он импортирует HTML. Кроме того, Firefox, кажется, не поддерживает image-rendering: pixelatedи нуждается -moz-crisp-edgesвместо этого (спасибо @alldayremix !), Что делает решение Firefox +7, но это работает в Chrome, как и ожидалось.

Использует JavaScript для запроса Nи <style>блок для позиционирования / цвета элементов. Использует базовые элементы HTML, а не применяет стили к холсту (который, как представляется, был гораздо более коротким подходом!). Это обновленный подход, использующий data:фоновое изображение URI вместо просто цветных элементов. Я сохранил предыдущий подход ниже на случай, если этот новый работает на меньшем количестве браузеров.

Я думал, что это будет намного меньше, чем в итоге, но, тем не менее, это было интересное упражнение!

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

Предыдущая версия:

<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
Предатель! (шучу, приятно ;-))
Dada

В моем браузере старая версия показывает небольшой разрыв между цветами, а новая версия дает градиентный переход между цветами (32-битный Firefox 49.0.1 на Win10 x64)
alldayremix

1
@alldayremix хммм, похоже, что Firefox должен иметь image-rendering: -moz-crisp-edgesвместо pixelated. Добавлю заметку на этот счет. Мне очень нравится стиль градиента! :)
Дом Гастингс

Я изменил заголовок так, чтобы он читал «HTML / JS», так как вы используете и HTML, и Javascript.
Mego

20

Bash с Imagemagick (но на самом деле Postscript), 268 255 249 байт

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

Удвоил масштабирование, чтобы удалить setlinewidth, заменил один масштабный коэффициент на dup, и объединил пробел в Aпеременную (нельзя с, Cпотому что $C45анализируется как «переменная C45»).

Спасибо joojaa за предложение об этих изменениях!

Старая шкала, 255 байт

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

Принимает N как единственный аргумент и выводит в o.png.

Ungolfed Постскриптум для Old Scale

%!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
Вы можете сделать это короче, сбрив один символ от линии шкалы, 61.2 dup scaleвы также можете добавить пробел в C-стиле C=' setrgbcolor 5 5 4 'и сбрить 4 пробела. Если бы вы разработали это в половинном масштабе, то вы могли бы опустить2 setlinewidth
joojaa

19

MATLAB, 189 184 байта

[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 (+7 для -MImagerфлага) = 457 байт

Благодаря Dada я сэкономил несколько байтов, используя функциональные newвызовы и избавляясь от паренов, а также popвместо $ARGV[0]конечной точки с запятой. Я сохранил еще немного, поместив $n=popего туда , где он впервые используется, и используя нотацию пространства имен Perl 4 с 'вместо ::.

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

Для этого требуется модуль Imager , который необходимо установить из CPAN. Принимает одно целое число в качестве аргумента командной строки. Изображение не сглажено, поэтому оно немного уродливо.

Скопируйте приведенный ниже код в файл g.pl. Нам нужно дополнительно +7 байтов для -MImagerфлага, но это экономит несколько байтов, потому что нам это не нужно use Imager;.

$ perl -MImager g.pl 200

Вот различные размеры:

N = 10

10px

N = 100

100px

N = 200

200px

Абсолютно незатронутый код прост.

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

Этот пост ранее имел код в форме выходного изображения. Поскольку это противоречит правилам игры в гольф, мне пришлось удалить его. Смотрите историю изменений, если вы хотите посмотреть. Я использовал Acme :: EyeDrops, чтобы создать это, с формой, которую я создал из изображения, созданного самой программой, которую я преобразовал в искусство ASCII. Код, который я запутал, уже был в гольфе, что можно увидеть, заменив первый evalна a print.


Очень хорошо! Несколько деталей о гольфе: popвместо $ARGV[0]. $h=($n=pop)/2вместо $n=pop;...;$h=$n/2. new Imager::Color"#$_"вместо Imager::Color->new("#$_"). (и вы забыли сбросить последнюю точку с запятой). Но опять же, это всего лишь мелкие детали, ваш код действительно великолепен! (Я не мог этого сделать! Я даже не знал Imager, что очень удобно!)
Dada

@ Дада спасибо. На самом деле это довольно простой код. Я так корректирую людей в использовании записи метода на SO, что действительно сложно не делать это специально. Но ты прав. Это был первый раз, когда я сам использовал Imager. Я думаю, что видел это в Perl Weekly.
simbabque

@Dada при использовании Imager'Colorс разделителем пространства имен Perl 4 сохраняет еще один байт. :)
simbabque

Действительно, впервые я вижу использование этого синтаксиса! Также -MImagerкороче use Imager;:)
Дада

1
@Dada Я собирался сделать это в любом случае: P И, помещая $n=popв newargs, спасает parens и точку с запятой
simbabque

14

PHP + SVG, 300 байт

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

Масштабирующая часть width=<?=$_GET[w]?>

Выход для значения 333

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


1
Разве вы не можете определить расстояние между двойными кавычками ( ") и следующим атрибутом? Например <svg width="333" viewBox="0 0 10 10">-><svg width="333"viewBox="0 0 10 10">
Божидар Маринов

@ BojidarMarinov Да, это corecct, он экономит несколько байтов. Спасибо
Йорг Хюльсерманн

1
Убрать пробелы между буквами и цифрами в путевых данных: 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
Конечно. Кроме того, для вашего echoутверждения используйте строку в двойных кавычках, чтобы разрешить встроенные переменные и удалите точку с запятой: 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
Я думаю, что большинство двойных кавычек можно безопасно удалить. Как <rect x=5 y=4 fill=#4285f4 width=4.9 height=2 />(Здесь вам понадобится пробел перед тем /, как.)
Арно

14

Логотип, 258 байт

... потому что я считаю, логотипы должны быть сделаны с использованием логотипа . Это реализовано как функция. Я разработал его с помощью онлайн-переводчика Calormen.com.

Первоначально я пытался нарисовать каждый сегмент и закрасить его, но это оказалось больше, чем ожидалось. Было много потраченного впустую движения назад и тому подобное. Вместо этого я решил сделать полярную диаграмму, регулируя цвет в зависимости от заголовка. Более сложная часть математики делала геометрию для кривой в верхней части прямоугольника G. Вы можете обрезать некоторые десятичные дроби и иметь меньшую точность, но я хотел, чтобы это было с точностью до 3 цифр для соответствия типичным размерам экрана.

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

Образец

g 200 Логотип Google, размер 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 байт

Запрашивает ширину логотипа (до 999) и рисует его на холсте, пиксель за пиксель.

Изменить : Первоначальная версия была преобразование декартовых координат (x,y)в полярные координаты (r,a), но нам не нужен угол. Проще (и значительно короче) просто сравнивать xи yвыяснять, в каком квартале мы находимся.

Редактировать : 1 байт благодаря ETHproductions.

JS, 251 224 220 218 217 байт

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 байта

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

Версия ES6: 258 231 227 225 224 + 34 = 258 байт

Рекомендуемая максимальная ширина для фрагмента: 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 и сразу подумал: «Что на земле это <-и -->операторы ??» Я думаю, это то, что происходит, когда вы думали о гипотетических операторах для гипотетического языка в течение 24 часов ...: P
ETHproductions

@ETHproductions Они также сбивают с толку подсветку синтаксиса Notepad ++, которая интерпретируется -->как начало (?) Html-комментария, если он помещен в <script>теги в html-файле.
Арно

Хотите верьте, хотите нет, Notepad ++ вроде как (хотя и не полностью). Посмотрите на последний элемент таблицы сравнения ES6 .
ETHproductions

@ETHproductions - Вау. Я полагаю, что за этим синтаксисом есть веская причина, но я не вижу его. Спасибо за указание на это.
Арно

Просто чтобы вы знали, я верю, что это действительно только в начале строки. 123 --> commentвыдает ошибку в консоли моего браузера (Firefox 49), пока --> commentнет.
ETHproductions

10

C #, 276 + 21 = 297 байт

276 байт для метода + 21 байт для импорта System.Drawing.

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

На основе алгоритма Мартина Розенау. Спасибо за трудную часть придумать способ создать изображение!

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


Вы можете сохранить байты, не включая прозрачность в цветовом коде, т.е.0xFF...
TheLethalCoder

8

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

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

Использует линейные градиенты, а не преобразования. Изменить: Сохранено 140 байтов благодаря @darrylyeo. Сохранено 20 байт с использованием дополнительного элемента вместо градиента. Сохранено 24 байта благодаря @DBS. Сохранено 16 байт благодаря @Hedi. Сзади вперед, различные слои:

  • a Синий круг
  • b Белый прямоугольник, чтобы скрыть часть над планкой
  • c Красная / желтая верхняя левая четверть
  • d Красный октант справа вверху
  • e Желтая / зеленая нижняя левая четверть
  • f Зеленый / синий нижний правый квартал
  • g Внутренний белый круг
  • h Горизонтальная синяя полоса

Вместо идентификаторов, вы должны использовать имена элементов , таких как a, b, i, sи т.д. Используйте *вместо divдля селектора CSS.
Darrylyeo

Кроме того, используйте backgroundкак сокращение для background-image.
Darrylyeo

@darrylyeo Спасибо, это сильно повлияло на мою оценку, но мне не помогло забыть даже удалить цитаты из моего HTML ...
Нил

Хех, нет проблем!
Даррильо

Я считаю, что вы можете сохранить несколько символов здесь и там, используя соединение border-radius. Например, c{border-radius:100% 0 0;вместоc{border-top-left-radius:100%;
DBS

8

Рубин 2.3.1, 376 359 байт

Использование камня 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])

Примеры

50х50

50х50

250x250

введите описание изображения здесь

500x500

введите описание изображения здесь

1000x1000

введите описание изображения здесь

Файл принимает два параметра: первый - размер, а второй - имя файла, в котором сохраняются выходные данные.

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

Сначала я решил эту проблему с помощью oily_png / chunky_png, но это, вероятно, оказалось бы слишком сложным по сравнению с RMagick. Функция RMeick .ellipse сделала это легким делом, и основная работа была вокруг настройки форм / размеров всего.

Это моя первая заявка на Code Golf (также первый ответ на SE), и я считаю себя немного промежуточным с Ruby. Если у вас есть какие-либо предложения по улучшению / советы, пожалуйста, не стесняйтесь поделиться!


Кажется, я не могу отредактировать свой пост (ошибка 404), но если бы я удалил требуемую строку из моего решения для игры в гольф, которое сбрило бы 17 байт и уменьшило бы его до 359 байт.
мегаполис

5

Python 2, 378 373 байта

Я действительно хотел сделать это с помощью turtle. Для этого мне пришлось стереть свои знания геометрии, вычисляя углы и длины, не указанные в описании задачи.

Редактировать: удалено up(), так как при этом удаляется небольшая полоска белого между зеленым и синим и улучшается внешний вид внутреннего круга. Это замедляет программу еще больше.

Изменить: заменено 9*nна, 2*nчтобы сделать быстрее. Я решил, что это все равно создаст гладкий круг.

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)

Примечания:

  1. Брелки используют Python 3, поэтому входные данные должны быть преобразованы в int.
  2. Брелки идут очень медленно для большого, nесли вы удалите speed(0), который я добавил только для скорости.
  3. Медлительность кода в основном объясняется третьим параметром circleроста O(n), поскольку он определяет, сколько сторон имеет вписанный многоугольник для рисования круга.

Попробуйте онлайн

Ungolfed: попробуйте онлайн

Интересный факт: Trinket это анаграмма Tkinter, пакет графического интерфейса Python и основа для turtle.


Кроме того, если у кого-то установлен Python, он может запустить его с большим значением nдля меня? Если это не выглядит хорошо, мне, возможно, придется добавить некоторые sqrts, чтобы быть более точным. Я округлил до тысячных.
mbomb007


Я беспокоюсь только о больших ценностях. Холст на Брелке имеет максимум 400.
mbomb007


@daHugLenny Понятия не имею. Это может быть проблема с памятью, так как 10000 такое большое значение.
mbomb007

5

PHP + GD, 529 449 байт

Он принимает параметр строки запроса nи выводит PNG-версию логотипа указанного размера.

<?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:
13х13

N = 200:
200x200


Большинство строковых констант не нуждается в кавычках. Истинное цветное изображение не нуждается в imagecolorallocate; просто дайте 0xRRGGBB в качестве цвета для функций рисования. Еще немного игры в гольф, и она имеет размер до 329 байт: 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");работает с -rвводом из командной строки и выводит в g.png.
Тит

Извините, мой предыдущий гольф был на два байта слишком коротким: [$kдолжно быть [+$k. Но этот тоже должен работать: 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 байт)
Тит

@ Титус Спасибо. После этого ответа я узнал, что вам не нужно imagecolorallocate. Я обновлю свой ответ вашим кодом. Но нужно ли выводить на имя файла? Разве вы не можете просто пропустить имя файла imagepngи просто вывести его на стандартный вывод?
Кодос Джонсон

5

Java, 568 байт

Не самый сильный язык для игры в гольф, но вот моя серьезная попытка:

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

Использование:

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

Версия без игры в гольф - основная идея состоит в том, чтобы работать в системе координат u, v ∈ [−0,5, 0,5] и вычислять расстояние и угол каждого пикселя от центра изображения:

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

}

Моя реализация вычисляет и рисует необработанные пиксели. Можно создать альтернативную реализацию, которая использует графические процедуры высокого уровня, такие как Graphics2D и Arc2D, для рисования, особенно с помощью сглаживания.


4

Go, 379 байт

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

Функция fпринимает один intаргумент (масштабный коэффициент) и выводит изображение SVG, масштабированное соответствующим образом.

Попробуйте онлайн в Ideone.

Пример вывода:

<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 на любом языке программирования, кроме их собственного.


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*

Попробуйте онлайн

Выводит изображение в формате ASCII ppm.
Для версии ASCII-art, которую лучше смотреть в браузере, попробуйте этот код . Это также помогает визуализировать алгоритм.

Объяснение:

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 байта, неконкурентный

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)

К сожалению, соединение по круглой линии - не совсем требуемый эффект, но оно довольно близко.


3

FreeMarker + HTML / CSS, 46 + 468 = 514 байт

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 выполняется с nнабором переменных , представляющих ввод.

Объяснение магических чисел:

Все основано на обертке 10x10px, затем масштабируется n/10.

  • Расстояние справа от синей горизонтальной рамки [px]: 5 - sqrt (5 ^ 2 - 1 ^ 2) = 0,10102051443 ( Пифагор )
  • Вращение синей дуги [град]: 45 - arcSin (1/5) = 33,4630409671 ( синус )

Ungolfed JSFiddle


Поместите часть CSS в элемент стиля и используйте Javascript или PHP. заменить transform:scale(n)на transform:scale(<?=$_GET[n])?>(PHP). В javascript вы можете добавить часть CSS к элементу стиля
Jörg Hülsermann

Я думал о JS, но не хотел слишком сильно портить код. Тем не менее, языки шаблонов кажутся нормальными, поэтому я решил использовать FreeMarker и быстро скорректировал свой ответ, спасибо.
Седрик Райхенбах

Синяя полоса находится слишком далеко справа на правой стороне
RobAu

Нет, вы можете легко рассчитать его, представив прямоугольный треугольник с длинами сторон 0,5, 0,1 и х, где х обозначает ширину синей полосы или, соответственно, 0,5-х ее расстояние вправо. Затем можно определить x, используя теорему Пифагора (см. пояснения, которые я добавил).
Седрик Райхенбах

JSFiddle не отображается правильно в двух браузерах, которые я пробовал (Win10 x64) - с Chrome 54.0.2840.59 м (64-битная) синяя полоса простирается слишком далеко вправо, а с Firefox 49.0.1 (32 -бит) есть небольшой промежуток в середине синей изогнутой части
alldayremix

3

343 октета Хаскелла

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

объяснение

  • "P3" == текстовое переносимое растровое изображение
  • show == производить десятичные числа ASCII, опасаясь искажения UTF-8 из-за "\ xFF \ xFF \ xFF"
  • unlines == разделить десятичные дроби на строки
  • m = n-1 для симметрии по длине n == [0..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) ² == outsideInnerCircle
  • mxy> 0 == x + y <m == inUpperLeft
  • xy> 0 == x> y == inUpperRight
  • 5y-2m> 0 == y> m2 / 5 == underGbarTop
  • 3y-5y> 0 == y <m3 / 5 == выше GbarBot
  • 2x-m> 0 == x> m / 2 == inRightHalf
  • [234,67,53] == красный
  • [251,188,5] == желтый
  • [52,168,83] == зеленый
  • [66,13,244] == синий
  • [255,255,255] == белый

1
Если вы не закодируете все это с помощью 7-битного ASCII (что вы могли бы сделать, поскольку самая высокая кодовая точка символа, которую вы используете - это 0x7C/ 124/ |), в этом случае это будет 338 септетов Haskell . Но, учитывая, как за последние пару десятилетий стали стандартными 8 битов в байтах в хранилище данных , я думаю, что термин «байты» достаточно специфичен, не побеждая мертвую лошадь.
Слипп Д. Томпсон

3

SAS - 590 536 521 байт

Это использует средство аннотации GTL . Входные данные указываются в макропеременной в первой строке. За несколько дополнительных байтов вы можете определить все это как макрос. Он все еще крадется ниже Java и несколько ответов HTML, даже если вы должны определить нулевой шаблон графа, чтобы иметь возможность построить что-либо вообще!

Я оставил разрывы строк для некоторой читабельности, но я не считаю их до общего, поскольку это работает без них.

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

Редактировать: сбрил еще несколько байтов с помощью макроса, настроек по умолчанию и выбора операторов.

Редактировать 2: избавился от do-endблоков для if-then-elseлогики, и это как-то все еще работает - я не совсем понимаю, как. Также я обнаружил euclidфункцию!


2

SCSS - 415 байт

Принимает входные данные как $N: 100px;и <div id="logo"></div>, не уверен, если они должны учитываться в общем объеме, хотя ...

$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


1

Haskell с пакетом JuicyPixels , 306 байтов

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

Пример использования:

main = writePng "google.png" $ f 1001

Возможно, это можно улучшить. Идея состоит в том, чтобы передать функцию, generateImageкоторая выбирает пиксель (действительно цвет), который должен идти в позиции x, y. Для этого мы используем лямбду, которая добавляет nв качестве параметра и преобразует их все в плавающие одновременно. #Функция в основном проверяет , если мы в кольце, бар, или ни. Если это кольцо, которому мы передаем эстафету %, если столбик, который мы просто возвращаем, синий, иначе белый. %проверяет, в каком квадранте мы находимся, и возвращает соответствующий цвет, если он не синий. Синий - особый случай, так как мы должны убедиться, что он не переходит в красный, поэтому мы возвращаем синий только в том случае, если он yнаходится ниже «линии бара», в противном случае мы возвращаем белый. Это общий обзор.


0

Processing.py - 244 байта + 1 байт для количества цифр в N

Давайте начнем с кода. Это можно вставить в среду обработки и запустить (меняется Nдля разных размеров).

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)

Небольшой обман: круг, который вырезает часть из логотипа, нарисован в оттенках серого Обработки 205, который является фоновым цветом по умолчанию. Экспорт этого в изображение не будет выглядеть так же. Это сохраняет вызов background(255).

объяснение

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

Примеры

N = 400

N = 400

N = 13 (минимальный размер обработки - 100x100)

введите описание изображения здесь

Запись

Если мы позволим нам вручную редактировать несколько значений для Nявных вызовов, setupи drawони не нужны, мы получим 213 байтов + 3 байта на цифру 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)

Само по себе это не полная программа
Коровы

Справедливо. Я удалил неполную программу и заменил ее на полную версию.
PidgeyUsedGust
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.