Создайте аватар «GitHub»

31

Фон / Описание

Примечание: как указывает @HelkaHomba, фактические идентификаторы GitHub на самом деле не случайны, а основаны на хэше имени пользователя

Аватар GitHub по умолчанию представляет собой изображение размером 5x5 пикселей. Цвет выбирается случайным образом, и затем случайные пиксели заполняются с одной стороны (справа или слева, размером 2x5), используя этот цвет. Затем эта сторона копируется и переворачивается на другую сторону, по оси Y. Не заполненные пиксели - это # ​​F0F0F0 или rgb (240,240,240).

Пиксели центрального столбца (размером 1х5) затем заполняются случайным образом, используя тот же цвет, что и ранее.

Выход

Примечание: для этого вызова мы будем игнорировать пространство, в котором находятся аватары GitHub.

Программа должна вывести файл изображения 5x5 пикселей. См. Http://meta.codegolf.stackexchange.com/a/9095/42499 для подробностей

Примеры

Примечание: они были явно увеличены с 5х5, чтобы вы могли их видеть

введите описание изображения здесь введите описание изображения здесь

Удачи!

MCMastery
источник
@trichoplax На выходе получается изображение размером 5x5 пикселей, спасибо. Также обратите внимание, что пространство вокруг 5x5 пикселей (показанное в примере аватаров GitHub) должно быть исключено.
MCMastery
5
Я бы предложил несколько небольших образцов изображений. Они занимают намного больше места, чем необходимо. Также технический термин для них - «идентификаторы», и они на самом деле не случайны, а основаны на хэше имени пользователя (но иметь их случайным образом для вызова - это нормально).
Увлечения Кэлвина
@HelkaHomba спасибо, я добавил лучшие примеры.
MCMastery
1
Я предполагаю, что «случайные пиксели» означают, что каждый пиксель является цветным или пустым с вероятностью 0,5, независимо от всех других пикселей того же размера. И «случайный цвет» означает, что каждый компонент RGB независимо однороден на [0, 255]. Правильный?
Луис Мендо
1
Я не чувствовал, что это был правильный ответ, поскольку он не выводит реальное изображение, но я сделал версию командной строки, используя коды ANSI: gist.github.com/anonymous/3c879c5b01983a07fb7da7a25d778f1b !
Дом Гастингс

Ответы:

12

Pyth - 27 байт

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

Очевидно, что он не работает в Интернете, но вы можете распечатать цветовые коды здесь .

Maltysen
источник
10

Perl 5 , 77 байт

Это неконкурентное решение, поскольку оно имеет только 256-цветовую палитру, работает только на терминалах, которые поддерживают escape-коды ANSI, и на самом деле не выводит квадратное изображение размером 5 пикселей, но я решил опубликовать его в любом случае, так как это было забавно, сыграв в эту игру вниз.

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

Примечание: на \eсамом деле это символ ASCII \x1B.

использование

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

объяснение

Ничего особенно умного, кроме, возможно,

  • Используется $-для автоматического округления номера цвета для использования в escape-последовательности, используется вместо $n=0|rand 254.

Пример вывода

Да, вы застрянете с любым последним цветом по всему терминалу -boink.

Дом Гастингс
источник
9

MATL , 36 29 байт

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

Это сохраняет результат в файл a.png.

Замена 'a'на 2в коде отображает изображение (увеличенное) вместо сохранения файла:

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

Вот пример вывода:

введите описание изображения здесь

объяснение

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

На самом деле, 53 байта

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

Попробуйте онлайн!

На самом деле плохо при обработке строк. Я думаю, что упоминал об этом раньше. Эта программа выводит изображение netpbm P6 с использованием CP437, например:

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

Это может быть преобразовано в PNG с помощью ImageMagick:

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

Увеличенная версия PNG:

образец вывода

Объяснение:

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
источник
Извините, но «P6 netpbm» отсутствует в указанном списке разрешенных форматов изображений, поэтому вам, вероятно, следует добавить в ответ длину командной строки ImageMagick. : /
ZeroOne
@ ZeroOne Это разрешенный формат изображения - это ppmизображение.
Мего
Я исправлюсь! Извините за это, и спасибо за разъяснения. Похоже, мне нужно немного изучить форматы изображений. :)
ZeroOne
6

Python, 167 164 155 148 байт

Вывести в 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)для" "*5
  • Edit2: засунул байт первым print
  • Edit3: заменено понимание списка, mapпоскольку str(p)использовался только
  • Edit4: exec""*5вместоfor _ in " "*5:

Некоторое улучшение по сравнению со старым, основанным на строках кодом:

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)
Карл Напф
источник
Вы можете сохранить несколько, заменив символы новой строки пробелом в заголовке. Спецификация просто требует пробелов. netpbm.sourceforge.net/doc/ppm.html
Чак Моррис
5

Swift 2.3, 593 585 байт

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)

Обновить

Swift 3, 551 байт

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 и только что получил бета-версию Xcode 8 с Swift 3. Apple сделала некоторые вызовы CoreGraphics более «Swifty», и я могу сократить количество пользователей.

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)

Этот ответ предполагает, что UIKit доступен и использует платформу Cocoa Touch.

Некоторые примеры выходных изображений:

1 2 3

Я знаю, что не могу конкурировать с большинством других ответов, но я хотел дать этому шанс как личный вызов. В этом ответе определенно есть место для улучшения, но я думаю, что будет трудно уменьшить его до нескольких сотен байтов из-за длины имен методов записи изображений UIKit и CoreGraphics. В качестве упражнения для себя я решил написать фактический файл PNG, а не значения PPM, но более короткие ответы определенно были бы возможны, если бы я использовал формат PPM.

Я уже начинаю как потери от того , чтобы объявить переменную семени srand48с time. Я выбрал это arc4random()или arc4random_uniform()потому, что в конечном итоге я потерял бы больше байтов с ними. Я использую Rng для drand48генерации случайного цвета и выбираю, когда записать цвет в пиксель.

CGSizeпротив CGSizeMakeи CGRectпротив CGRectMake:

Я переключаюсь между встроенными функциями API C и их расширениями Swift, чтобы найти самый короткий конструктор для каждого из них. CGSizeMakeв конечном итоге короче, чем CGSize(), и CGRectзаканчивается короче, чем 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)

Я должен был бы создать CGFloatс xиy из-за природы цикла for. Я действительно не в восторге от цикла 2D и проверки равенства, но я действительно изо всех сил пытался найти более короткий путь. Здесь определенно есть место, чтобы сбрить несколько байтов.

Вызов CGContextFillRectsс массивом CGRectструктур дешевле, чем вызов CGContextFillRectдважды с двумя разными значениями, поэтому я сохраняю несколько байтов с массивом и указателем.

Я также экономлю 27 байтов, не вызывая UIGraphicsEndImageContext(). Хотя это обычно было бы «ошибкой» в производственном коде, для этой игрушечной программы это не обязательно.

Цвета:

С цветами также трудно справиться, так как я создаю UIColorобъекты, но мне нужно написать CGColorнепрозрачный тип для каждого пикселя. Самый короткий код, который я нашел, чтобы создать случайный цвет, должен был использовать UIColorконструктор и получить CGColorиз этого UIColor. То же самое с белым. Если бы я использовал Cocoa Framework вместо Cocoa Touch, я мог бы сохранить некоторые байты с помощью CGColorGetConstantColor(), но, к сожалению, этот метод недоступен в Cocoa Touch SDK.

Запись в файл:

Запись в файл занимает почти 100 байтов. Я не уверен, как вообще оптимизировать это. В некоторых системах, в зависимости от ваших разрешений, вам может понадобиться использовать каталог Documents, который будет еще длиннее:

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

Определенно открыт для дальнейшей оптимизации.

Редактировать 1: Сохранение нескольких байтов путем перестановки объявлений переменных.

JAL
источник
5

Mathematica, 105 102 98 94 байта

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

Математическая графика

является оператором транспонирования .

Изменить 1: 3 байта сохранены путем замены Round+ RandomRealнаRandomInteger

Изменить 2: 4 байта сохранены путем замены RandomIntegerнаRandomChoice

Редактировать 3: Сохранено 4 байта путем замены RandomColorи GrayLevelсRandomReal

shrx
источник
4

MATLAB, 102 байта

Привет, это мое решение 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))

Ввод xфункции - это имя выходного файла. Например:

p('output.png')

создает изображение в формате png с именем 'output.png'.

Вот результаты некоторых выполнений этого кода.

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

PieCot
источник
3

Дьялог АПЛ, 43 42 байта

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

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

Справа налево:

?5 5⍴0генерирует матрицу 5 × 5 случайных чисел от 0 до 1 ( но никогда не 0 или 1 )

(⊢+⌽) это поезд, который добавляет матрицу с ее отражением

потолок, возвращает 1 или 2 для каждого элемента

(3⍴240)(?3⍴256) цвета - белый и случайный

[ ] использовать каждый элемент матрицы в качестве индекса в цветах

'P3',5 5 256,∊ расплющить и добавить заголовок

СПП
источник
2

PHP, 236 байт

Я знаю, что это старый вызов, но мне просто нравится испытывать себя.

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

Пример вывода:

Github аватар

Github аватар

Кодос Джонсон
источник
2

Javascript ES6, 296 байт

Примечание: не создает файл, рисует на холсте.

Посмотрите это в действии в этой 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);}));
Пьеро Упитуп
источник
Добро пожаловать на сайт! :)
DJMcMayhem
После запуска несколько раз он сгенерировал это дважды - один черный пиксель в левом верхнем углу и больше ничего. Не уверен, что это проблема с кодом или скрипкой.
FlipTack
Справа - код для генерации случайного шестнадцатеричного значения содержит ошибки. Обновил ссылку в ответе!
Пьеро Апитуп