Generar un avatar "GitHub"

31

Antecedentes / Descripción

Nota: como señala @HelkaHomba, las identificaciones reales de GitHub no son realmente aleatorias sino que se basan en el hash de un nombre de usuario

El avatar predeterminado de GitHub es una imagen de 5x5 píxeles. Se elige un color al azar y luego se rellenan píxeles aleatorios en un lado (derecho o izquierdo, tamaño 2x5) usando ese color. Luego, ese lado se copia y se voltea hacia el otro lado, a través del eje y. Los píxeles restantes que no se rellenan son # F0F0F0 o rgb (240,240,240).

Los píxeles de la columna central (tamaño 1x5) se rellenan al azar, utilizando el mismo color que antes.

Salida

Nota: para este desafío, ignoraremos el espacio que encierra los avatares de GitHub

El programa debería generar un archivo de imagen de 5x5 píxeles. Ver http://meta.codegolf.stackexchange.com/a/9095/42499 para detalles.

Ejemplos

Nota: estos obviamente fueron ampliados de 5x5 para que pueda verlos

ingrese la descripción de la imagen aquí ingrese la descripción de la imagen aquí

¡Buena suerte!

MCMastery
fuente
@trichoplax El resultado es una imagen de 5x5 píxeles, gracias. También tenga en cuenta que el espacio alrededor de los píxeles 5x5 (que se muestra en el ejemplo de avatares GitHub) debe excluirse.
MCMastery
55
Sugeriría algunas imágenes de muestra más pequeñas. Estos ocupan mucho más espacio del necesario. Además, el término técnico para estos es "identicons" y en realidad no son aleatorios sino que se basan en el hash de un nombre de usuario (pero tenerlos al azar para el desafío está bien).
Aficiones de Calvin
@HelkaHomba gracias, agregué mejores ejemplos.
MCMastery
1
Supongo que "píxeles aleatorios" significa que cada píxel está coloreado o en blanco con 0.5 de probabilidad, independientemente de todos los demás píxeles del mismo tamaño. Y "color aleatorio" significa que cada componente RGB es independientemente uniforme en [0, 255]. ¿Correcto?
Luis Mendo
1
No sentí que fuera una respuesta válida ya que no muestra una imagen real, ¡pero hice una versión de línea de comando usando códigos ANSI: gist.github.com/anonymous/3c879c5b01983a07fb7da7a25d778f1b !
Dom Hastings

Respuestas:

12

Pyth - 27 bytes

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

Obviamente no funciona en línea, pero puede hacer que imprima códigos de color aquí .

Maltysen
fuente
10

Perl 5 , 77 bytes

Esto no es competitivo ya que solo tiene una paleta de 256 colores, solo funciona en terminales que admiten códigos de escape ANSI y en realidad no genera una imagen cuadrada de 5 píxeles, pero pensé que lo publicaría de todos modos, ya que fue divertido jugar al golf abajo.

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

Nota: el \ees en realidad ASCII char \x1B.

Uso

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

Explicación

Nada particularmente inteligente, excepto quizás:

  • Use $-para redondear automáticamente el número de color para usar en la secuencia de escape, usado en lugar de $n=0|rand 254.

Salida de ejemplo

Sí, te quedarás atrapado con el último color, en toda tu terminal -boink-.

Dom Hastings
fuente
9

MATL , 36 29 bytes

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

Esto guarda el resultado en el archivo a.png.

Reemplazar 'a'por 2en el código muestra la imagen (ampliada) en lugar de guardar un archivo:

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

Aquí hay un ejemplo de salida:

ingrese la descripción de la imagen aquí

Explicación

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
fuente
7

En realidad, 53 bytes

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

Pruébalo en línea!

En realidad es malo en el procesamiento de cadenas. Creo que he mencionado eso antes. Este programa genera una imagen P6 netpbm usando CP437, como la siguiente:

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

Esto se puede convertir a PNG usando ImageMagick:

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

Versión PNG ampliada:

salida de muestra

Explicación:

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
fuente
Lo sentimos, pero "P6 netpbm" no está en la lista especificada de formatos de imagen permitidos, por lo que probablemente debería agregar la longitud de la línea de comando ImageMagick a su respuesta. : /
ZeroOne
@ZeroOne Es un formato de imagen permitido : es una ppmimagen.
Mego
Estoy corregido! Lo siento, y gracias por la aclaración. Parece que necesito aprender algo sobre formatos de imagen. :)
ZeroOne
6

Python, 167 164 155 148 bytes

Salida como 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)a" "*5
  • Edit2: empujó un byte al principio print
  • Edit3: se reemplazó la comprensión de la lista con mapya que solo str(p)se usó
  • Edit4: en exec""*5cambiofor _ in " "*5:

Alguna mejora sobre el antiguo código basado en cadenas:

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
fuente
Puede ahorrar algunos reemplazando las nuevas líneas con un espacio en el encabezado. La especificación solo requiere espacios en blanco. 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)

Actualizar

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

Estoy en WWDC y acabo de obtener la versión beta de Xcode 8 con Swift 3. Apple hizo algunas de las llamadas de CoreGraphics más "Swifty", y puedo reducir el bytecount.

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 respuesta asume que UIKit está disponible y usa el marco Cocoa Touch.

Algunos ejemplos de imágenes de salida:

1 2 3

Sé que no puedo competir con la mayoría de las otras respuestas, pero quería intentarlo como un desafío personal. Definitivamente hay margen de mejora con esta respuesta, pero creo que será difícil reducirlo a unos cientos de bytes debido a la longitud de los nombres de los métodos de escritura de imágenes UIKit y CoreGraphics. Opté por escribir un archivo PNG real en lugar de los valores PPM como un ejercicio para mí, pero definitivamente sería posible obtener respuestas más cortas si usara el formato PPM.

Ya comienzan como una pérdida por tener que declarar una variable de semilla srand48con time. Elegí esto arc4random()o arc4random_uniform()porque, en última instancia, perdería más bytes con ellos. Siembro el rng para usarlo drand48para generar un color aleatorio y elegir cuándo escribir un color en un píxel.

CGSizevs CGSizeMakey CGRectvs CGRectMake:

Cambio entre las funciones de la API C en línea y sus extensiones Swift para encontrar el constructor más corto para cada una. CGSizeMaketermina siendo más corto que CGSize(), y CGRecttermina siendo más corto 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)

Tendría que crear CGFloats x, y ydebido a la naturaleza del bucle. Realmente no estoy entusiasmado con el ciclo 2D y si la igualdad se verifica, pero realmente estaba luchando por encontrar un camino más corto. Definitivamente hay espacio para recortar algunos bytes aquí.

Llamar CGContextFillRectscon una matriz de CGRectestructuras es más barato que llamar CGContextFillRectdos veces con dos valores diferentes, por lo que guardo algunos bytes con la matriz y el puntero.

También ahorro 27 bytes al no llamar UIGraphicsEndImageContext(). Si bien esto normalmente sería un "error" en el código de producción, no es necesario para este programa de juguetes.

Colores:

Los colores también son difíciles de manejar, ya que estoy creando UIColorobjetos pero necesito escribir un CGColortipo opaco en cada píxel. El código más corto que encontré para crear un color al azar era utilizar el UIColorconstructor y obtener la CGColorde aquel UIColor. Lo mismo con el blanco. Si estuviera usando Cocoa Framework en lugar de Cocoa Touch, podría guardar algunos bytes usando CGColorGetConstantColor(), pero desafortunadamente ese método no está disponible en el SDK de Cocoa Touch.

Escribiendo en el archivo:

Escribir en un archivo toma casi 100 bytes. No estoy seguro de cómo optimizar esto. En algunos sistemas, dependiendo de sus permisos, es posible que deba usar el directorio Documentos, que sería aún más largo:

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

Definitivamente abierto a nuevas optimizaciones.

Edición 1: guardado algunos bytes al reorganizar algunas declaraciones de variables.

JAL
fuente
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 de Mathematica

es el operador de transposición .

Edición 1: Guardado 3 bytes reemplazando Round+ RandomRealconRandomInteger

Edición 2: guardado 4 bytes reemplazando RandomIntegerconRandomChoice

Edición 3: guardado 4 bytes reemplazando RandomColory GrayLevelconRandomReal

shrx
fuente
4

MATLAB, 102 bytes

Hola, esta es mi solución 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))

La entrada xde la función es el nombre del archivo de salida. Por ejemplo:

p('output.png')

produce una imagen png llamada 'output.png'.

Aquí los resultados de algunas ejecuciones de este código.

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

PieCot
fuente
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]

De derecha a izquierda:

?5 5⍴0genera una matriz de 5 × 5 de números aleatorios entre 0 y 1 ( pero nunca 0 o 1 )

(⊢+⌽) es un tren que agrega la matriz con su reflejo

techo, devuelve 1 o 2 para cada elemento

(3⍴240)(?3⍴256) colores - blanco-ish y uno aleatorio

[ ] usa cada elemento de la matriz como un índice en colores

'P3',5 5 256,∊ aplanar y agregar encabezado

ngn
fuente
2

PHP, 236 bytes

Sé que este es un viejo desafío, pero me gusta desafiarme a mí mismo.

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

Sin golf:

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

Salida de muestra:

Avatar de Github

Avatar de Github

Kodos Johnson
fuente
2

Javascript ES6, 296 bytes

Nota: no produce un archivo, dibuja en un lienzo.

Véalo en acción en este 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
fuente
Bienvenido al sitio! :)
DJMcMayhem
Después de ejecutarlo varias veces, generó esto dos veces: un solo píxel negro en la esquina superior izquierda y nada más. No estoy seguro si esto es un problema con el código o el violín.
FlipTack
Derecha: el código para generar el valor hexadecimal aleatorio tenía errores. Actualizado el enlace en la respuesta!
Pierlo Upitup