Hasilkan Avatar "GitHub"

31

Latar Belakang / Deskripsi

Catatan: seperti yang ditunjukkan oleh @HelkaHomba, identitas GitHub sebenarnya bukan acak tetapi berdasarkan hash dari nama pengguna

Avatar GitHub default adalah gambar 5x5-piksel. Warna dipilih secara acak, dan kemudian piksel acak diisi di satu sisi (kanan atau kiri, ukuran 2x5) menggunakan warna itu. Kemudian sisi itu disalin & dibalik ke sisi lain, melintasi sumbu y. Pixel yang tersisa yang tidak diisi adalah # F0F0F0, atau rgb (240.240.240).

Pixel kolom tengah (ukuran 1x5) kemudian diisi secara acak, menggunakan warna yang sama seperti sebelumnya.

Keluaran

Catatan: untuk tantangan ini kami akan mengabaikan ruang yang melingkupi avatar GitHub

Program harus menghasilkan file gambar 5x5 piksel. Lihat http://meta.codegolf.stackexchange.com/a/9095/42499 untuk rinciannya

Contohnya

Catatan: ini jelas ditingkatkan dari 5x5 sehingga Anda dapat melihatnya

masukkan deskripsi gambar di sini masukkan deskripsi gambar di sini

Semoga berhasil!

MCMastery
sumber
@trichoplax Outputnya adalah gambar piksel 5x5, terima kasih. Perhatikan juga ruang sekitar 5x5 piksel (ditunjukkan dalam contoh Avatar GitHub) harus dikecualikan.
MCMastery
5
Saya akan menyarankan beberapa gambar sampel yang lebih kecil. Ini mengambil lebih banyak ruang daripada yang diperlukan. Juga istilah teknis untuk ini adalah "identicons" dan mereka tidak benar-benar acak tetapi berdasarkan hash dari nama pengguna (tetapi mereka secara acak untuk tantangan itu baik-baik saja).
Calvin Hobi
@HelkaHomba terima kasih, saya menambahkan contoh yang lebih baik.
MCMastery
1
Saya berasumsi "piksel acak" berarti setiap piksel berwarna atau kosong dengan probabilitas 0,5, terlepas dari semua piksel lainnya dengan ukuran yang sama. Dan "warna acak" berarti setiap komponen RGB seragam secara independen pada [0, 255]. Benar?
Luis Mendo
1
Saya tidak merasa itu adalah jawaban yang valid karena tidak menampilkan gambar yang sebenarnya, tetapi saya membuat versi baris perintah menggunakan kode ANSI: gist.github.com/anonymous/3c879c5b01983a07fb7da7a25d778f1b !
Dom Hastings

Jawaban:

12

Pyth - 27 byte

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

Jelas tidak bekerja secara online, tetapi Anda dapat memilikinya mencetak kode warna di sini .

Maltysen
sumber
10

Perl 5 , 77 byte

Ini non-bersaing karena hanya memiliki 256 palet warna, hanya bekerja pada terminal yang mendukung kode pelarian ANSI dan tidak benar-benar menghasilkan gambar persegi 5 piksel, tapi saya pikir saya akan mempostingnya karena menyenangkan bermain golf ini turun.

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

Catatan: yang \esebenarnya ASCII arang \x1B.

Pemakaian

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

Penjelasan

Tidak ada yang pandai kecuali mungkin:

  • Gunakan $-untuk secara otomatis membulatkan nomor warna untuk digunakan dalam urutan pelarian, digunakan sebagai ganti $n=0|rand 254.

Contoh output

Ya, Anda akan terjebak dengan apa pun warna terakhirnya, di seluruh terminal -boink Anda.

Dom Hastings
sumber
9

MATL , 36 29 byte

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

Ini menyimpan hasil dalam file a.png.

Mengganti 'a'dengan oleh 2dalam kode menampilkan gambar (ditingkatkan) alih-alih menyimpan file:

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

Berikut ini contoh output:

masukkan deskripsi gambar di sini

Penjelasan

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

Sebenarnya, 53 byte

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

Cobalah online!

Sebenarnya buruk dalam pemrosesan string. Saya pikir saya sudah menyebutkan itu sebelumnya. Program ini menghasilkan gambar netpbm P6 menggunakan CP437, seperti berikut:

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

Ini dapat dikonversi ke PNG menggunakan ImageMagick:

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

Versi PNG yang ditingkatkan:

output sampel

Penjelasan:

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
sumber
Maaf, tetapi "P6 netpbm" tidak ada dalam daftar format gambar yang diizinkan, jadi Anda mungkin harus menambahkan panjang baris perintah ImageMagick ke jawaban Anda. : /
ZeroOne
@ZeroOne Ini adalah format gambar yang diizinkan - ini adalah ppmgambar.
Mego
Saya berdiri dikoreksi! Maaf tentang itu, dan terima kasih atas klarifikasi. Sepertinya saya perlu melakukan beberapa pembelajaran tentang format gambar. :)
ZeroOne
6

Python, 167 164 155 148 byte

Output sebagai 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) ke" "*5
  • Sunting2: mendorong byte pertama print
  • Sunting3: Pemahaman daftar yang diganti dengan mapkarena hanya str(p)digunakan
  • Sunting4: exec""*5sebagai gantinyafor _ in " "*5:

Beberapa peningkatan dari kode berbasis string yang lama:

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
sumber
Anda bisa menyimpan beberapa dengan mengganti baris baru dengan spasi di header. Spesifikasi hanya memanggil spasi putih. 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)

Memperbarui

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

Saya di WWDC dan baru saja mendapatkan Xcode 8 beta dengan Swift 3. Apple membuat beberapa panggilan CoreGraphics lebih "Swifty," dan saya bisa mengurangi bytecount.

Kode Swift 2 Tidak Disatukan:

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)

Jawaban ini mengasumsikan UIKit tersedia dan menggunakan kerangka kerja Cocoa Touch.

Beberapa contoh menampilkan gambar:

1 2 3

Saya tahu saya tidak dapat bersaing dengan sebagian besar jawaban lain tetapi saya ingin mencoba ini sebagai tantangan pribadi. Pasti ada ruang untuk perbaikan dengan jawaban ini, tapi saya pikir akan sulit untuk mendapatkan ini di bawah beberapa ratus byte karena panjangnya nama metode penulisan gambar UIKit dan CoreGraphics. Saya memilih untuk menulis file PNG yang sebenarnya daripada nilai-nilai PPM sebagai latihan untuk diri saya sendiri, tetapi jawaban yang lebih pendek pasti akan mungkin jika saya menggunakan format PPM.

Saya sudah memulai sebagai kerugian dengan harus mendeklarasikan variabel yang akan di-seed srand48dengan time. Saya memilih ini lebih arc4random()atau arc4random_uniform()karena pada akhirnya saya akan kehilangan lebih banyak byte dengan itu. Saya seed rng untuk digunakandrand48 untuk menghasilkan warna acak dan memilih kapan untuk menulis warna ke piksel.

CGSizevs CGSizeMakedan CGRectvsCGRectMake :

Saya beralih antara fungsi API C inline dan ekstensi Swift mereka untuk menemukan konstruktor terpendek untuk masing-masing. CGSizeMakeakhirnya lebih pendek dari CGSize(), dan CGRectakhirnya lebih pendek dari 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)

Saya harus membuat CGFloats xdany karena sifat dari untuk loop. Saya benar-benar tidak senang dengan loop 2D dan jika pemeriksaan kesetaraan, tapi saya benar-benar berjuang untuk menemukan cara yang lebih pendek. Pasti ada ruang untuk memangkas beberapa byte di sini.

Memanggil CGContextFillRectsdengan array CGRectstruct lebih murah daripada memanggil CGContextFillRectdua kali dengan dua nilai yang berbeda, jadi saya menyimpan beberapa byte dengan array dan pointer.

Saya juga menghemat 27 byte dengan tidak menelepon UIGraphicsEndImageContext(). Meskipun ini biasanya menjadi "bug" dalam kode produksi, itu tidak perlu untuk program mainan ini.

Warna:

Warna juga sulit untuk ditangani, karena saya membuat UIColorobjek tetapi perlu menulis CGColorjenis buram untuk setiap piksel. Kode terpendek yang saya temukan untuk membuat warna acak adalah dengan menggunakan UIColorkonstruktor dan dapatkan CGColordari itu UIColor. Sama dengan putih. Jika saya menggunakan kerangka kerja Cocoa Touch daripada Cocoa Touch, saya mungkin dapat menghemat beberapa byte menggunakan CGColorGetConstantColor(), tetapi sayangnya metode itu tidak tersedia di Cocoa Touch SDK.

Menulis ke file:

Menulis ke file membutuhkan hampir 100 byte. Saya tidak yakin bagaimana cara mengoptimalkan ini. Pada beberapa sistem tergantung pada izin Anda, Anda mungkin perlu menggunakan direktori Dokumen yang akan lebih lama:

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

Pasti terbuka untuk optimasi lebih lanjut.

Sunting 1: Menyimpan beberapa byte dengan mengatur ulang beberapa deklarasi variabel.

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

Grafik Mathematica

adalah operator Transpose .

Sunting 1: Disimpan 3 byte dengan mengganti Round+ RandomRealdenganRandomInteger

Sunting 2: Disimpan 4 byte dengan menggantinya RandomIntegerdenganRandomChoice

Sunting 3: Disimpan 4 byte dengan mengganti RandomColordan GrayLeveldenganRandomReal

shrx
sumber
4

MATLAB, 102 byte

Hai, ini solusi matlab saya:

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

Input xdari fungsi adalah nama file output. Sebagai contoh:

p('output.png')

menghasilkan gambar png yang disebut 'output.png'.

Di sini hasil dari beberapa eksekusi kode ini.

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

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

Kanan ke kiri:

?5 5⍴0menghasilkan matriks 5x5 angka acak antara 0 dan 1 ( tetapi tidak pernah 0 atau 1 )

(⊢+⌽) adalah kereta yang menambahkan matriks dengan pantulannya

plafon, mengembalikan 1 atau 2 untuk setiap elemen

(3⍴240)(?3⍴256) warna - putih-ish dan acak

[ ] gunakan setiap elemen dari matriks sebagai indeks dalam warna

'P3',5 5 256,∊ ratakan dan tambahkan tajuk

ngn
sumber
2

PHP, 236 byte

Saya tahu ini adalah tantangan lama tetapi saya hanya ingin menantang diri saya sendiri.

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

Tidak Disatukan:

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

Output sampel:

Avatar Github

Avatar Github

Kodos Johnson
sumber
2

Javascript ES6, 296 byte

Catatan: tidak menghasilkan file, menarik ke kanvas.

Lihat beraksi di JS Fiddle ini .

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
sumber
Selamat datang di situs ini! :)
DJMcMayhem
Setelah menjalankannya beberapa kali menghasilkan ini dua kali - satu piksel hitam di kiri atas, dan tidak ada yang lain. Tidak yakin apakah ini masalah dengan kode atau biola.
FlipTack
Kanan - kode untuk menghasilkan nilai hex acak adalah buggy. Memperbarui tautan dalam jawabannya!
Pierlo Upitup