“GitHub” Avatarı Yaratın


31

Arkaplan / Açıklama

Not: @HelkaHomba'nın işaret ettiği gibi, gerçek GitHub özdeşleri aslında rastgele değil, bir kullanıcı adının karmaşasına dayanır.

Varsayılan GitHub avatarı 5x5 piksellik bir görüntüdür. Bir renk rastgele toplanır ve daha sonra rastgele pikseller bu renk kullanılarak bir tarafa (sağa veya sola, 2x5 boyutuna) doldurulur. Sonra o taraf, y ekseni boyunca kopyalanır ve diğer tarafa çevrilir. Üzerinde bırakılmayan pikseller # F0F0F0 veya rgb'dir (240,240,240).

Orta sütunun pikselleri (1x5 boyutunda) daha sonra aynı renk kullanılarak rastgele doldurulur.

Çıktı

Not: Bu meydan okuma için GitHub avatarlarını çevreleyen alanı yok sayacağız

Program 5x5 piksel görüntü dosyası çıkarmalıdır. Bkz http://meta.codegolf.stackexchange.com/a/9095/42499 kesin bilgi için

Örnekler

Not: Bunlar açıkça 5x5'ten daha büyük ölçeklendirildi, böylece onları görebilirsiniz.

görüntü tanımını buraya girin görüntü tanımını buraya girin

İyi şanslar!


@trichoplax Çıktı 5x5 piksel bir görüntü, teşekkürler. Ayrıca, 5x5 piksellerin (GitHub avatarlarında gösterildiği gibi) etrafındaki boşluğun hariç tutulması gerektiğini unutmayın.
MCMastery

5
Daha küçük örnek resimler öneririm. Bunlar gereğinden fazla yer kaplıyor. Ayrıca bunlar için teknik terim "özdeşlerdir" ve aslında rastgele değillerdir, ancak bir kullanıcı adının karmaşasına dayanırlar (ancak zorluk için rastgele olmaları iyidir).
Calvin'in Hobileri

@HelkaHomba teşekkür ederim, daha iyi örnekler ekledim.
MCMastery

1
"Rastgele piksel" in her bir pikselin aynı büyüklükteki tüm piksellerden bağımsız olarak, her bir pikselin 0,5 olasılıkla renkli veya boş olduğu anlamına gelir. Ve "rastgele renk", her RGB bileşeninin bağımsız olarak [0, 255] üzerinde tek tip olduğu anlamına gelir. Doğru?
Luis Mendo

1
Gerçek bir görüntü çıkmadığı için geçerli bir cevap olduğunu düşünmedim, ancak ANSI kodlarını kullanarak bir komut satırı sürümü yaptım: gist.github.com/anonymous/3c879c5b01983a07fb7da7a25d778f1b !
Dom Hastings

Yanıtlar:


12

Pyth - 27 bayt

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

Açıkçası çevrimiçi çalışmıyor, ancak burada renk kodlarını yazdırmasını sağlayabilirsiniz .


10

Perl 5 , 77 bayt

Sadece 256 renk paleti olduğu için rakipsiz aşağı.

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

Not:\e Aslında ASCII karakter olduğunu \x1B.

kullanım

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

açıklama

Belki de dışında akıllıca bir şey yok:

  • Kullanım $-çıkış sırası kullanılmak üzere otomatik olarak yuvarlak renk numarasına yerine kullanılan $n=0|rand 254.

Örnek çıktı

Evet, son rengin her neyse, -bölüm terminalinizin her yerinde sıkışıp kalacaksınız.


9

MATL , 36 29 bayt

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

Bu sonucu dosyaya kaydeder a.png.

Kodda değiştirmek 'a', 2bir dosyayı kaydetmek yerine görüntüyü (ölçeklendirilmiş) görüntüler:

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

İşte bir örnek çıktı:

görüntü tanımını buraya girin

açıklama

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

Aslında, 53 bayt

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

Çevrimiçi deneyin!

Aslında string işlemede kötü. Sanırım bundan daha önce bahsetmiştim. Bu program aşağıdaki gibi CP437 kullanarak bir P6 netpbm görüntüsünü çıkarır:

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

Bu ImageMagick kullanarak bir PNG'ye dönüştürülebilir:

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

Ölçeklendirilmiş PNG sürümü:

örnek çıktı

Açıklama:

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

Üzgünüz, ama "P6 netpbm" izin verilen resim formatları listesinde yer almıyor, bu yüzden muhtemelen cevabınıza ImageMagick komut satırının uzunluğunu eklemelisiniz. : /
ZeroOne

@ ZeroOne İzin verilen bir görüntü formatı - bu bir ppmgörüntü.
Mego

Düzeltilmiş duruyorum! Bunun için üzgünüm ve açıklama için teşekkürler. Resim formatları hakkında biraz bilgi edinmem gerekiyor gibi görünüyor. :)
ZeroOne

6

Python, 167 164 155 148 bayt

Ppm olarak çıktı

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
  • Düzenleme1: range(5)ila" "*5
  • Edit2: ilk başta bir bayt attı print
  • Edit3: mapSadece str(p)kullanıldığından beri değiştirilen liste kavrama
  • Edit4: exec""*5yerinefor _ in " "*5:

Eski, dize tabanlı kod üzerinde bazı iyileştirmeler:

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)

Yeni satırları başlığındaki bir boşlukla değiştirerek birkaç tane tasarruf edebilirsiniz. Spec sadece boşluk istiyor. netpbm.sourceforge.net/doc/ppm.html
Chuck Morris

5

Swift 2.3, 593 585 bayt

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)

Güncelleştirme

Swift 3, 551 bayt

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

WWDC'deyim ve sadece Swift 3 ile birlikte Xcode 8 beta sürümüne sahibim. Apple, CoreGraphics'in bazılarını daha "Swifty" olarak nitelendirdi ve bayt sayısını azaltabiliyorum.

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

Bu cevap UIKit'in hazır olduğunu ve Cocoa Touch çerçevesini kullandığını varsayar.

Bazı örnek çıktı görüntüleri:

1 2 3

Diğer cevapların çoğuyla yarışamayacağımı biliyorum, ancak bunu kişisel bir meydan okuma olarak göstermek istedim. Bu cevabın iyileştirilmesine kesinlikle yer var, ancak UIKit ve CoreGraphics görüntü yazma yöntemi adlarının uzunluğundan dolayı bunu birkaç yüz baytın altına indirmenin zor olacağını düşünüyorum. Kendim için bir alıştırma olarak PPM değerleri yerine gerçek bir PNG dosyası yazmayı seçtim, ancak PPM formatını kullanırsam kısa cevaplar kesinlikle mümkün olacaktır.

Zaten tohuma bir değişken bildirmek zorunda tarafından bir kayıp olarak başlar srand48ile time. Bunu tercih ettim arc4random()ya da arc4random_uniform()nihayetinde onlarla daha fazla bayt kaybederim. Rng'yi drand48rastgele bir renk üretmek için kullanıp , ne zaman bir piksele renk yazacağımı seçiyorum.

CGSizevs CGSizeMakeve CGRectvs CGRectMake:

Her biri için en kısa kurucuyu bulmak için satır içi C API işlevleri ve Swift uzantıları arasında geçiş yapıyorum. CGSizeMakebiter daha kısa CGSize()ve CGRectbiter daha kısa olur 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)

Ben oluşturması gerekecektir CGFloats xve ybağlı döngü için doğası gereği. 2B döngüden gerçekten heyecan duymuyorum ve eşitlik kontrol ederse, gerçekten daha kısa bir yol bulmak için mücadele ediyordum. Burada birkaç bayt olmak için kesinlikle yer var.

Arayan CGContextFillRectsbir dizi CGRectyapılar aramaktan daha ucuz olduğunu CGContextFillRectben dizide ve pointer ile birkaç bayt kaydetmek böylece, iki farklı değerlerle iki kez.

Ayrıca arayarak 27 bayt tasarruf ediyorum UIGraphicsEndImageContext(). Bu normalde üretim kodunda bir "hata" olmasına rağmen, bu oyuncak programı için gerekli değildir.

Renkler:

Renkler de başa çıkmak için acı verici, çünkü ben UIColornesneler yaratıyorum ama CGColorher piksele opak tip yazmam gerekiyor . Ben rastgele bir renk oluşturmak için bulunan en kısa kod kullanmaktı UIColoryapıcı ve almak CGColorbundan UIColor. Beyaz ile aynı. Cocoa Touch yerine Cocoa çerçevesini kullanıyor olsaydım, bazı baytları kullanarak kaydedebilirdim CGColorGetConstantColor(), ancak ne yazık ki bu yöntem Cocoa Touch SDK'da mevcut değil.

Dosyaya Yazma:

Bir dosyaya yazma neredeyse 100 bayt alır. Bunu nasıl optimize edeceğime bile emin değilim. İzinlerine bağlı olarak bazı sistemlerde, daha uzun sürecek olan Belgeler dizinini kullanmanız gerekebilir:

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

Kesinlikle diğer optimizasyonlara açık.

Düzenleme 1: Bazı değişken bildirimlerini yeniden düzenleyerek birkaç bayt kaydedildi.


5

Mathematica, 105 102 98 94 bayt

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

Mathematica grafikleri

olduğunu Transpoze operatörü .

Düzenleme 1: Round+ RandomRealile değiştirilerek 3 bayt kaydedildiRandomInteger

Düzenleme 2: RandomIntegerile değiştirerek kaydedilen 4 baytRandomChoice

Düzenleme 3: Değiştirerek RandomColorve GrayLevelile kaydetti 4 baytRandomReal


4

MATLAB, 102 bayt

Merhaba, bu benim matlab çözümüm:

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

xFonksiyonun girişi , çıktı dosyasının adıdır. Örneğin:

p('output.png')

'output.png' adında bir png görüntüsü oluşturur.

İşte bu kodun bazı yürütme sonuçları.

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


3

Dyalog APL, 43 42 bayt

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

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

Sağdan sola:

?5 5⍴00 ile 1 arasında 5 × 5 rasgele sayılar matrisi oluşturur ( ancak hiçbir zaman 0 veya 1 değildir )

(⊢+⌽) yansımasıyla matrisi ekleyen bir tren

tavan, her eleman için 1 veya 2 döndürür

(3⍴240)(?3⍴256) renkler - beyaz-ish ve rastgele bir

[ ] matrisin her bir öğesini renk olarak bir dizin olarak kullanın

'P3',5 5 256,∊ düzleştirin ve başlık ekleyin


2

PHP, 236 bayt

Bunun eski bir meydan okuma olduğunu biliyorum ama kendime meydan okumayı seviyorum.

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

Örnek çıktı:

Github avatar

Github avatar


2

Javascript ES6, 296 bayt

Not: bir dosya üretmez, bir tuvale çizer.

Bu JS Fiddle'da çalışırken görün .

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

Siteye Hoşgeldiniz! :)
DJMcMayhem

Ama birkaç kez çalıştırdıktan sonra bu oluşturulan bu tek siyah sol üst piksel ve başka bir şey - İki kez. Bunun kod ya da kemanla ilgili bir sorun olup olmadığından emin değilsiniz.
FlipTack

Sağ - rastgele onaltılık değeri üretmek için kod buggy oldu. Cevaptaki bağlantı güncellendi!
Pierlo Upitup
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.