Swift 2.3, 593 585 byte
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)
Memperbarui
Swift 3, 551 byte
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")!)
Saya di WWDC dan baru saja mendapatkan Xcode 8 beta dengan Swift 3. Apple membuat beberapa panggilan CoreGraphics lebih "Swifty," dan saya bisa mengurangi bytecount.
Kode Swift 2 Tidak Disatukan:
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)
Jawaban ini mengasumsikan UIKit tersedia dan menggunakan kerangka kerja Cocoa Touch.
Beberapa contoh menampilkan gambar:
Saya tahu saya tidak dapat bersaing dengan sebagian besar jawaban lain tetapi saya ingin mencoba ini sebagai tantangan pribadi. Pasti ada ruang untuk perbaikan dengan jawaban ini, tapi saya pikir akan sulit untuk mendapatkan ini di bawah beberapa ratus byte karena panjangnya nama metode penulisan gambar UIKit dan CoreGraphics. Saya memilih untuk menulis file PNG yang sebenarnya daripada nilai-nilai PPM sebagai latihan untuk diri saya sendiri, tetapi jawaban yang lebih pendek pasti akan mungkin jika saya menggunakan format PPM.
Saya sudah memulai sebagai kerugian dengan harus mendeklarasikan variabel yang akan di-seed srand48
dengan time
. Saya memilih ini lebih arc4random()
atau arc4random_uniform()
karena pada akhirnya saya akan kehilangan lebih banyak byte dengan itu. Saya seed rng untuk digunakandrand48
untuk menghasilkan warna acak dan memilih kapan untuk menulis warna ke piksel.
CGSize
vs CGSizeMake
dan CGRect
vsCGRectMake
:
Saya beralih antara fungsi API C inline dan ekstensi Swift mereka untuk menemukan konstruktor terpendek untuk masing-masing. CGSizeMake
akhirnya lebih pendek dari CGSize()
, dan CGRect
akhirnya lebih pendek dari 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)
Saya harus membuat CGFloat
s x
dany
karena sifat dari untuk loop. Saya benar-benar tidak senang dengan loop 2D dan jika pemeriksaan kesetaraan, tapi saya benar-benar berjuang untuk menemukan cara yang lebih pendek. Pasti ada ruang untuk memangkas beberapa byte di sini.
Memanggil CGContextFillRects
dengan array CGRect
struct lebih murah daripada memanggil CGContextFillRect
dua kali dengan dua nilai yang berbeda, jadi saya menyimpan beberapa byte dengan array dan pointer.
Saya juga menghemat 27 byte dengan tidak menelepon UIGraphicsEndImageContext()
. Meskipun ini biasanya menjadi "bug" dalam kode produksi, itu tidak perlu untuk program mainan ini.
Warna:
Warna juga sulit untuk ditangani, karena saya membuat UIColor
objek tetapi perlu menulis CGColor
jenis buram untuk setiap piksel. Kode terpendek yang saya temukan untuk membuat warna acak adalah dengan menggunakan UIColor
konstruktor dan dapatkan CGColor
dari itu UIColor
. Sama dengan putih. Jika saya menggunakan kerangka kerja Cocoa Touch daripada Cocoa Touch, saya mungkin dapat menghemat beberapa byte menggunakan CGColorGetConstantColor()
, tetapi sayangnya metode itu tidak tersedia di Cocoa Touch SDK.
Menulis ke file:
Menulis ke file membutuhkan hampir 100 byte. Saya tidak yakin bagaimana cara mengoptimalkan ini. Pada beberapa sistem tergantung pada izin Anda, Anda mungkin perlu menggunakan direktori Dokumen yang akan lebih lama:
UIImagePNGRepresentation(i)!.writeToURL(NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory,inDomains:.UserDomainMask).first!.URLByAppendingPathComponent("a.png"), atomically:true)
Pasti terbuka untuk optimasi lebih lanjut.
Sunting 1: Menyimpan beberapa byte dengan mengatur ulang beberapa deklarasi variabel.