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 8ベータ版を入手しました。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の画像書き込みメソッド名の長さのために、これを数百バイト未満に抑えるのは難しいと思います。私は、PPM値ではなく実際のPNGファイルを自分で練習することを選択しましたが、PPM形式を使用すれば、より短い回答が間違いなく可能になります。
私はすでに種子に変数を宣言することによって損失として開始srand48
してtime
。私はこれを選んだarc4random()
かarc4random_uniform()
、最終的にそれらでより多くのバイトを失うからです。drand48
ランダムな色を生成するために使用するrngをシードし、ピクセルに色を書き込むタイミングを選択します。
CGSize
対CGSizeMake
とCGRect
対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
するループの性質による。私は2Dループと平等チェックに本当に興奮していませんが、より短い方法を見つけるのに本当に苦労していました。ここには、間違いなく数バイトを削る余地があります。
構造体CGContextFillRects
の配列を使用した呼び出しは、2つの異なる値を使用して2回CGRect
呼び出すよりも安価なCGContextFillRect
ので、配列とポインターを使用して数バイトを節約します。
を呼び出さないことで27バイトも節約できますUIGraphicsEndImageContext()
。これは通常、生産コードの「バグ」ですが、このおもちゃのプログラムには必要ありません。
色:
UIColor
オブジェクトを作成しているがCGColor
、各ピクセルに不透明(OPAQUE)型を書き込む必要があるため、色も扱いが面倒です。ランダムな色を作成するために見つけた最も短いコードは、UIColor
コンストラクタを使用して、CGColor
そこから取得することUIColor
でした。白と同じ。Cocoa Touchの代わりにCocoaフレームワークを使用していた場合、を使用していくつかのバイトを保存できる可能性がありますCGColorGetConstantColor()
が、残念ながらその方法はCocoa Touch SDKでは使用できません。
ファイルへの書き込み:
ファイルへの書き込みには、ほぼ100バイトかかります。これを最適化する方法すらわからない。一部のシステムでは、アクセス権に応じて、さらに長いDocumentsディレクトリを使用する必要がある場合があります。
UIImagePNGRepresentation(i)!.writeToURL(NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory,inDomains:.UserDomainMask).first!.URLByAppendingPathComponent("a.png"), atomically:true)
さらなる最適化を確実に受け入れます。
編集1:いくつかの変数宣言を再配置することにより、数バイトを保存しました。