Wygeneruj awatar „GitHub”

31

Tło / opis

Uwaga: jak wskazuje @HelkaHomba, rzeczywiste identyfikatory GitHub nie są w rzeczywistości losowe, ale oparte na haszowaniu nazwy użytkownika

Domyślny awatar GitHub to obraz 5 x 5 pikseli. Kolor jest wybierany losowo, a następnie losowe piksele są wypełniane po jednej stronie (po prawej lub lewej stronie, rozmiar 2x5) przy użyciu tego koloru. Następnie ta strona jest kopiowana i odwracana na drugą stronę, wzdłuż osi y. Pozostałe piksele, które nie są wypełnione, to # F0F0F0 lub rgb (240,240,240).

Piksele w środkowej kolumnie (rozmiar 1x5) są następnie losowo wypełniane przy użyciu tego samego koloru, co poprzednio.

Wydajność

Uwaga: w przypadku tego wyzwania zignorujemy przestrzeń otaczającą awatary GitHub

Program powinien wypisać plik obrazu 5 x 5 pikseli. Szczegółowe informacje można znaleźć na stronie http://meta.codegolf.stackexchange.com/a/9095/42499

Przykłady

Uwaga: zostały one oczywiście powiększone w stosunku do 5 x 5, dzięki czemu można je zobaczyć

wprowadź opis zdjęcia tutaj wprowadź opis zdjęcia tutaj

Powodzenia!

MCMastery
źródło
@trichoplax Dzięki, obraz wyjściowy to obraz 5x5 pikseli. Zwróć także uwagę, że przestrzeń wokół 5 x 5 pikseli (pokazana w przykładzie awatarów GitHub) powinna zostać wykluczona.
MCMastery
5
Sugerowałbym kilka mniejszych przykładowych zdjęć. Zajmują one znacznie więcej miejsca niż to konieczne. Również terminem technicznym dla nich są „identyfikatory” i nie są one w rzeczywistości losowe, ale oparte na haszowaniu nazwy użytkownika (ale posiadanie ich losowych dla wyzwania jest w porządku).
Calvin's Hobbies
@HelkaHomba dziękuję, dodałem lepsze przykłady.
MCMastery
1
Zakładam, że „losowe piksele” oznaczają, że każdy piksel jest kolorowy lub pusty z prawdopodobieństwem 0,5, niezależnie od wszystkich innych pikseli o tym samym rozmiarze. „Losowy kolor” oznacza, że ​​każdy komponent RGB jest niezależnie jednolity dla [0, 255]. Poprawny?
Luis Mendo,
1
Nie czułem, że to poprawna odpowiedź, ponieważ nie wyświetla rzeczywistego obrazu, ale utworzyłem wersję wiersza poleceń, używając kodów ANSI: gist.github.com/anonymous/3c879c5b01983a07fb7da7a25d778f1b !
Dom Hastings,

Odpowiedzi:

12

Pyth - 27 bajtów

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

Oczywiście nie działa w trybie online, ale można go wydrukować kody kolorów tutaj .

Maltysen
źródło
10

Perl 5 , 77 bajtów

Jest to niekonkurencyjne, ponieważ ma tylko paletę 256 kolorów, działa tylko na terminalach, które obsługują kody ucieczki ANSI i faktycznie nie generują obrazu o wielkości 5 pikseli kwadratowych, ale pomyślałem, że i tak opublikuję to, ponieważ fajnie jest grać w golfa na dół.

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

Uwaga: w \erzeczywistości jest to znak ASCII \x1B.

Stosowanie

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

Wyjaśnienie

Nic szczególnie sprytnego, może poza:

  • Służy $-do automatycznego zaokrąglania numeru koloru do użycia w sekwencji ucieczki, używanej zamiast $n=0|rand 254.

Przykładowe dane wyjściowe

Tak, utkniesz z jakimkolwiek ostatnim kolorem na całym terminalu.

Dom Hastings
źródło
9

MATL , 36 29 bajtów

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

To zapisuje wynik w pliku a.png.

Zastąpienie 'a'przez 2w kodzie powoduje wyświetlenie obrazu (przeskalowanie) zamiast zapisywania pliku:

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

Oto przykładowy wynik:

wprowadź opis zdjęcia tutaj

Wyjaśnienie

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
źródło
7

Właściwie 53 bajty

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

Wypróbuj online!

W rzeczywistości jest zły w przetwarzaniu ciągów. Myślę, że wspominałem o tym wcześniej. Ten program wyświetla obraz P6 netpbm przy użyciu CP437, podobnie jak poniżej:

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

Można to przekonwertować do formatu PNG za pomocą ImageMagick:

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

Skalowana wersja PNG:

próbka wyjściowa

Wyjaśnienie:

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
źródło
Przykro nam, ale „P6 netpbm” nie znajduje się na określonej liście dozwolonych formatów obrazów, więc prawdopodobnie powinieneś dodać długość linii poleceń ImageMagick do swojej odpowiedzi. : /
ZeroOne
@ZeroOne Jest to dozwolony format obrazu - jest to ppmobraz.
Mego
Poprawiono mnie! Przepraszam za to i dziękuję za wyjaśnienie. Wygląda na to, że muszę nauczyć się formatów obrazów. :)
ZeroOne
6

Python, 167 164 155 148 bajtów

Wyjście w 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
  • Edycja1: range(5)do" "*5
  • Edycja2: pierwszy zapisany bajt print
  • Edycja3: Zastąpione zrozumienie listy maptylko odtądstr(p) użyto
  • Edycja4: exec""*5zamiast tegofor _ in " "*5:

Pewne ulepszenia w stosunku do starego kodu opartego na łańcuchach znaków:

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
źródło
Możesz zaoszczędzić kilka, zastępując znaki nowej linii spacją w nagłówku. Specyfikacja wymaga tylko białych znaków. netpbm.sourceforge.net/doc/ppm.html
Chuck Morris
5

Swift 2.3, 593 585 bajtów

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)

Aktualizacja

Swift 3, 551 bajtów

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

Jestem w WWDC i właśnie dostałem Xcode 8 w wersji beta z Swift 3. Apple wykonało niektóre z połączeń CoreGraphics bardziej „Swifty” i jestem w stanie zmniejszyć liczbę bajtów.

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

Ta odpowiedź zakłada, że ​​UIKit jest dostępny i korzysta ze struktury Cocoa Touch.

Niektóre przykładowe obrazy wyjściowe:

1 2) 3)

Wiem, że nie mogę konkurować z większością innych odpowiedzi, ale chciałem dać temu szansę jako osobiste wyzwanie. Ta odpowiedź zdecydowanie wymaga poprawy, ale myślę, że trudno będzie obniżyć ją poniżej kilkuset bajtów ze względu na długość nazw metod zapisu obrazów UIKit i CoreGraphics. Jako ćwiczenie dla siebie zdecydowałem się napisać rzeczywisty plik PNG zamiast wartości PPM, ale zdecydowanie krótsze odpowiedzi byłyby możliwe, gdybym użył formatu PPM.

I już zaczynają jako straty poprzez zadeklarować zmienną do materiału siewnego srand48z time. Wybrałem to ponad arc4random()lub arc4random_uniform()ponieważ ostatecznie stracę z nimi więcej bajtów. Rozstawiam rng, aby użyć drand48do wygenerowania losowego koloru i wybieram, kiedy napisać kolor na piksel.

CGSizevs CGSizeMakei CGRectvs CGRectMake:

Przełączam się między wbudowanymi funkcjami API C i ich rozszerzeniami Swift, aby znaleźć najkrótszy konstruktor dla każdej z nich. CGSizeMakekończy się na niższym niż CGSize()i CGRectkończy się na 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)

Musiałbym stworzyć CGFloats xi yze względu na naturę pętli for. Naprawdę nie jestem zachwycony pętlą 2D i sprawdzaniem równości, ale naprawdę starałem się znaleźć krótszą drogę. Zdecydowanie jest tu miejsce na ogolenie kilku bajtów.

Wywoływanie CGContextFillRectsza pomocą tablicy CGRectstruktur jest tańsze niż wywoływanie CGContextFillRectdwukrotnie przy użyciu dwóch różnych wartości, więc zapisuję kilka bajtów za pomocą tablicy i wskaźnika.

Zapisuję również 27 bajtów, nie dzwoniąc UIGraphicsEndImageContext(). Chociaż normalnie byłby to „błąd” w kodzie produkcyjnym, nie jest to konieczne w przypadku tego programu zabawkowego.

Zabarwienie:

Kolory są również trudnym problemem, ponieważ tworzę UIColorobiekty, ale muszę pisać CGColornieprzejrzysty typ dla każdego piksela. Najkrótszym kodem, który znalazłem, aby stworzyć losowy kolor, było użycie UIColorkonstruktora i uzyskanie CGColortegoUIColor . To samo z białym. Gdybym używał frameworka Cocoa zamiast Cocoa Touch, mógłbym być w stanie zapisać niektóre bajty CGColorGetConstantColor(), ale niestety ta metoda jest niedostępna w Cocoa Touch SDK.

Zapis do pliku:

Zapis do pliku zajmuje prawie 100 bajtów. Nie jestem pewien, jak nawet zoptymalizować to. W niektórych systemach, w zależności od twoich uprawnień, może być konieczne użycie katalogu Dokumenty, który byłby jeszcze dłuższy:

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

Zdecydowanie otwarty na dalsze optymalizacje.

Edycja 1: Zapisano kilka bajtów, przestawiając niektóre deklaracje zmiennych.

JAL
źródło
5

Mathematica, 105 102 98 94 bajtów

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

Grafika matematyczna

jest operatorem transpozycji .

Edycja 1: zapisane 3 bajty zastępując Round+ RandomRealzRandomInteger

Edycja 2: Zapisano 4 bajty, zastępując RandomIntegerjeRandomChoice

Edycja 3: Zapisano 4 bajty, zastępując RandomColori GrayLevelprzy pomocyRandomReal

shrx
źródło
4

MATLAB, 102 bajty

Cześć, to moje rozwiązanie 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))

Dane wejściowe xfunkcji to nazwa pliku wyjściowego. Na przykład:

p('output.png')

tworzy obraz png o nazwie „output.png”.

Oto wyniki niektórych wykonań tego kodu.

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

PieCot
źródło
3

Dyalog APL, 43 42 bajty

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

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

Od prawej do lewej:

?5 5⍴0generuje macierz liczb losowych 5 × 5 od 0 do 1 ( ale nigdy 0 lub 1 )

(⊢+⌽) to pociąg, który dodaje macierz ze swoim odbiciem

sufit zwraca 1 lub 2 dla każdego elementu

(3⍴240)(?3⍴256) kolory - biały i losowy

[ ] użyj każdego elementu macierzy jako indeksu kolorów

'P3',5 5 256,∊ spłaszcz i dodaj nagłówek

ngn
źródło
2

PHP, 236 bajtów

Wiem, że to stare wyzwanie, ale po prostu lubię się rzucać.

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

Nie golfowany:

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

Przykładowe dane wyjściowe:

Awatar Github

Awatar Github

Kodos Johnson
źródło
2

JavaScript ES6, 296 bajtów

Uwaga: nie tworzy pliku, rysuje na kanwie.

Zobacz to w akcji w tym skrzypce JS .

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
źródło
Witamy na stronie! :)
DJMcMayhem
Po kilkukrotnym uruchomieniu wygenerował to dwa razy - pojedynczy czarny piksel w lewym górnym rogu i nic więcej. Nie jestem pewien, czy jest to problem z kodem lub skrzypcami.
FlipTack,
Racja - kod generujący losową wartość szesnastkową był błędny. Zaktualizowano link w odpowiedzi!
Pierlo Upitup