生成一个“ GitHub”头像


31

背景/说明

注意:正如@HelkaHomba指出的那样,实际的GitHub identicons 实际上并不是随机的,而是基于用户名的哈希值

默认的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
我建议一些较小的样本图像。这些占用了不必要的空间。同样,这些术语的技术术语是“ identicons”,它们实际上不是随机的,而是基于用户名的哈希值(但是让它们随机接受挑战是很好的)。
加尔文的业余爱好

@HelkaHomba谢谢,我添加了更好的示例。
MCMastery

1
我假设“随机像素”表示每个像素以0.5的概率上色或空白,而与其他所有相同大小的像素无关。“随机颜色”表示每个RGB分量在[0,255]上都是独立均匀的。正确?
路易斯·门多

1
我不觉得这是一个有效的答案,因为它没有输出实际的图像,但是我使用ANSI代码制作了一个命令行版本:gist.github.com/anonymous/3c879c5b01983a07fb7da7a25d778f1b
Dom Hastings

Answers:


12

Pyth-27个字节

.wC+Kc3O^Cm,240O256 3 15_PK

显然不能在线使用,但是您可以在此处打印颜色代码。


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

@ZeroOne 这是允许的图像格式 -它是ppm图像。
Mego

我纠正了!抱歉,感谢您的澄清。看来我需要对图像格式进行一些学习。:)
ZeroOne

6

Python中,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
  • EDIT1: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 8beta。Apple将CoreGraphics的一些调用称为“ Swifty”,而且我能够减少字节数。

Swift 2代码解散:

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图像写入方法名称的长度,很难将其降低到几百个字节以下。我选择写一个实际的PNG文件而不是PPM值作为自己的练习,但是如果我使用PPM格式,肯定可以得到更短的答案。

我已经通过具有一个变量声明到种子开始作为损失srand48time。我选择了此选项,arc4random()或者arc4random_uniform()因为最终我会丢失更多字节。我为rng播种drand48以生成随机颜色,并选择何时将颜色写入像素。

CGSizevs CGSizeMakeCGRectvs CGRectMake

我在内联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)

我必须创建CGFloat小号xy因的性质for循环。我真的不为2D循环和是否进行相等性检查而感到兴奋,但我确实在努力寻找更短的方法。这里肯定有剃除几个字节的空间。

主叫CGContextFillRects用的阵列CGRect结构比调用便宜CGContextFillRect具有两个不同的值的两倍,因此我保存与所述阵列和指针几个字节。

我还通过不调用节省了27个字节UIGraphicsEndImageContext()。尽管这通常是生产代码中的“错误”,但对于此玩具程序而言并不必要。

颜色:

颜色也是一个处理难题,因为我正在创建UIColor对象,但需要CGColor为每个像素写一个不透明的类型。我发现创建随机颜色的最短的代码是使用UIColor构造,并获得CGColorUIColor。与白色相同。如果我使用的是Cocoa框架而不是Cocoa Touch,则可以使用来保存一些字节CGColorGetConstantColor(),但是不幸的是,该方法在Cocoa Touch SDK中不可用。

写入文件:

写入文件几乎需要100个字节。我不确定如何进行优化。在某些系统上,根据您的权限,您可能需要使用更长的Documents目录:

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

绝对可以进行进一步的优化。

编辑1:通过重新排列一些变量声明节省了一些字节。


5

数学,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图形

Transpose运算符

编辑1:保存的3个字节通过更换Round+ RandomRealRandomInteger

编辑2:替换RandomInteger为保存了4个字节RandomChoice

编辑3:通过替换保存的4个字节RandomColorGrayLevelRandomReal


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⍴0生成一个5×5的随机数介于0和1之间的矩阵(但不会是0或1

(⊢+⌽) 是一列将矩阵与反射相加的火车

上限,每个元素返回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 Fiddle中实际操作它。

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

运行几次后,它生成两次-左上角有一个黑色像素,除此之外没有其他。不知道这是否是代码或小提琴的问题。
FlipTack

是的-生成随机十六进制值的代码有错误。更新了答案中的链接!
皮耶洛(Pierlo Upitup),
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.