Створіть аватар "GitHub"


31

Передумови / опис

Примітка. Як зазначає @HelkaHomba, фактичні ідентифікатори GitHub насправді не є випадковими, а ґрунтуються на хеші імені користувача

Аватар GitHub за замовчуванням - це зображення 5x5 пікселів. Колір вибирається випадковим чином, а потім випадкові пікселі заповнюються на одній стороні (праворуч або ліворуч, розмір 2x5) за допомогою цього кольору. Потім ця сторона копіюється і перевертається на іншу сторону, по осі y. Залишені пікселі, які не заповнені, є # F0F0F0, або rgb (240,240,240).

Потім пікселі центрального стовпця (розмір 1x5) заповнюються випадковим чином, використовуючи той же колір, що і раніше.

Вихідні дані

Примітка: для цього виклику ми будемо ігнорувати простір, який охоплює аватари GitHub

Програма повинна вивести файл зображення 5х5 пікселів. Див http://meta.codegolf.stackexchange.com/a/9095/42499 конкретики

Приклади

Примітка. Вони, очевидно, були збільшені до 5x5, щоб ви могли їх бачити

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

Удачі!


@trichoplax Вихід - зображення 5x5 пікселів, дякую. Також зверніть увагу на пробіл навколо 5х5 пікселів (показаний у прикладі аватарів 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

Очевидно, що це не працює в Інтернеті, але ви можете надрукувати тут кольорові коди .


10

Perl 5 , 77 байт

Це неконкурентоспроможне, оскільки має лише 256 кольорову палітру, працює лише на терміналах, які підтримують коди виходу 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'

Пояснення

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

  • Використовуйте $-для автоматичного округлення номера кольору для використання в послідовності евакуації, що використовується замість $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

Спробуйте в Інтернеті!

Насправді це погано в обробці рядків. Я думаю, я вже згадував про це. Ця програма виводить P6 netpbm зображення за допомогою 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

Вибачте, але "P6 netpbm" відсутній у вказаному списку дозволених форматів зображень, тому вам, ймовірно, слід додати довжину командного рядка ImageMagick до своєї відповіді. : /
ZeroOne

@ZeroOne Це дозволений формат зображення - це ppmзображення.
Mego

Я стою виправлений! Вибачте за це, і дякую за пояснення. Схоже, мені потрібно вивчити формати зображень. :)
ZeroOne

6

Пітон, 167 164 155 148 байт

Вихід у проміле

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
  • Правка1: 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

Швидкий 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)

Оновлення

Швидкий 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 ще більш "швидкими", і я можу скоротити кількість рахунків.

Код 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для генерування випадкового кольору і вибирати, коли потрібно написати колір до пікселя.

CGSizevs CGSizeMakeі CGRectvs CGRectMake:

Я перемикаюся між вбудованими функціями API API та їх розширеннями 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)

Мені доведеться створити CGFloats xі yзавдяки природі циклу for. Я дійсно не в захваті від 2D-циклу, і якщо рівність перевіряється, але я дуже намагався знайти коротший шлях. Тут напевно є місце, щоб поголити кілька байтів.

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

Я також зберігаю 27 байт, не дзвонивши UIGraphicsEndImageContext(). Хоча це, як правило, "помилка" у виробничому коді, це не потрібно для цієї іграшкової програми.

Кольори:

Кольори - це також біль для вирішення, оскільки я створюю UIColorоб'єкти, але потрібно писати CGColorнепрозорий тип до кожного пікселя. Найкоротшим кодом, який я знайшов для створення випадкового кольору, було використання UIColorконструктора та отримання CGColorцього UIColor. Те саме з білим. Якби я використовував рамку Cocoa замість Cocoa Touch, я міг би зберегти деякі байти, використовуючи CGColorGetConstantColor(), але, на жаль, цей метод недоступний у SDK Cocoa Touch.

Запис у файл:

Запис у файл займає майже 100 байт. Я не впевнений, як навіть іти на те, щоб оптимізувати це. У деяких системах, залежно від ваших дозволів, можливо, вам доведеться скористатися каталогом «Документи», який би ще довше:

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

Безперечно відкриті для подальших оптимізацій.

Редагувати 1: Збережено кілька байт шляхом перестановки деяких змінних оголошень.


5

Математика, 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


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


3

Діалог APL, 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);

Безголовки:

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

Право - код для генерування випадкових шестигранних значень був баггі. Оновлено посилання у відповіді!
Pierlo Upitup
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.