「GitHub」アバターを生成する


31

背景/説明

注:@HelkaHombaが指摘しているように、実際のGitHub ID は実際にはランダムではなく、ユーザー名のハッシュに基づいています

デフォルトのGitHubアバターは5x5ピクセルの画像です。色がランダムに選択され、その色を使用してランダムピクセルが片側(右または左、2x5サイズ)で塗りつぶされます。次に、その側がコピーされ、y軸を横切って反対側に反転されます。塗りつぶされていない残りのピクセルは、#F0F0F0、またはrgb(240,240,240)です。

中央の列のピクセル(1x5サイズ)は、以前と同じ色を使用してランダムに塗りつぶされます。

出力

注:このチャレンジでは、GitHubアバターを囲むスペースを無視します

プログラムは5x5ピクセルの画像ファイルを出力する必要があります。詳細については、http://meta.codegolf.stackexchange.com/a/9095/42499を参照してください

注:これらは明らかに5x5から拡大されているので、それらを見ることができます

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

がんばろう!


@trichoplax出力は5x5ピクセルの画像です、ありがとう。また、5x5ピクセルの周囲のスペース(GitHubアバターの例に示されている)を除外する必要があることに注意してください。
-MCMastery

5
いくつかの小さなサンプル画像をお勧めします。これらは必要以上のスペースを必要とします。また、これらの技術用語は「識別子」であり、実際にはランダムではなく、ユーザー名のハッシュに基づいています(ただし、チャレンジのためにランダムにすることは問題ありません)。
カルビンの趣味

@HelkaHombaありがとう、もっと良い例を追加しました。
MCMastery

1
「ランダムピクセル」とは、同じサイズの他のすべてのピクセルとは関係なく、各ピクセルが0.5の確率で色付きまたは空白であることを意味します。「ランダムな色」とは、各RGBコンポーネントが[0、255]で独立して均一であることを意味します。正しい?
ルイスメンドー

1
実際の画像を出力しないので有効な答えだとは感じませんでしたが、ANSIコードを使用してコマンドラインバージョンを作成しました:gist.github.com/anonymous/3c879c5b01983a07fb7da7a25d778f1b
ドムヘイスティングス

回答:



10

Perl 5、77バイト

256色のパレットしかなく、ANSIエスケープコードをサポートする端末でのみ動作し、実際には5ピクセルの正方形の画像を出力しないため、これは非競合です。ダウン。

sub x{"\e[48;5;@{[rand>.5?$-||=rand 254:254]}m  "}say$}=x,$b=x,x,$b,$}for 0..4

注:\e実際のASCII文字です\x1B

使用法

perl -E 'sub x{"\e[48;5;@{[rand>.5?$-||=rand 254:254]}m  "}say$}=x,$b=x,x,$b,$}for 0..4'

説明

おそらく以下を除いて特に賢いことはありません

  • 使用$-エスケープシーケンスで使用するために自動的にラウンド色番号には、代わりに使用します$n=0|rand 254

出力例

ええ、あなたは-boink-ターミナル全体で、最後の色が何であれ立ち往生するでしょう。


9

MATL36 29バイト

5l$rtP+!kllII$r*O16tQ/XE'a'YG

これにより、結果がfileに保存されますa.png

コードで'a'by 2を置き換えると、ファイルを保存する代わりに画像(拡大)が表示されます。

5l$rtP+!kllII$r*O16tQ/XE2YG

出力例を次に示します。

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

説明

5l$r     % 5×5 matrix of independent random values with uniform distribution
         % on the interval (0,1)
tP+!     % Duplicate, flip vertically, add, transpose. This gives a horizontally
         % symetric matrix. Center column pixels are uniformly distributed on the 
         % interval (0,2). Rest have a triangular distribution on (0,2)
k        % Round down. In either of the above cases, this gives 0 and 1
         % with the same probability
llII$r   % 1×1×3 array of independent random numbers with uniform distribution
         % on (0,1). This is the foreground color.
*        % Multiply the two arrays with broadcast. Gives a 5×5×3 array. Ones in the
         % 5×5 array become the random foreground color. Zeros remain as zeros.
O        % Push 0
16tQ/    % 16, duplicate, add 1, divide: gives 16/17, or 240/255
XE       % Replace 0 by 16/17: background color
'a'      % Push file name
YG       % Write image to that file

7

実際、53バイト

3'≡*;╗`┘#8╙r-J┌`MΣ╝5`3"2rJ└"£n3╟;RdX+Σ`nkΣ"P6 5 5 255

オンラインでお試しください!

実際には文字列処理が苦手です。前にも言ったと思います。このプログラムは、次のようにCP437を使用してP6 netpbmイメージを出力します。

P6 5 5 255
εεεεεεå♠ƒεεεεεεå♠ƒå♠ƒεεεå♠ƒå♠ƒεεεεεεεεεεεεεεεεεεεεεå♠ƒεεεεεεå♠ƒå♠ƒå♠ƒå♠ƒå♠ƒ

これは、ImageMagickを使用してPNGに変換できます。

seriously -f prog.srs | convert - out.png

拡大されたPNGバージョン:

サンプル出力

説明:

3'≡*;╗`┘#8╙r-J┌`MΣ╝5`3"2rJ└"£n3╟;RdX+Σ`nkΣ"P6 5 5 255
3'≡*                                                   push "≡≡≡" (char 240, 3 times)
    ;╗                                                 save a copy to reg0
      `┘#8╙r-J┌`M                                      map:
       ┘#                                                cp437 char code, as list ([240])
         8╙r-J                                           random value in range(2**8) that is not 240
              ┌                                          char code
                 Σ╝                                    concatenate, push to reg1
                   5`3"2rJ└"£n3╟;RdX+Σ`n               do this 5 times:
                     3"2rJ└"£n                           do this 3 times:
                       2rJ└                                randomly pick 0 or 1, push the value in that register
                              3╟                         push the top 3 items to a list
                                ;RdX+                    duplicate, reverse, discard first value, append (mirror the list)
                                     Σ                   concatenate
                                       kΣ              push stack as list, concatenate
                                         "P6 5 5 255   prepend header

申し訳ありませんが、「P6 netpbm」は許可された画像形式の指定リストに含まれていないため、おそらくImageMagickコマンドラインの長さを回答に追加する必要があります。:/
ゼロワン

@ZeroOne 許可されている画像形式です - ppm画像です。
メゴ

私は訂正します!申し訳ありませんが、説明をありがとう。画像形式についていくつかの学習を行う必要があるようです。:)
ゼロワン

6

パイソン、167の 164 155 148バイト

ppmとして出力

from random import*
print"P3 5 5 255"
C,P=choice,[[240]*3,[randint(0,255)for _ in"RGB"]]
exec"a,b=C(P),C(P);print' '.join(map(str,a+b+C(P)+b+a));"*5
  • 編集1:range(5)" "*5
  • Edit2:最初にバイトを押し込んだ print
  • Edit3:リストの内包表記mapのみstr(p)が使用されたために置き換えられました
  • Edit4:exec""*5代わりにfor _ in " "*5:

古い文字列ベースのコードに対するいくつかの改善:

from random import*
print "P3 5 5 255"
j,c,a=' '.join,choice,['']*5
P=["240 "*3,j([str(randint(0,255))for _ in"RGB"])]
for _ in a:a=[c(P)]*5;a[1]=a[3]=c(P);a[2]=c(P);print j(a)

改行をヘッダー内のスペースに置き換えることにより、いくつかを節約できます。仕様では、空白が必要です。 netpbm.sourceforge.net/doc/ppm.html
チャックモリス

5

Swift 2.3、593 585バイト

var t = 0,g = UIGraphicsGetCurrentContext(),c = UIColor(hue:CGFloat(drand48()),saturation:1,brightness:1,alpha:1).CGColor
srand48(time(&t))
UIGraphicsBeginImageContext(CGSizeMake(5,5))
for x in 0..<3 {for y in 0..<5 {CGContextSetFillColorWithColor(g,drand48()>0.5 ? c : UIColor.whiteColor().CGColor)
var r = [CGRect(x:x,y:y,width:1,height:1)]
if x<2 {let m = x==0 ? 4 : 3;r.append(CGRect(x:m,y:y,width:1,height:1))}
CGContextFillRects(g,&r,r.count)}}
let i = UIGraphicsGetImageFromCurrentImageContext()
UIImagePNGRepresentation(i)!.writeToURL(NSURL(string:"/a/a.png")!,atomically:true)

更新

Swift 3、551バイト

var t = 0,g = UIGraphicsGetCurrentContext()!,c = UIColor(hue:CGFloat(drand48()),saturation:1,brightness:1,alpha:1).cgColor
srand48(time(&t))
UIGraphicsBeginImageContext(CGSize(width:5,height:5))
for x in 0..<3 {for y in 0..<5 {g.setFillColor(drand48()>0.5 ? c : UIColor.white().cgColor)
var r = [CGRect(x:x,y:y,width:1,height:1)]
if x<2 {let m = x==0 ? 4 : 3;r.append(CGRect(x:m,y:y,width:1,height:1))}
g.fill(&r,count: r.count)}}
let i = UIGraphicsGetImageFromCurrentImageContext()!
try!UIImagePNGRepresentation(i)!.write(to: URL(string:"/a/a.png")!)

私はWWDCにいて、Swift 3でXcode 8ベータ版を入手しました。AppleはCoreGraphicsの呼び出しのいくつかをより「Swifty」にし、バイト数を減らすことができました。

Swift 2コードUngolfed:

var t = 0
srand48(time(&t))

UIGraphicsBeginImageContext(CGSizeMake(5,5))
let context = UIGraphicsGetCurrentContext()
let color = UIColor(hue: CGFloat(drand48()),saturation:1,brightness:1,alpha:1).CGColor

for x in 0..<3 {
    for y in 0..<5 {
        CGContextSetFillColorWithColor(context, drand48() > 0.5 ? color : UIColor.whiteColor().CGColor)
        var rects = [CGRect(x:x,y:y,width:1,height:1)]

        if x < 2 {
            let mirror = x==0 ? 4 : 3
            rects.append(CGRect(x: mirror, y: y, width: 1, height: 1))
        }

        CGContextFillRects(context, &rects, rects.count)
    }
}


let image = UIGraphicsGetImageFromCurrentImageContext()
UIImagePNGRepresentation(image)!.writeToURL(NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory,inDomains:.UserDomainMask).first!.URLByAppendingPathComponent("a.png"), atomically:true)

この回答は、UIKitが利用可能であり、Cocoa Touchフレームワークを使用していることを前提としています。

いくつかの出力画像の例:

1 2 3

私は他のほとんどの答えと競うことができないことを知っていますが、個人的な挑戦としてこれを試してみたいと思いました。この答えには間違いなく改善の余地がありますが、UIKitとCoreGraphicsの画像書き込みメソッド名の長さのために、これを数百バイト未満に抑えるのは難しいと思います。私は、PPM値ではなく実際のPNGファイルを自分で練習することを選択しましたが、PPM形式を使用すれば、より短い回答が間違いなく可能になります。

私はすでに種子に変数を宣言することによって損失として開始srand48してtime。私はこれを選んだarc4random()arc4random_uniform()、最終的にそれらでより多くのバイトを失うからです。drand48ランダムな色を生成するために使用するrngをシードし、ピクセルに色を書き込むタイミングを選択します。

CGSizeCGSizeMakeCGRectCGRectMake

インラインC API関数とそのSwift拡張機能を切り替えて、それぞれの最短のコンストラクターを見つけます。 CGSizeMakeは、よりも短くなりCGSize()CGRect以下よりも短くなりCGRectMake()ます:

CGSizeMake(5,5)
CGSize(width:5,height:5)

CGRect(x:x,y:y,width:1,height:1)
CGRectMake(CGFloat(x),CGFloat(y),1,1)

私が作成しなければならないCGFloatxyするループの性質による。私は2Dループと平等チェックに本当に興奮していませんが、より短い方法を見つけるのに本当に苦労していました。ここには、間違いなく数バイトを削る余地があります。

構造体CGContextFillRectsの配列を使用した呼び出しは、2つの異なる値を使用して2回CGRect呼び出すよりも安価なCGContextFillRectので、配列とポインターを使用して数バイトを節約します。

を呼び出さないことで27バイトも節約できますUIGraphicsEndImageContext()。これは通常、生産コードの「バグ」ですが、このおもちゃのプログラムには必要ありません。

色:

UIColorオブジェクトを作成しているがCGColor、各ピクセルに不透明(OPAQUE)型を書き込む必要があるため、色も扱いが面倒です。ランダムな色を作成するために見つけた最も短いコードは、UIColorコンストラクタを使用して、CGColorそこから取得することUIColorでした。白と同じ。Cocoa Touchの代わりにCocoaフレームワークを使用していた場合、を使用していくつかのバイトを保存できる可能性がありますCGColorGetConstantColor()が、残念ながらその方法はCocoa Touch SDKでは使用できません。

ファイルへの書き込み:

ファイルへの書き込みには、ほぼ100バイトかかります。これを最適化する方法すらわからない。一部のシステムでは、アクセス権に応じて、さらに長いDocumentsディレクトリを使用する必要がある場合があります。

UIImagePNGRepresentation(i)!.writeToURL(NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory,inDomains:.UserDomainMask).first!.URLByAppendingPathComponent("a.png"), atomically:true)

さらなる最適化を確実に受け入れます。

編集1:いくつかの変数宣言を再配置することにより、数バイトを保存しました。


5

Mathematica、105 102 98 94バイト

c=1~RandomReal~3;r@l_:={c,4{4,4,4}/17}~RandomChoice~{l,5};Image[Join[#,r@1,Reverse@#]&@r@2]

Mathematicaグラフィックス

は、転置演算子です。

編集1:Round+ RandomRealを次の文字に置き換えて3バイトを保存しましたRandomInteger

編集2:と置き換えることにより、4バイトを保存しましRandomIntegerRandomChoice

編集3:RandomColorと置換しGrayLevelて4バイトを保存しましたRandomReal


4

MATLAB、102バイト

こんにちは、これは私のMatlabソリューションです:

p=@(x)(imwrite(floor(randi(2,5,2)*[eye(2) ones(2,1)./2 fliplr(eye(2))]),[0.9412*[1 1 1];rand(1,3)],x))

x関数の入力は、出力ファイルの名前です。例えば:

p('output.png')

「output.png」というpng画像を生成します。

ここに、このコードのいくつかの実行の結果があります。

output1.png output2.png output3.png output4.png


3

Dyalog APL、43 42バイト

'P3',5 5 256,∊(3⍴240)(?3⍴256)[⌈(⊢+⌽)?5 5⍴0]

'P3',5 5a,∊(3⍴240)(?3⍴a←256)[⌈(⊢+⌽)?5 5⍴0]

右から左へ:

?5 5⍴00と1の間の乱数の5×5マトリックスを生成します(ただし、0または1は決して使用しません

(⊢+⌽) 行列に反射を追加するトレインです

ceiling、各要素に対して1または2を返します

(3⍴240)(?3⍴256) 色-白っぽい色とランダムな色

[ ] マトリックスの各要素を色のインデックスとして使用します

'P3',5 5 256,∊ ヘッダーを平坦化して追加する


2

PHP、236バイト

私はこれが古い挑戦であることを知っていますが、私は自分自身に挑戦したいです。

$o=imagecreate(5,5);$t=imagecolorallocate;$r=rand;for($c=[$t($o,240,240,240),$t($o,$r(0,255),$r(0,255),$r(0,255))];$y++<5;)for($x=-2,$a=[];$x<3;)imagesetpixel($o,$x+2,$y,isset($a[$v=abs($x++)])?$a[$v]:($a[$v]=$c[$r(0,1)]));imagepng($o);

ゴルフをしていない:

// Store these frequently used functions
$t=imagecolorallocate;
$r=rand;

// Create 5x5 image
$o=imagecreate(5, 5);

// Define array of the possible colors
$c=[$t($o,240,240,240),$t($o,$r(0,255),$r(0,255),$r(0,255))];

// Loop over y axis
for($y=0;$y++<5;) {

    // This stores values for colors used in the current row indexed by the absolute value of x starting from -2
    $a = [];

    // Loop over x axis
    for($x=-2;$x<3;) {

        // Set a pixel of a random color for current coordinate. If it exists in the array, use the array value.
        imagesetpixel($o,$x+2,$y, isset($a[$v=abs($x++)]) ? $a[$v] : ($a[$v]=$c[rand(0,1)]) );
    }     

    // Empty the array
    $a = [];
}

// Output as PNG
imagepng($o);

サンプル出力:

Githubアバター

Githubアバター


2

Javascript ES6、296バイト

注:ファイルを生成せず、キャンバスに描画します。

このJSフィドルで実際の動作をご覧ください。

s=20;W='#fff';M=Math;R=M.random;ctx=document.getElementById('c').getContext('2d');cr=`#${M.floor(R()*16777215).toString(16).slice(0,3)}`;f=Array(5).fill();a=f.map((_,i)=>f.map((_,j)=>R()*2|0));a.map((c,x)=>c.map((v,y)=>{ctx.fillStyle=y>=3?c[y==3?1:0]?cr:W:c[y]?cr:W;ctx.fillRect(y*s,x*s,s,s);}));

サイトへようこそ!:)
DJMcMayhem

数回実行した後、これを 2回生成ました-左上に1つの黒いピクセルがあり、それ以外は何もありません。これがコードまたはフィドルの問題かどうかはわかりません。
FlipTack

正しい-ラン​​ダムな16進数値を生成するコードはバグがありました。回答のリンクを更新しました!
ピエールアップティップ
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.