Genera un avatar "GitHub"


31

Sfondo / descrizione

Nota: come sottolinea @HelkaHomba, gli identici GitHub non sono in realtà casuali ma basati sull'hash di un nome utente

L'avatar GitHub predefinito è un'immagine di 5x5 pixel. Un colore viene scelto in modo casuale, quindi i pixel casuali vengono riempiti su un lato (destra o sinistra, dimensione 2x5) usando quel colore. Quindi quel lato viene copiato e capovolto sull'altro lato, attraverso l'asse y. I pixel rimasti non compilati sono # F0F0F0 o rgb (240.240.240).

I pixel della colonna centrale (dimensione 1x5) vengono quindi riempiti in modo casuale, usando lo stesso colore di prima.

Produzione

Nota: per questa sfida ignoreremo lo spazio che racchiude gli avatar di GitHub

Il programma dovrebbe generare un file di immagine di 5x5 pixel. Vedi http://meta.codegolf.stackexchange.com/a/9095/42499 per dettagli

Esempi

Nota: questi sono stati ovviamente ridimensionati da 5x5 in modo da poterli vedere

inserisci qui la descrizione dell'immagine inserisci qui la descrizione dell'immagine

In bocca al lupo!


@trichoplax L'output è un'immagine di 5x5 pixel, grazie. Si noti inoltre che lo spazio attorno ai pixel 5x5 (mostrato nell'esempio degli avatar GitHub) dovrebbe essere escluso.
MCMastery,

5
Suggerirei alcune immagini di esempio più piccole. Questi occupano molto più spazio del necessario. Anche il termine tecnico per questi è "identicons" e non sono in realtà casuali ma basati sull'hash di un nome utente (ma averli casuali per la sfida va bene).
Calvin's Hobbies,

@HelkaHomba grazie, ho aggiunto esempi migliori.
MCMastery,

1
Suppongo che "pixel casuali" significhi che ogni pixel è colorato o vuoto con 0,5 probabilità, indipendentemente da tutti gli altri pixel della stessa dimensione. E "colore casuale" significa che ciascun componente RGB è uniformemente uniforme su [0, 255]. Corretta?
Luis Mendo,

1
Non pensavo fosse una risposta valida poiché non produceva un'immagine reale, ma ho creato una versione da riga di comando utilizzando i codici ANSI: gist.github.com/anonymous/3c879c5b01983a07fb7da7a25d778f1b !
Dom Hastings,

Risposte:


12

Pyth - 27 byte

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

Ovviamente non funziona online, ma puoi farlo stampare i codici colore qui .


10

Perl 5 , 77 byte

Questo non è competitivo in quanto ha solo una tavolozza di 256 colori, funziona solo su terminali che supportano i codici di escape ANSI e in realtà non genera un'immagine quadrata di 5 pixel, ma ho pensato di pubblicarlo comunque perché era divertente giocare a golf giù.

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

Nota: il \eè in realtà carattere 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'

Spiegazione

Niente di particolarmente intelligente tranne forse:

  • Utilizzare $-per arrotondare automaticamente il numero di colore da utilizzare nella sequenza di escape, utilizzato al posto di $n=0|rand 254.

Esempio di output

Sì, rimarrai bloccato con qualunque sia l'ultimo colore, su tutto il tuo terminale -boink.


9

MATL , 36 29 byte

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

Questo salva il risultato nel file a.png.

La sostituzione 'a'con 2nel codice visualizza l'immagine (ingrandita) invece di salvare un file:

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

Ecco un esempio di output:

inserisci qui la descrizione dell'immagine

Spiegazione

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

In realtà, 53 byte

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

Provalo online!

In realtà è negativo per l'elaborazione delle stringhe. Penso di averlo menzionato prima. Questo programma genera un'immagine netpbm P6 usando CP437, come il seguente:

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

Questo può essere convertito in un PNG usando ImageMagick:

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

Versione PNG ingrandita:

uscita campione

Spiegazione:

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

Siamo spiacenti, ma "P6 netpbm" non è nell'elenco specificato dei formati di immagine consentiti, quindi dovresti probabilmente aggiungere la lunghezza della riga di comando di ImageMagick alla tua risposta. : /
ZeroOne,

@ZeroOne È un formato immagine consentito : è ppmun'immagine.
Mego

Sono corretto! Scusatemi e grazie per il chiarimento. Sembra che debba imparare qualcosa sui formati delle immagini. :)
ZeroOne,

6

Python, 167 164 155 148 byte

Uscita come 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
  • Modifica1: range(5)a" "*5
  • Edit2: spinto un byte al primo print
  • Edit3: sostituita la comprensione dell'elenco con mappoiché è str(p)stato utilizzato solo
  • Edit4: exec""*5invecefor _ in " "*5:

Alcuni miglioramenti rispetto al vecchio codice basato su stringhe:

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)

Puoi salvarne alcuni sostituendo le nuove righe con uno spazio nell'intestazione. Le specifiche richiedono solo spazi bianchi. netpbm.sourceforge.net/doc/ppm.html
Chuck Morris

5

Swift 2.3, 593 585 byte

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)

Aggiornare

Swift 3, 551 byte

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

Sono al WWDC e ho appena ricevuto l'Xcode 8 beta con Swift 3. Apple ha fatto alcune delle chiamate CoreGraphics più "Swifty" e sono in grado di ridurre il numero di byte.

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

Questa risposta presuppone che UIKit sia disponibile e utilizzi il framework Cocoa Touch.

Alcuni esempi di immagini di output:

1 2 3

So di non poter competere con la maggior parte delle altre risposte, ma volevo provarlo come una sfida personale. C'è sicuramente spazio per miglioramenti con questa risposta, ma penso che sarà difficile scendere sotto alcune centinaia di byte a causa della lunghezza dei nomi dei metodi di scrittura delle immagini UIKit e CoreGraphics. Ho scelto di scrivere un vero file PNG anziché i valori PPM come esercizio per me stesso, ma se avessi usato il formato PPM sarebbero state possibili risposte più brevi.

Ho già iniziano come una perdita dal dover dichiarare una variabile alle sementi srand48con time. Ho scelto questo arc4random()o arc4random_uniform()perché alla fine perderei più byte con quelli. Semino l'Rng da usare drand48per generare un colore casuale e scelgo quando scrivere un colore su un pixel.

CGSizevs CGSizeMakee CGRectvs CGRectMake:

Passo tra le funzioni API C incorporate e le loro estensioni Swift per trovare il costruttore più corto per ognuna. CGSizeMakefinisce per essere più corto di CGSize()e CGRectfinisce per essere più corto di 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)

Avrei dovuto creare CGFloats xed ya causa della natura del ciclo for. Non sono davvero entusiasta del loop 2D e se l'uguaglianza controlla, ma stavo davvero lottando per trovare un modo più breve. C'è sicuramente spazio per radere qualche byte qui.

Chiamare CGContextFillRectscon una matrice di CGRectstrutture è più economico che chiamare CGContextFillRectdue volte con due valori diversi, quindi salvo qualche byte con la matrice e il puntatore.

Inoltre salvo 27 byte non chiamando UIGraphicsEndImageContext(). Mentre questo sarebbe normalmente un "bug" nel codice di produzione, non è necessario per questo programma giocattolo.

Colori:

Anche i colori sono un problema da affrontare, dal momento che sto creando UIColoroggetti ma devo scrivere un CGColortipo opaco su ogni pixel. Il codice più corto che ho trovato per creare un colore a caso è stato quello di utilizzare il UIColorcostruttore e ottenere il CGColorda quella UIColor. Lo stesso vale per il bianco. Se stavo usando il framework Cocoa anziché Cocoa Touch, potrei essere in grado di salvare alcuni byte utilizzando CGColorGetConstantColor(), ma sfortunatamente quel metodo non è disponibile in Cocoa Touch SDK.

Scrivere su un file:

La scrittura su un file richiede quasi 100 byte. Non sono sicuro di come fare per ottimizzare questo. Su alcuni sistemi a seconda delle tue autorizzazioni, potresti dover utilizzare la directory Documents che sarebbe ancora più lunga:

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

Sicuramente aperto a ulteriori ottimizzazioni.

Modifica 1: salvato alcuni byte riorganizzando alcune dichiarazioni di variabili.


5

Mathematica, 105 102 98 94 byte

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

Grafica Mathematica

è l' operatore Transpose .

Modifica 1: 3 byte salvati sostituendo Round+ RandomRealconRandomInteger

Modifica 2: salvato 4 byte sostituendo RandomIntegerconRandomChoice

Modifica 3: salvato 4 byte sostituendo RandomColore GrayLevelconRandomReal


4

MATLAB, 102 byte

Ciao, questa è la mia soluzione 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'input xdella funzione è il nome del file di output. Per esempio:

p('output.png')

produce un'immagine png chiamata 'output.png'.

Ecco i risultati di alcune esecuzioni di questo codice.

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


3

Dyalog APL, 43 42 byte

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

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

Da destra a sinistra:

?5 5⍴0genera una matrice 5 × 5 di numeri casuali tra 0 e 1 ( ma mai 0 o 1 )

(⊢+⌽) è un treno che aggiunge la matrice con il suo riflesso

soffitto, restituisce 1 o 2 per ciascun elemento

(3⍴240)(?3⍴256) colori - bianco-ish e uno casuale

[ ] usa ogni elemento della matrice come un indice a colori

'P3',5 5 256,∊ appiattire e aggiungere intestazione


2

PHP, 236 byte

So che questa è una vecchia sfida, ma mi piace solo sfidare me stesso.

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

Uscita campione:

Avatar di Github

Avatar di Github


2

Javascript ES6, 296 byte

Nota: non produce un file, disegna su una tela.

Guardalo in azione in questo 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);}));

Benvenuti nel sito! :)
DJMcMayhem

Dopo averlo eseguito alcune volte ha generato due volte questo : un singolo pixel nero in alto a sinistra e nient'altro. Non sono sicuro se questo è un problema con il codice o il violino.
FlipTack,

Esatto: il codice per generare il valore esadecimale casuale era errato. Aggiornato il link nella risposta!
Pierlo Upitup,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.