Google Overlordをなだめる:「G」ロゴを描く


136

正の整数Nを取り込んで、この*構成に従ってGoogleの「G」ロゴのN×Nピクセルの画像を出力するプログラムまたは関数を作成します。

「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いいえ。人々は常識を使用して、1x1またはその他の小さな画像が正確に見えるかどうかを判断できます。
カルビンの趣味

事前に作成したものをダウンロード.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"}[[#]]

色の16進コードをRGBColorオブジェクトに変換して、Googleロゴグラフィックに適用できるようにします。カラーパレットを<input>th色に変更します。

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

対角の角が(0、-1)と(sqrt(24)、1)である塗りつぶされた長方形(2D直方体)を作成します。

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

Annulus内側の半径3と外側の半径5で、原点を中心とする4つの塗りつぶされた1/4を生成します。過去ArcCsc@5(青いセグメントが終了する場所)に描画しないでください。

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

x = -5からx = 5までのサイズN x Nのグラフィックを作成します(パディングを削除します)。

出力

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

あなたは保つことができる0xF485420xFFFFFF整数インチ
Yytsi

どのコンパイラ/リンカーを使用しましたか?mingwのでは動作しません
VSZ

@vszおそらく、Visual Studioのコンパイラ。
クロルタン

@vsz mingwでコンパイルできますgcc g.c -lgdi32
jingyu9575

2
-1>>8動作する可能性があります
マークKコーワン

33

Python 2、244 220バイト

[-1,1] ^ 2平面でのMartin Rosenauの変換と、取り外し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

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

1
@TuukkaX します。
mbomb007

サンプル出力を含めることはできますか?
チョイス

@TuukkaXが1for追加された@Cyoceサンプル出力に感謝
Karl Napf

の形式であるコード内のすべての小数は、次の0.xように減らすことができます.x:)
Yytsi

27

JavaScript(ES6)、408 ... 321 317バイト

384383 371 367 359 327 316 308 304バイトのJavaScript + 24 13バイトのキャンバス要素

(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バイト節約されます。
Conor O'BrienのおかげでHTMLで11バイト節約されました。Prinzhornのおかげでブロック
を使用して12バイト節約されwithました。
をより有効に使用して4バイトを節約しましたz=q-y/2
使用して保存された8バイトparentNodebackgroundアレクシスタイラーに感謝。
青いアーク/バーのより正確な描画を使用することで32バイトが節約されたため、その一部を消去する必要がなくなりました。
Tejas Kaleのおかげで、parentNodeの代わりにcanvas cssを設定することで11バイトが節約されました。
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
backgroundColorをbackgroundに置き換えると、さらに5文字を失う可能性があります。
アレクシスタイラー

1
また、d.parentElementの代わりにd.parentNodeを使用します
アレクシスタイラー

1
parentNodeディメンションを設定しているのはなぜですか。ただ、d.styleあまりにも動作します。許可(f = d.style).width = f.height = n = prompt() + 'px';
Tejas Kale

1
2バイト.785398Math.PI/4削る代わりに使用することができ ます(精度が低い場合はそれ以上になります
。– 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 units = 1ピクセルを使用するためn、center で半径単位の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バイトのbeat打を受けました。
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 Win10 x64の32ビット)
-alldayremix

1
@alldayremix hmmm、Firefoxのimage-rendering: -moz-crisp-edges代わりにが必要なようですpixelated。その効果にメモを追加します。グラデーションスタイルがとても気に入っています!:)
ドムヘイスティングス

HTMLとJavaScriptの両方を使用しているため、ヘッダーを「HTML / JS」に変更しました。
メゴ

20

ImagemagickによるBash(ただし実際には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

削除するスケーリングを2倍にし、setlinewidth1つのスケールファクターをに置き換えdup、スペースをA変数にマージしました(「変数」として解析されるCため、使用できません)。$C45C45

これらの編集を提案してくれた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
縮尺線から1つの文字を削ることでこれを短くする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])

食べない

[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(-MImagerフラグの場合は+7 )= 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')

CPANからインストールする必要があるモジュールImagerが必要です。コマンドライン引数として1つの整数を取ります。画像はアンチエイリアス処理されていないため、少しbitいです。

以下のコードをファイルg.plにコピーします。-MImagerフラグにはさらに+7バイトが必要ですが、必要がないので数バイト節約できます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' );

この投稿には、以前は出力画像のような形のコードがありました。それはコードゴルフのルールに反するので、削除しなければなりませんでした。ご覧になりたい場合は、改訂履歴をご覧ください。私が使用アクメを::点眼私はアスキーアートに変換するプログラム自身で作成した画像から作成された形状で、それを作成します。私は難読化コードは、既に最初に置換することによって見ることができる、golfedたevalprint


非常に素晴らしい!ゴルフについてのほんの少しの詳細:pop代わりに$ARGV[0]$h=($n=pop)/2の代わりに$n=pop;...;$h=$n/2new Imager::Color"#$_"の代わりにImager::Color->new("#$_")。(そして、最後のセミコロンをドロップするのを忘れました)。しかし、もう一度言いますが、これはほんの一部です。コードは本当に素晴らしいです!(私はそれを行うことができなかった!私も知らなかったImager、これは非常に便利です!)
ダダ

@Dadaありがとう。実際、それは非常に単純なコードです。SOでメソッド表記を使用することについて人々を非常に修正しているので、意図的にそうしないのは本当に難しいです。しかし、あなたは正しい。Imagerを自分で使用したのはこれが初めてでした。Perl Weeklyで見たと思う。
シンバク

Imager'ColorPerl 4名前空間区切り文字を使用して@Dadaを使用すると、もう1バイト節約されます。:)
シンバク

確かに、初めてその構文の使用を見ました!また、-MImagerより短いですuse Imager;:)
ダダ

1
Pそしてパット:私は1つとにかくことをやろうとしてた@Dada $n=popnew引数は括弧とセミコロン節約
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 />(ここでは/、しかし、前にスペースが必要になります。)
Arnauld

14

ロゴ、258バイト

... ロゴはLogoを使用して作成する必要があるためです。これは関数として実装されます。Calormen.comのオンラインロゴインタープリターを使用して開発しました

私はもともと各セグメントを描画して塗りつぶそうとしましたが、それは予想よりも大きいことが判明しました。多くの無駄な動きのバックトラックなどがありました。代わりに、見出しに基づいて色を調整し、極座標グラフスイープを行うことにしました。数学の難しい部分は、Gの四角形の上部にある曲線のジオメトリを作成することでした。一部の小数を切り捨てて精度を下げることもできますが、一般的な画面サイズに対応するために、これを約3桁の精度にする必要がありました。

ゴルフ

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)していましたが、実際には角度は必要ありません。それはちょうど間の比較を行うためにシンプルな(そしてかなり短い)だxy我々はどの四半期に見つけること。

編集:ETHproductionsのおかげで1バイト保存されました。

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 ++構文ハイライターは-->、これが<script>htmlファイルのタグ内に配置されている場合、htmlコメントの開始(?)として解釈されるため、混乱を招きます。
アーナルド

信じられないかもしれませんが、Notepad ++は(完全ではありませんが)一種の権利です。ES6互換表の最後の項目を確認してください。
ETHproductions

@ETHproductions-うわー。この構文の背後には正当な理由があると思いますが、それを見ることはできません。これを指摘してくれてありがとう。
アーナルド

ご存知のように、これは行頭でのみ有効だと思います。123 --> commentブラウザコンソール(Firefox 49)でエラーをスローしますが、--> commentそうではありません。
ETHproductions

10

C#、276 + 21 = 297バイト

メソッドの場合は276バイト+ System.Drawingインポートの場合は21バイト。

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

Martin Rosenauのアルゴリズムに基づいています。イメージを構築する方法を考え出すのに苦労してくれてありがとう!

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


あなたはカラーコードIEの透明性を含めないことでバイトを保存することができます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>

変換ではなく線形グラデーションを使用します。編集:@darrylyeoのおかげで140バイトを保存しました。グラデーションの代わりに追加の要素を使用して20バイトを節約しました。@DBSのおかげで24バイト節約されました。@Hediのおかげで16バイト節約されました。背面から前面まで、さまざまなレイヤーがあります。

  • a 青い円
  • b バーの上の部分を隠すための白い長方形
  • c 赤/黄色の左上クォーター
  • d 右上の赤いオクタント
  • e 黄色/緑の左下クォーター
  • f 緑/青の右下クォーター
  • g 内側の白い円
  • h 水平の青いバー

代わりにIDのは、次のような要素名を使用する必要がありabis使用するなど、*代わりのdivCSSセレクタのために。
-darrylyeo

また、backgroundの省略形として使用しbackground-imageます。
-darrylyeo

おかげ@darrylyeo、それは...私のHTMLから引用符を削除することさえ忘れに助けられていない、私のスコアに大きな違いを作っています
ニール・

へえ、問題ない!
darrylyeo

化合物を使用することであちこちで数人のキャラクターを保存できると思いますborder-radius。たとえばc{border-radius:100% 0 0;c{border-top-left-radius:100%;
DBS

8

Rubyの2.3.1、376の 359バイト

RMagick gemを使用します。

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

50x50

50x50

250x250

ここに画像の説明を入力してください

500x500

ここに画像の説明を入力してください

1000x1000

ここに画像の説明を入力してください

ファイルは2つのパラメーターを取ります。1つ目はディメンションで、2つ目は出力を保存するファイル名です。

非ゴルフ

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と比較して非常に複雑になりそうです。RMagickの.ellipse関数はこれを簡単にし、主な仕事はすべての形状/サイズを調整することでした。

これは私の最初のCode Golf提出物(最初のSEの回答でもあります)であり、Rubyの中間的なものだと考えています。改善/ヒントについてご意見がありましたら、お気軽に共有してください!


投稿(404エラー)を編集することはできませんが、ゴルフソリューションから必要な行を削除すると、17バイト削り取られて359バイトになります。
メトロポリス

5

Pythonの2、378の 373バイト

を使用してこれを本当にやりたかったturtle。チャレンジの説明に記載されていない角度と長さを計算して、このためにジオメトリの知識を払わなければなりませんでした。

編集:削除up()、緑と青の間の白の小さなスライバーを削除し、内側の円をより良く見せるため。これにより、プログラムがさらに遅くなります。

編集:に置き換えられ9*n2*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: オンラインで試す

楽しい事実: TrinketTkinter、PythonのGUIパッケージのアナグラムであり、の基盤です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:
13x13

N = 200:
200x200


ほとんどの文字列定数には引用符は必要ありません。トゥルーカラー画像は不要imagecolorallocateです。描画関数に色として0xRRGGBBを与えるだけです。もう少しゴルフを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、329バイトまでになりますg.png
タイタス

申し訳ありませんが、私の前のゴルフは、2バイト短すぎた:[$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"));
    }

}

私の実装では、生のピクセルを計算して描画します。特にアンチエイリアスを使用して、Graphics2DArc2Dなどの高レベルグラフィックルーチンを使用して描画を行う代替実装を作成することができます。


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アートバージョンについては、このコードを試してください。アルゴリズムの視覚化にも役立ちます。

説明:

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ピタゴラス
  • 青い弧の回転[deg]:45-arcSin(1/5)= 33.4630409671Sine

Ungolfed JSFiddle


CSSパーツをスタイル要素に入れ、JavascriptまたはPHPを使用します。置き換えるtransform:scale(n)transform:scale(<?=$_GET[n])?>(PHP)。JavaScriptでは、あなたは、スタイル要素にCSSパーツを追加することができます
イェルクHülsermann

私はJSについて考えましたが、コードをあまり甘くしたくありませんでした。ただし、テンプレート言語は問題ないように思えるので、FreeMarkerを使用して回答をすばやく調整しました。
セドリックライヘンバッハ

青いバーは、右端にあると思いますが、右側にある
RobAu

いいえ、辺の長さが0.5、0.1、xの直角三角形を想像することで簡単に計算できます。ここで、xは青いバーの幅、またはそれに応じて右に0.5-xの距離を表します。その後、ピタゴラスの定理を使用してxを決定できます(追加した説明を参照)。
セドリックライヘンバッハ

JSFiddleは、私が試した2つのブラウザー(Win10 x64)で正しく表示されません。Chrome54.0.2840.59 m(64ビット)では青いバーが右に広がりすぎ、Firefox 49.0.1では(32 -ビット)青い曲線部分の途中にわずかなギャップがあります
-alldayremix

3

Haskellの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 == "\ xFF \ xFF \ xFF"のUTF-8破損を恐れてASCII 10進数を生成します
  • unlines ==小数を行に分けます
  • n == length [0..m]の対称性の場合、m = n-1
  • 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 == belowGbarTop
  • 3y-5y> 0 == y <m3 / 5 == aboveGbarBot
  • 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のセプテット。しかし、過去20年でデータストレージで標準の8ビットからバイトになった方法を考えると、「バイト」という用語は死んだ馬を打ち負かすことなく十分具体的だと思います。
スリップD.トンプソン

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

ハスケル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バイト+ Nの桁数用の1バイト

コードから始めましょう。これは、処理環境に貼り付けて実行できます(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)

小さなチート:ロゴから一部を切り取った円は、デフォルトの背景色であるProcessingのグレースケールシェード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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.