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.
Некоторые примеры выходных изображений:
Я знаю, что не могу конкурировать с большинством других ответов, но я хотел дать этому шанс как личный вызов. В этом ответе определенно есть место для улучшения, но я думаю, что будет трудно уменьшить его до нескольких сотен байтов из-за длины имен методов записи изображений 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: Сохранение нескольких байтов путем перестановки объявлений переменных.