Generiere einen "GitHub" Avatar

31

Hintergrund / Beschreibung

Hinweis: Wie @HelkaHomba hervorhebt, sind die tatsächlichen GitHub-Identicons nicht zufällig, sondern basieren auf dem Hash eines Benutzernamens

Der Standard-GitHub-Avatar ist ein 5 x 5 Pixel großes Bild. Eine Farbe wird zufällig ausgewählt und dann werden zufällige Pixel auf einer Seite (rechts oder links, Größe 2x5) mit dieser Farbe ausgefüllt. Dann wird diese Seite kopiert und quer zur y-Achse auf die andere Seite gedreht. Die verbleibenden Pixel, die nicht ausgefüllt werden, sind # F0F0F0 oder rgb (240, 240, 240).

Die Pixel der mittleren Spalte (Größe 1x5) werden dann zufällig mit derselben Farbe wie zuvor ausgefüllt.

Ausgabe

Hinweis: Bei dieser Herausforderung ignorieren wir den Platz, der die GitHub-Avatare einschließt

Das Programm sollte eine 5x5 Pixel große Bilddatei ausgeben. Siehe http://meta.codegolf.stackexchange.com/a/9095/42499 für Einzelheiten

Beispiele

Hinweis: Diese wurden offensichtlich von 5 x 5 vergrößert, damit Sie sie sehen können

Bildbeschreibung hier eingeben Bildbeschreibung hier eingeben

Viel Glück!

MCMastery
quelle
@trichoplax Die Ausgabe ist ein 5x5 Pixel Bild, danke. Beachten Sie auch, dass der Abstand um die 5x5 Pixel (in den Beispiel-GitHub-Avataren gezeigt) ausgeschlossen werden sollte.
MCMastery
5
Ich würde ein paar kleinere Beispielbilder vorschlagen. Diese beanspruchen viel mehr Platz als nötig. Auch der Fachbegriff für diese ist "Identicons" und sie sind nicht zufällig, sondern basieren auf dem Hash eines Benutzernamens (aber es ist in Ordnung, sie zufällig für die Herausforderung zu haben).
Calvins Hobbys
@HelkaHomba danke, ich habe bessere Beispiele hinzugefügt.
MCMastery
1
Ich gehe davon aus, dass "zufällige Pixel" bedeuten, dass jedes Pixel mit einer Wahrscheinlichkeit von 0,5 farbig oder leer ist, unabhängig von allen anderen Pixeln derselben Größe. Und "zufällige Farbe" bedeutet, dass jede RGB-Komponente auf [0, 255] unabhängig gleich ist. Richtig?
Luis Mendo
1
Ich habe nicht das Gefühl, dass es eine gültige Antwort ist, da es kein tatsächliches Bild ausgibt, aber ich habe eine Befehlszeilenversion mit ANSI-Codes erstellt: gist.github.com/anonymous/3c879c5b01983a07fb7da7a25d778f1b !
Dom Hastings

Antworten:

12

Pyth - 27 Bytes

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

Funktioniert natürlich nicht online, aber Sie können hier Farbcodes drucken lassen .

Maltysen
quelle
10

Perl 5 , 77 Bytes

Dies ist nicht konkurrierend, da es nur eine 256-Farben-Palette hat, nur auf Terminals funktioniert, die ANSI-Escape-Codes unterstützen und kein quadratisches 5-Pixel-Bild ausgeben Nieder.

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

Hinweis: Das \eist eigentlich ASCII-Zeichen \x1B.

Verwendung

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

Erläuterung

Nichts besonders Schlaues außer vielleicht:

  • Verwenden Sie $-diese Option, um die Farbnummer für die Verwendung in der Escape-Sequenz automatisch zu runden $n=0|rand 254.

Beispielausgabe

Ja, du wirst mit der letzten Farbe auf deinem -boink- Terminal stecken bleiben.

Dom Hastings
quelle
9

MATL , 36 29 Bytes

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

Dadurch wird das Ergebnis in einer Datei gespeichert a.png.

Durch Ersetzen 'a'durch 2im Code wird das Bild angezeigt (vergrößert), anstatt eine Datei zu speichern:

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

Hier ist eine Beispielausgabe:

Bildbeschreibung hier eingeben

Erläuterung

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

Eigentlich 53 Bytes

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

Probieren Sie es online!

Ist eigentlich schlecht bei der Stringverarbeitung. Ich glaube, das habe ich schon mal erwähnt. Dieses Programm gibt mit CP437 ein P6-Netpbm-Image wie folgt aus:

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

Dies kann mit ImageMagick in ein PNG konvertiert werden:

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

Skalierte PNG-Version:

Beispielausgabe

Erläuterung:

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
quelle
Tut mir leid, aber "P6 netpbm" ist nicht in der angegebenen Liste der zulässigen Bildformate enthalten. Daher sollten Sie Ihrer Antwort wahrscheinlich die Länge der ImageMagick-Befehlszeile hinzufügen. : /
ZeroOne
@ZeroOne Es ist ein zulässiges Bildformat - es ist ein ppmBild.
Mego
Ich stehe korrigiert! Tut mir leid und danke für die Klarstellung. Es sieht so aus, als müsste ich etwas über Bildformate lernen. :)
ZeroOne
6

Python, 167 164 155 148 Bytes

Ausgabe als 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)bis" "*5
  • Edit2: schob ein Byte am ersten print
  • Edit3: Listenverständnis durch ersetzt, mapda nur str(p)verwendet wurde
  • Edit4: exec""*5stattdessenfor _ in " "*5:

Einige Verbesserungen gegenüber altem, stringbasiertem Code:

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
quelle
Sie können ein paar Zeilen sparen, indem Sie die Zeilenumbrüche durch ein Leerzeichen in der Kopfzeile ersetzen. Die Spezifikation fordert nur Leerzeichen. 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)

Aktualisieren

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

Ich bin bei WWDC und habe gerade die Xcode 8 Beta mit Swift 3 erhalten. Apple hat einige der CoreGraphics-Aufrufe "schneller" gemacht, und ich bin in der Lage, den Bytecount zu reduzieren.

Swift 2 Code 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)

Diese Antwort setzt voraus, dass UIKit verfügbar ist und das Cocoa Touch-Framework verwendet.

Einige beispielhafte Ausgabebilder:

1 2 3

Ich weiß, dass ich mit den meisten anderen Antworten nicht mithalten kann, aber ich wollte dies als persönliche Herausforderung versuchen. Es gibt definitiv Raum für Verbesserungen mit dieser Antwort, aber ich denke, es wird schwierig sein, dies unter ein paar hundert Bytes zu bringen, aufgrund der Länge der Namen der UIKit- und CoreGraphics-Bildschreibmethoden. Ich habe mich entschieden, eine tatsächliche PNG-Datei anstelle von PPM-Werten als Übung für mich zu schreiben, aber kürzere Antworten wären definitiv möglich, wenn ich das PPM-Format verwenden würde.

Ich beginne bereits als Verlust, indem ich eine Variable deklarieren muss, mit der gesät srand48werden soll time. Ich habe dies vorgezogen arc4random()oder arc4random_uniform()weil ich damit letztendlich mehr Bytes verlieren würde. Ich setze den Befehl ein, drand48um eine zufällige Farbe zu erzeugen, und wähle aus, wann eine Farbe in ein Pixel geschrieben werden soll.

CGSizevs CGSizeMakeund CGRectvs CGRectMake:

Ich wechsle zwischen den Inline-C-API-Funktionen und ihren Swift-Erweiterungen, um den jeweils kürzesten Konstruktor zu finden. CGSizeMakeam Ende kürzer als CGSize()und CGRectam Ende kürzer als 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)

Ich müsste CGFloats xund yaufgrund der Art der for-Schleife erstellen . Ich bin wirklich nicht begeistert von der 2D-Schleife und den Gleichheitsprüfungen, aber ich hatte wirklich Mühe, einen kürzeren Weg zu finden. Hier ist definitiv Platz für ein paar Bytes.

Das Aufrufen CGContextFillRectsmit einem Array von CGRectStrukturen ist billiger als das CGContextFillRectzweimalige Aufrufen mit zwei verschiedenen Werten. Daher spare ich mit dem Array und dem Zeiger ein paar Bytes.

Ich spare auch 27 Bytes, indem ich nicht anrufe UIGraphicsEndImageContext(). Während dies normalerweise ein "Fehler" im Produktionscode ist, ist dies für dieses Spielzeugprogramm nicht erforderlich.

Farben:

Farben sind auch ein Problem, da ich UIColorObjekte erstelle , aber CGColorfür jedes Pixel einen undurchsichtigen Typ schreiben muss . Der kürzeste Code, den ich zum Erstellen einer zufälligen Farbe gefunden habe, bestand darin, den UIColorKonstruktor zu verwenden und den CGColordaraus zu erhalten UIColor. Das gleiche gilt für Weiß. Wenn ich das Cocoa-Framework anstelle von Cocoa Touch verwende, kann ich möglicherweise einige Bytes mithilfe von speichern. CGColorGetConstantColor()Leider ist diese Methode im Cocoa Touch-SDK nicht verfügbar.

Schreiben in die Datei:

Das Schreiben in eine Datei dauert fast 100 Bytes. Ich bin mir nicht sicher, wie ich das überhaupt optimieren soll. Abhängig von Ihren Berechtigungen müssen Sie auf einigen Systemen möglicherweise das Dokumentverzeichnis verwenden, das noch länger ist:

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

Auf jeden Fall offen für weitere Optimierungen.

Edit 1: Speichert ein paar Bytes, indem einige Variablendeklarationen neu angeordnet werden.

JAL
quelle
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]

Mathematica-Grafiken

ist der Transponierungsoperator .

Edit 1: Gespeichert 3 Bytes durch Ersetzen Round+ RandomRealmitRandomInteger

Edit 2: Gespeicherte 4 Bytes durch den Austausch RandomIntegermitRandomChoice

Edit 3: 4 Bytes durch Ersetzen von RandomColorund GrayLevelmit gespeichertRandomReal

shrx
quelle
4

MATLAB, 102 Bytes

Hallo, das ist meine Matlab-Lösung:

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

Die Eingabe xder Funktion ist der Name der Ausgabedatei. Beispielsweise:

p('output.png')

Erzeugt ein PNG-Bild mit dem Namen 'output.png'.

Hier die Ergebnisse einiger Ausführungen dieses Codes.

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

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

Rechts nach links:

?5 5⍴0erzeugt eine 5 × 5 Matrix von Zufallszahlen zwischen 0 und 1 ( aber niemals 0 oder 1) )

(⊢+⌽) ist ein Zug, der die Matrix mit ihrer Reflektion hinzufügt

Obergrenze, gibt 1 oder 2 für jedes Element zurück

(3⍴240)(?3⍴256) Farben - weißlich und zufällig

[ ] Verwenden Sie jedes Element der Matrix als Index in Farben

'P3',5 5 256,∊ Abflachen und Header hinzufügen

ngn
quelle
2

PHP, 236 Bytes

Ich weiß, dass dies eine alte Herausforderung ist, aber ich fordere mich einfach gerne selbst heraus.

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

Beispielausgabe:

Github Avatar

Github Avatar

Kodos Johnson
quelle
2

Javascript ES6, 296 Bytes

Hinweis: Erstellt keine Datei, zeichnet auf eine Zeichenfläche.

Sehen Sie es in Aktion in diesem 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
quelle
Willkommen auf der Seite! :)
DJMcMayhem
Nachdem es ein paar Mal laufen erzeugt es diese zweimal - ein einzelnes schwarzes Pixel in der oberen linken, und sonst nichts. Ich bin mir nicht sicher, ob dies ein Problem mit dem Code oder der Geige ist.
FlipTack
Richtig - der Code zum Erzeugen des zufälligen Hex-Werts war fehlerhaft. Aktualisiert den Link in der Antwort!
Pierlo Upitup