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上,刚刚获得了带有Swift 3的Xcode 8beta。Apple将CoreGraphics的一些调用称为“ Swifty”,而且我能够减少字节数。
Swift 2代码解散:
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
:
我在内联C 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
小号x
和y
因的性质for循环。我真的不为2D循环和是否进行相等性检查而感到兴奋,但我确实在努力寻找更短的方法。这里肯定有剃除几个字节的空间。
主叫CGContextFillRects
用的阵列CGRect
结构比调用便宜CGContextFillRect
具有两个不同的值的两倍,因此我保存与所述阵列和指针几个字节。
我还通过不调用节省了27个字节UIGraphicsEndImageContext()
。尽管这通常是生产代码中的“错误”,但对于此玩具程序而言并不必要。
颜色:
颜色也是一个处理难题,因为我正在创建UIColor
对象,但需要CGColor
为每个像素写一个不透明的类型。我发现创建随机颜色的最短的代码是使用UIColor
构造,并获得CGColor
从UIColor
。与白色相同。如果我使用的是Cocoa框架而不是Cocoa Touch,则可以使用来保存一些字节CGColorGetConstantColor()
,但是不幸的是,该方法在Cocoa Touch SDK中不可用。
写入文件:
写入文件几乎需要100个字节。我不确定如何进行优化。在某些系统上,根据您的权限,您可能需要使用更长的Documents目录:
UIImagePNGRepresentation(i)!.writeToURL(NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory,inDomains:.UserDomainMask).first!.URLByAppendingPathComponent("a.png"), atomically:true)
绝对可以进行进一步的优化。
编辑1:通过重新排列一些变量声明节省了一些字节。