Швидкий 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.
Деякі приклади вихідних зображень:
Я знаю, що не можу конкурувати з більшістю інших відповідей, але я хотів дати це зняти як особисте завдання. Однозначно є можливість вдосконалити цю відповідь, але я думаю, що буде важко опустити це нижче декількох сотень байт через довжину назв методів написання зображень UIKit та CoreGraphics. Я вирішив написати фактичний файл PNG, а не значення PPM, як вправу для себе, але коротші відповіді, безумовно, будуть можливі, якби я використовував формат PPM.
Я вже починаю як втрати від того , щоб оголосити змінну насіння srand48
з time
. Я вибрав це над arc4random()
або arc4random_uniform()
тому, що в кінцевому рахунку я втратив би більше байтів з ними. Я запускаю rng, щоб використовувати drand48
для генерування випадкового кольору і вибирати, коли потрібно написати колір до пікселя.
CGSize
vs CGSizeMake
і CGRect
vs 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)
Мені доведеться створити CGFloat
s 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: Збережено кілька байт шляхом перестановки деяких змінних оголошень.