Gere um avatar "GitHub"

31

Antecedentes / Descrição

Nota: como aponta @HelkaHomba, os identificadores reais do GitHub não são realmente aleatórios, mas baseados no hash de um nome de usuário

O avatar padrão do GitHub é uma imagem de 5x5 pixels. Uma cor é escolhida aleatoriamente e, em seguida, pixels aleatórios são preenchidos em um lado (direito ou esquerdo, tamanho 2x5) usando essa cor. Em seguida, esse lado é copiado e virado para o outro lado, através do eixo y. Os pixels restantes que não foram preenchidos são # F0F0F0 ou rgb (240.240.240).

Os pixels da coluna central (tamanho 1x5) são preenchidos aleatoriamente, usando a mesma cor que anteriormente.

Saída

Nota: para este desafio, ignoraremos o espaço que envolve os avatares do GitHub

O programa deve gerar um arquivo de imagem de 5x5 pixel. Consulte http://meta.codegolf.stackexchange.com/a/9095/42499 para obter detalhes específicos

Exemplos

Nota: estes foram obviamente ampliados de 5x5 para que você possa vê-los

insira a descrição da imagem aqui insira a descrição da imagem aqui

Boa sorte!

MCMastery
fonte
@trichoplax A saída é uma imagem de 5x5 pixel, obrigado. Observe também que o espaço ao redor dos pixels de 5x5 (mostrado nos avatares do GitHub de exemplo) deve ser excluído.
MCMastery 5/06/16
5
Eu sugiro algumas imagens de amostra menores. Estes ocupam muito mais espaço do que o necessário. Além disso, o termo técnico para isso é "identicons" e eles não são realmente aleatórios, mas baseados no hash de um nome de usuário (mas tê-los aleatórios para o desafio é bom).
Passatempos de Calvin
@HelkaHomba obrigado, eu adicionei melhores exemplos.
MCMastery 5/06/16
1
Suponho que "pixels aleatórios" significa que cada pixel é colorido ou em branco com probabilidade 0,5, independentemente de todos os outros pixels do mesmo tamanho. E "cor aleatória" significa que cada componente RGB é independentemente uniforme em [0, 255]. Corrigir?
Luis Mendo
1
Não achei que fosse uma resposta válida, pois não gera uma imagem real, mas criei uma versão de linha de comando usando códigos ANSI: gist.github.com/anonymous/3c879c5b01983a07fb7da7a25d778f1b !
Dom Hastings

Respostas:

12

Pitão - 27 bytes

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

Obviamente, não funciona online, mas você pode imprimir códigos de cores aqui .

Maltysen
fonte
10

Perl 5 , 77 bytes

Isso não é competitivo, pois possui apenas uma paleta de 256 cores, funciona apenas em terminais que suportam códigos de escape ANSI e, na verdade, não produz uma imagem quadrada de 5 pixels, mas pensei em publicá-la de qualquer maneira, pois era divertido jogar golfe. baixa.

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

Nota: o caracter \eé realmente ASCII \x1B.

Uso

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

Explicação

Nada particularmente inteligente, exceto talvez:

  • Use $-para arredondar automaticamente o número da cor para uso na sequência de escape, usada em vez de $n=0|rand 254.

Saída de exemplo

Sim, você ficará preso com a última cor, em todo o seu terminal -boink-.

Dom Hastings
fonte
9

MATL , 36 29 bytes

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

Isso salva o resultado no arquivo a.png.

Substituir 'a'por 2no código exibe a imagem (ampliada) em vez de salvar um arquivo:

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

Aqui está um exemplo de saída:

insira a descrição da imagem aqui

Explicação

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
Luis Mendo
fonte
7

Na verdade, 53 bytes

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

Experimente online!

Na verdade, é ruim no processamento de strings. Eu acho que já mencionei isso antes. Este programa gera uma imagem netpbm P6 usando o CP437, como o seguinte:

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

Isso pode ser convertido em PNG usando o ImageMagick:

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

Versão PNG ampliada:

saída de amostra

Explicação:

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
Mego
fonte
Desculpe, mas "P6 netpbm" não está na lista especificada de formatos de imagem permitidos, portanto, você provavelmente deve adicionar o comprimento da linha de comando do ImageMagick à sua resposta. : /
ZeroOne
@ZeroOne É um formato de imagem permitido - é uma ppmimagem.
Mego
Eu estou corrigido! Desculpe por isso e obrigado pelo esclarecimento. Parece que preciso aprender um pouco sobre os formatos de imagem. :)
ZeroOne
6

Python, 167 164 155 148 bytes

Saída em 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)para" "*5
  • Edit2: empurrou um byte no primeiro print
  • Edit3: Substituído a compreensão da lista com mapuma vez que somente str(p)foi usada
  • Edit4: em exec""*5vezfor _ in " "*5:

Algumas melhorias em relação ao código antigo baseado em string:

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)
Karl Napf
fonte
Você pode economizar alguns substituindo as novas linhas por um espaço no cabeçalho. A especificação apenas exige espaço em branco. netpbm.sourceforge.net/doc/ppm.html
Chuck Morris,
5

Swift 2.3, 593 585 bytes

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)

Atualizar

Swift 3, 551 bytes

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

Estou na WWDC e acabei de adquirir o Xcode 8 beta com o Swift 3. A Apple fez algumas das chamadas da CoreGraphics mais "Swifty" e posso reduzir o número de bytes.

Código 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)

Esta resposta assume que o UIKit está disponível e usa a estrutura do Cocoa Touch.

Alguns exemplos de imagens de saída:

1 2 3

Sei que não posso competir com a maioria das outras respostas, mas queria tentar isso como um desafio pessoal. Definitivamente, há espaço para melhorias com esta resposta, mas acho que será difícil obter isso abaixo de algumas centenas de bytes devido ao comprimento dos nomes dos métodos de escrita de imagem UIKit e CoreGraphics. Optei por escrever um arquivo PNG real em vez de valores PPM como um exercício para mim, mas respostas mais curtas definitivamente seriam possíveis se eu usasse o formato PPM.

Já começou como uma perda por ter de declarar uma variável a semente srand48com time. Eu escolhi isso arc4random()ou arc4random_uniform()porque, em última análise, eu perderia mais bytes com esses. Eu proponho o rng a ser usado drand48para gerar uma cor aleatória e escolho quando escrever uma cor em um pixel.

CGSizevs CGSizeMakee CGRectvs CGRectMake:

Alterno entre as funções da API C em linha e suas extensões Swift para encontrar o construtor mais curto para cada uma. CGSizeMakeacaba sendo mais curto que CGSize(), e CGRectacaba sendo mais curto que 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)

Eu teria que criar CGFloats xe ydevido à natureza do loop for. Eu realmente não estou emocionado com o loop 2D e se a igualdade verifica, mas eu estava realmente lutando para encontrar um caminho mais curto. Definitivamente, há espaço para cortar alguns bytes aqui.

Telefonar CGContextFillRectscom uma matriz de CGRectestruturas é mais barato do que telefonar CGContextFillRectduas vezes com dois valores diferentes; portanto, economizo alguns bytes com a matriz e o ponteiro.

Também economizo 27 bytes por não ligar UIGraphicsEndImageContext(). Embora isso normalmente seja um "bug" no código de produção, não é necessário para este programa de brinquedos.

Cores:

As cores também são difíceis de lidar, já que estou criando UIColorobjetos, mas preciso escrever um CGColortipo opaco para cada pixel. O código mais curto que encontrei para criar uma cor aleatória foi usar o UIColorconstrutor e obter o resultado CGColordisso UIColor. Mesmo com branco. Se eu estivesse usando a estrutura do Cocoa em vez do Cocoa Touch, poderia salvar alguns bytes usando CGColorGetConstantColor(), mas infelizmente esse método não está disponível no SDK do Cocoa Touch.

Escrevendo para o arquivo:

A gravação em um arquivo leva quase 100 bytes. Não sei ao certo como otimizar isso. Em alguns sistemas, dependendo de suas permissões, pode ser necessário usar o diretório Documents, que seria ainda mais longo:

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

Definitivamente aberto a novas otimizações.

Editar 1: salvou alguns bytes reorganizando algumas declarações de variáveis.

JAL
fonte
5

Mathematica, 105 102 98 94 bytes

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

Gráficos do Mathematica

é o operador Transpose .

Editar 1: salvou 3 bytes substituindo Round+ RandomRealporRandomInteger

Editar 2: salvou 4 bytes substituindo RandomIntegerporRandomChoice

Editar 3: salvou 4 bytes substituindo RandomColore GrayLevelporRandomReal

shrx
fonte
4

MATLAB, 102 bytes

Olá, esta é a minha solução 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))

A entrada xda função é o nome do arquivo de saída. Por exemplo:

p('output.png')

produz uma imagem png chamada 'output.png'.

Aqui estão os resultados de algumas execuções deste código.

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

PieCot
fonte
3

Dyalog APL, 43 42 bytes

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

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

Direita para esquerda:

?5 5⍴0gera uma matriz 5 × 5 de números aleatórios entre 0 e 1 ( mas nunca 0 ou 1 )

(⊢+⌽) é um trem que adiciona a matriz com seu reflexo

teto, retorna 1 ou 2 para cada elemento

(3⍴240)(?3⍴256) cores - branco-ish e um aleatório

[ ] use cada elemento da matriz como um índice em cores

'P3',5 5 256,∊ achatar e adicionar cabeçalho

ngn
fonte
2

PHP, 236 bytes

Sei que esse é um desafio antigo, mas gosto de me desafiar.

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

Ungolfed:

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

Saída de amostra:

Avatar do Github

Avatar do Github

Kodos Johnson
fonte
2

Javascript ES6, 296 bytes

Nota: não produz um arquivo, desenha em uma tela.

Veja em ação neste 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);}));
Pierlo Upitup
fonte
Bem vindo ao site! :)
DJMcMayhem
Depois de executá-lo algumas vezes, ele gerou isso duas vezes - um único pixel preto no canto superior esquerdo e nada mais. Não tenho certeza se isso é um problema com o código ou o violino.
FlipTack
Certo - o código para gerar o valor hexadecimal aleatório era de buggy. Atualizado o link na resposta!
Pierlo Upitup