Порадуйте своїх Google Overlords: намалюйте логотип "G"


136

Напишіть програму або функцію, яка приймає натуральне ціле число N, і виводить N × N піксельних зображень логотипу "G" Google відповідно до цієї * конструкції:

Побудова логотипу "G"

Наприклад, якщо N дорівнює 400, слід вивести логотип 400 × 400 пікселів із правильними розмірами та кольорами:

Приклад логотипу "G" 400x400

Він повинен виглядати точно, незалежно від того, велика чи мала N. наприклад, тут N = 13:Приклад "G" логотип 13х13

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

Може застосовуватися чи ні. Тобі вирішувати.

Зауважте, що горизонтальна смужка "G" не поширюється аж до правого краю зображення. Коло вигинається зазвичай всередину правого краю, перш ніж воно буде відрізане.

Виграє найкоротший код у байтах.


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


1
Чи є мінімум N? Зображення 1x1, ймовірно, призведе до невпізнаваного виводу незалежно від того, наскільки хорошим є рішення.
jpmc26

@ jpmc26 N - це ціле додатне число, тому мінімум 1. Звичайно, зображення 1x1 не можна розпізнати, але значення "Це повинно виглядати точно", наприклад, чорне зображення не мало б сенсу навіть у такому масштабі.
Захоплення Кальвіна

4
Який очікуваний вихід для 1х1 зображення? Один піксель будь-якого з кольорів на зображенні? Біле зображення? А як щодо 2x2? На зображенні все ще більше кольорів, ніж пікселів для цього розміру. Якщо будь-яке зображення є неприйнятним у цих масштабах, виклик повинен визначати, що є, а що неприйнятно, оскільки ви не можете створити зображення, навіть наближаючись до правильного вигляду, чи не так? (Якби це було моїм викликом, я б виключив їх, щоб зробити його простим, але ваше рішення. Вам також потрібно буде перевірити, що ви не виключаєте існуючі відповіді з новими технічними умовами.)
jpmc26

@ jpmc26 Ні. Люди можуть використовувати здоровий глузд, щоб сказати, чи виглядає зображення 1х1 або інше невелике зображення.
Захоплення Кальвіна

Чи дозволяється нам завантажувати заздалегідь зроблений .svgта кодувати його у наше рішення, чи ми мусимо його спочатку зробити?
молодшийрубіст

Відповіді:


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" як аргумент командного рядка і малює безпосередньо на екрані.

Без гольфу:

#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

Невикористана бета-версія до ліквідації, якщо / ще:

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


Чи можете ви включити вибірки?
Кіос

@TuukkaX спасибі за 1forдоданий зразок @Cyoce
Karl Napf

Усі десяткові знаки у вашому коді, що мають форму, 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 байт збережено, намалювавши проти годинникової стрілки.
11 байтів, збережених на HTML, завдяки Conor O'Brien.
12 байт збережено за допомогою withблоку завдяки Prinzhorn.
4 байти, збережені при кращому використанні z=q-y/2.
8 байтів збережено за допомогою parentNodeта backgroundзавдяки Алексісу Тайлеру.
32 байти збережено за допомогою більш точного малюнка синьої дуги / смуги, тому частину її мені більше не потрібно стирати.
11 байт збережено, встановивши canvas css замість його батьківського вузла завдяки Техасу Кале.
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>може працювати.
Conor O'Brien

1
Ви можете втратити ще 5 символів, замінивши backgroundColor фоном.
Алексіс Тайлер

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

1
Чому ви встановлюєте параметри parentNode. Просто d.styleтеж працює. Що дозволяє(f = d.style).width = f.height = n = prompt() + 'px';
Техас Кале

1
Ви можете використовувати .785398замість того, щоб Math.PI/4
відбривати

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 піксель, тому nв центрі ми побудуємо G одиниць радіусу (= n / 2 пікселя) n,n.

Ідея полягає в тому, щоб накреслити ряд радіальних ліній, змінивши колір у відповідних випадках. Було встановлено, що між рядками були невеликі проміжки внаслідок урізання чисел при перетворенні в пікселі, тому натомість намічаються тонкі трикутники.

Після завершення розгортання ліній курсор знаходиться у правому верхньому куті синьої області. Наведено одну координату діагонально протилежного кута, щоб намалювати прямокутник, щоб завершити форму.

Безумовно

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
Зрадник! (просто жартую, приємний ;-))
Дада

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

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

Я змінив заголовок на "HTML / JS", оскільки ви використовуєте і HTML, і Javascript.
Мего

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.

Необурений Постскрипт для старої шкали

%!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
півмашині,

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

неозорий

[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

10 пікс

N = 100

100 пікс

N = 200

200 пікс

Код, який повністю не використовується, є прямолінійним.

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на а print.


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

@Dada спасибі Насправді це досить прямий код. Я так правильно виправляю людей щодо використання позначення методу на ТА, що навмисно це важко не робити. Але ти маєш рацію. Це був перший раз, коли я сам користувався Imager. Думаю, я бачив це в тижневику Perl.
simbabque

@Dada за Imager'Colorдопомогою роздільника простору імен Perl 4 зберігає ще один байт. :)
simbabque

Справді, вперше я бачу використання цього синтаксису! Також -MImagerкоротше use Imager;:)
Дада

1
@Dada Я збирався зробити це все одно: P І введення $n=popв newаргу зберігає парен і крапку з комою
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. Ви можете обрізати кілька десяткових знаків і мати меншу точність, але я хотів, щоб це було точно до трьох цифр, щоб відповідати типовим розмірам екрана.

Гольф

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, розмір 200 пікселів

Безумовно

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-файлі.
Арнольд

Вірите чи ні, Блокнот ++ є свого роду правильним (хоча і не повністю). Ознайомтеся з самим останнім елементом таблиці супутників 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 ...
Ніл

Хе, немає проблем!
darrylyeo

Я вважаю, що ви могли зберегти кілька символів тут і там, використовуючи склад 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

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

500х500

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

1000х1000

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

Файл має два параметри - перший - розмір, а другий - ім'я файлу, щоб зберегти вихід.

Безумовно

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. Функція .ellipse RMagick зробила це легким вітром, і основна робота полягала в налаштуванні форм / розмірів всього.

Це моє перше подання Code Golf (перша відповідь також SE), і я вважаю себе дещо проміжною з Рубі. Якщо у вас є внески щодо покращення / підказок, будь ласка, поділіться!


Я не можу редагувати свій пост (помилка 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пакету GUI Python та основа для нього turtle.


Крім того, якщо хтось встановив Python, чи може він запустити його з великим значенням nдля мене? Якщо це не виглядає приємно, мені, можливо, доведеться покласти там щось sqrt, щоб бути точнішим. Я округлився до тисячних.
mbomb007


Мене хвилюють лише великі цінності. Полотно на Trinket має максимум 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);

Безголовки:

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


Більшість констант рядка не потребує лапок. Справжнє кольорове зображення не потребує 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 байт)
Тіт

@Titus Спасибі Я дізнався після цієї відповіді, що вам не потрібно imagecolorallocate. Я оновлю свою відповідь вашим кодом. Але чи потрібно виводити ім’я файлу? Ви не можете просто залишити ім'я файлу imagepngі просто вивести його на stdout?
Кодос Джонсон

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

Ідіть, 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-мистецтва, яку приємніше дивитись у браузері, спробуйте цей код . Це також допомагає візуалізувати алгоритм.

Пояснення:

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 до стилю Element
Jörg Hülsermann

Я думав про JS, але не хотів надто псувати код. Однак мови шаблонів здаються нормальними, тому я пішов із FreeMarker і швидко скоригував свою відповідь, дякую.
Седрік Райхенбах

Синя смуга занадто далеко праворуч, на її думку,
RobAu

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

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

3

343 октетів 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"
};

Пояснення

  • "P3" == переносна піксема простого тексту
  • show == виробляти десяткові символи ASCII, побоюючись пошкодження UTF-8 за "\ xFF \ xFF \ xFF"
  • unlines == окремі десяткові знаки в рядки
  • m = n-1 для симетрії довжиною n == [0..м]
  • м²- (2х-м) ²- (2й-м) ²> 0 == (хм / 2) ² + (ум / 2) ² <(м / 2) ² == всередині зовнішнього кола
  • (10x-5m) ² + (10y-5m) ²- (3m) ²> 0 == (xm / 2) ² + (ym / 2) ²> (m3 / 10) ² == зовніInnerCircle
  • mxy> 0 == x + y <m == inUpperLeft
  • xy> 0 == x> y == inUpperRight
  • 5y-2m> 0 == y> m2 / 5 == нижчеGbarTop
  • 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 Annotation . Введення вказано в макро змінній у першому рядку. Для кількох зайвих байтів ви можете визначити все як макрос. Він все-таки прокрадається внизу 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;

Редагувати: відголив ще кілька байтів за допомогою макро vars, налаштувань за замовчуванням та вибору операторів.

Edit 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

Почнемо з коду. Це можна вставити в середовище Processing і запустити (змінюючи 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.