Générer un avatar «GitHub»

31

Contexte / Description

Remarque: comme le souligne @HelkaHomba, les identifiants GitHub réels ne sont pas réellement aléatoires mais basés sur le hachage d'un nom d'utilisateur

L'avatar GitHub par défaut est une image 5x5 pixels. Une couleur est choisie au hasard, puis des pixels aléatoires sont remplis d'un côté (droite ou gauche, taille 2x5) en utilisant cette couleur. Ensuite, ce côté est copié et retourné de l'autre côté, à travers l'axe des y. Les pixels restants qui ne sont pas remplis sont # F0F0F0, ou rgb (240,240,240).

Les pixels de la colonne centrale (taille 1x5) sont ensuite remplis au hasard, en utilisant la même couleur que précédemment.

Sortie

Remarque: pour ce défi, nous ignorerons l'espace qui entoure les avatars GitHub

Le programme devrait sortir un fichier image 5x5 pixels. Voir http://meta.codegolf.stackexchange.com/a/9095/42499 pour les détails

Exemples

Remarque: ceux-ci ont été évidemment augmentés de 5x5 pour que vous puissiez les voir

entrez la description de l'image ici entrez la description de l'image ici

Bonne chance!

MCMastery
la source
@trichoplax La sortie est une image 5x5 pixels, merci. Notez également que l'espace autour des pixels 5x5 (illustré dans l'exemple des avatars GitHub) doit être exclu.
MCMastery
5
Je suggère quelques exemples d'images plus petites. Ceux-ci prennent beaucoup plus d'espace que nécessaire. De plus, le terme technique pour ceux-ci est "identicons" et ils ne sont pas réellement aléatoires mais basés sur le hachage d'un nom d'utilisateur (mais les avoir au hasard pour le défi est très bien).
Calvin's Hobbies
@HelkaHomba merci, j'ai ajouté de meilleurs exemples.
MCMastery
1
Je suppose que "pixels aléatoires" signifie que chaque pixel est coloré ou vide avec une probabilité de 0,5, indépendamment de tous les autres pixels de la même taille. Et "couleur aléatoire" signifie que chaque composante RVB est indépendamment uniforme sur [0, 255]. Correct?
Luis Mendo
1
Je ne pensais pas que c'était une réponse valide car elle ne produisait pas d'image réelle, mais j'ai fait une version en ligne de commande en utilisant les codes ANSI: gist.github.com/anonymous/3c879c5b01983a07fb7da7a25d778f1b !
Dom Hastings

Réponses:

12

Pyth - 27 octets

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

Évidemment, cela ne fonctionne pas en ligne, mais vous pouvez le faire imprimer des codes de couleur ici .

Maltysen
la source
10

Perl 5 , 77 octets

Ce n'est pas concurrent car il n'a qu'une palette de 256 couleurs, ne fonctionne que sur les terminaux qui prennent en charge les codes d'échappement ANSI et ne produit pas réellement une image carrée de 5 pixels, mais j'ai pensé que je le publierais quand même car c'était amusant de jouer au golf vers le bas.

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

Note: l' \eest en fait char ASCII \x1B.

Usage

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

Explication

Rien de particulièrement intelligent sauf peut-être:

  • Utilisez $-pour arrondir automatiquement le numéro de couleur à utiliser dans la séquence d'échappement, utilisé à la place de $n=0|rand 254.

Exemple de sortie

Oui, vous serez coincé avec quelle que soit la dernière couleur, partout dans votre terminal -boink-.

Dom Hastings
la source
9

MATL , 36 29 octets

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

Cela enregistre le résultat dans un fichier a.png.

Le remplacement 'a'par 2dans le code affiche l'image (agrandie) au lieu d'enregistrer un fichier:

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

Voici un exemple de sortie:

entrez la description de l'image ici

Explication

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
la source
7

En fait, 53 octets

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

Essayez-le en ligne!

Est en fait mauvais pour le traitement des chaînes. Je pense que je l'ai déjà mentionné. Ce programme génère une image netpbm P6 en utilisant CP437, comme suit:

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

Cela peut être converti en PNG à l'aide d'ImageMagick:

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

Version PNG agrandie:

exemple de sortie

Explication:

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
la source
Désolé, mais "P6 netpbm" n'est pas dans la liste spécifiée des formats d'image autorisés, vous devez donc probablement ajouter la longueur de la ligne de commande ImageMagick à votre réponse. : /
ZeroOne
@ZeroOne C'est un format d'image autorisé - c'est une ppmimage.
Mego
Je me suis trompé! Désolé pour cela, et merci pour la clarification. On dirait que je dois faire un peu d'apprentissage sur les formats d'image. :)
ZeroOne
6

Python, 167 164 155 148 octets

Sortie en 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: poussé un octet au premier print
  • Edit3: Compréhension de la liste remplacée par mappuisque seul a str(p)été utilisé
  • Edit4: à la exec""*5placefor _ in " "*5:

Quelques améliorations par rapport à l'ancien code basé sur des chaînes:

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
la source
Vous pouvez en enregistrer quelques-uns en remplaçant les sauts de ligne par un espace dans l'en-tête. La spécification appelle simplement un espace. netpbm.sourceforge.net/doc/ppm.html
Chuck Morris
5

Swift 2.3, 593 585 octets

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)

Mise à jour

Swift 3, 551 octets

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

Je suis à la WWDC et je viens de recevoir la version bêta de Xcode 8 avec Swift 3. Apple a fait certains des appels CoreGraphics plus "Swifty", et je suis en mesure de réduire le bytecount.

Code Swift 2 non golfé:

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)

Cette réponse suppose qu'UIKit est disponible et utilise le framework Cocoa Touch.

Quelques exemples d'images de sortie:

1 2 3

Je sais que je ne peux pas rivaliser avec la plupart des autres réponses, mais je voulais donner un coup de pouce à ce défi personnel. Il y a certainement matière à amélioration avec cette réponse, mais je pense qu'il sera difficile de descendre en dessous de quelques centaines d'octets en raison de la longueur des noms de méthode d'écriture d'image UIKit et CoreGraphics. J'ai choisi d'écrire un fichier PNG réel plutôt que des valeurs PPM comme exercice pour moi-même, mais des réponses plus courtes seraient certainement possibles si j'utilisais le format PPM.

Je commence déjà comme une perte en ayant à déclarer une variable à amorcer srand48avec time. J'ai choisi ça arc4random()ouarc4random_uniform() parce que finalement je perdrais plus d' octets avec ceux -ci . J'amorce le rng à utiliserdrand48 pour générer une couleur aléatoire et choisir quand écrire une couleur sur un pixel.

CGSizevs CGSizeMakeetCGRect vs CGRectMake:

Je bascule entre les fonctions API C en ligne et leurs extensions Swift pour trouver le constructeur le plus court pour chacune. CGSizeMakefinit par être plus court que CGSize(), et CGRectfinit par être plus court 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)

Il faudrait que je crée CGFloatsx ety raison de la nature de la boucle for. Je ne suis vraiment pas ravi de la boucle 2D et si l'égalité vérifie, mais j'avais vraiment du mal à trouver un moyen plus court. Il y a certainement de la place pour raser quelques octets ici.

Appeler CGContextFillRectsavec un tableau de CGRectstructures est moins cher que d'appelerCGContextFillRect deux fois avec deux valeurs différentes, donc j'économise quelques octets avec le tableau et le pointeur.

J'économise également 27 octets en n'appelant pas UIGraphicsEndImageContext() . Bien que ce soit normalement un "bug" dans le code de production, il n'est pas nécessaire pour ce programme de jouets.

Couleurs:

Les couleurs sont également difficiles à gérer, car je crée des UIColorobjets mais je dois écrire un CGColortype opaque sur chaque pixel. Le code le plus court , j'ai trouvé pour créer une couleur au hasard était d'utiliser le UIColorconstructeur et obtenir le à CGColorpartir de ce UIColor. Idem avec le blanc. Si j'utilisais le framework Cocoa au lieu de Cocoa Touch, je pourrais peut-être enregistrer quelques octets en utilisantCGColorGetConstantColor() , mais malheureusement cette méthode n'est pas disponible dans le SDK Cocoa Touch.

Écrire dans un fichier:

L'écriture dans un fichier prend près de 100 octets. Je ne sais même pas comment procéder pour l'optimiser. Sur certains systèmes, selon vos autorisations, vous devrez peut-être utiliser le répertoire Documents qui serait encore plus long:

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

Certainement ouvert à d'autres optimisations.

Édition 1: enregistré quelques octets en réorganisant certaines déclarations de variables.

JAL
la source
5

Mathematica, 105 102 98 94 octets

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

Mathematica graphiques

est l' opérateur Transpose .

Édition 1: enregistré 3 octets en remplaçant Round+ RandomRealparRandomInteger

Edit 2: 4 octets enregistrés en remplaçant RandomIntegerparRandomChoice

Edit 3: 4 octets enregistrés en remplaçant RandomColoret GrayLevelparRandomReal

shrx
la source
4

MATLAB, 102 octets

Salut, voici ma solution 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))

L'entrée xde la fonction est le nom du fichier de sortie. Par exemple:

p('output.png')

produit une image png appelée 'output.png'.

Voici les résultats de quelques exécutions de ce code.

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

PieCot
la source
3

Dyalog APL, 43 42 octets

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

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

De droite à gauche:

?5 5⍴0 génère une matrice 5 × 5 de nombres aléatoires entre 0 et 1 ( mais jamais 0 ou 1 )

(⊢+⌽) est un train qui ajoute la matrice avec sa réflexion

plafond, renvoie 1 ou 2 pour chaque élément

(3⍴240)(?3⍴256) couleurs - blanc-ish et aléatoire

[ ] utiliser chaque élément de la matrice comme index en couleurs

'P3',5 5 256,∊ aplatir et ajouter un en-tête

ngn
la source
2

PHP, 236 octets

Je sais que c'est un vieux défi mais j'aime juste me mettre au défi.

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

Exemple de sortie:

Avatar Github

Avatar Github

Kodos Johnson
la source
2

Javascript ES6, 296 octets

Remarque: ne produit pas de fichier, dessine sur un canevas.

Voyez-le en action dans ce 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
la source
Bienvenue sur le site! :)
DJMcMayhem
Après l'exécuter plusieurs fois il a généré cette fois - un seul pixel noir en haut à gauche, et rien d' autre. Je ne sais pas s'il s'agit d'un problème avec le code ou le violon.
FlipTack
Droite - le code pour générer la valeur hexadécimale aléatoire était bogué. Mise à jour du lien dans la réponse!
Pierlo Upitup