Swift 2.3, 593 585 bayt
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)
Güncelleştirme
Swift 3, 551 bayt
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'deyim ve sadece Swift 3 ile birlikte Xcode 8 beta sürümüne sahibim. Apple, CoreGraphics'in bazılarını daha "Swifty" olarak nitelendirdi ve bayt sayısını azaltabiliyorum.
Swift 2 kodu 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)
Bu cevap UIKit'in hazır olduğunu ve Cocoa Touch çerçevesini kullandığını varsayar.
Bazı örnek çıktı görüntüleri:
Diğer cevapların çoğuyla yarışamayacağımı biliyorum, ancak bunu kişisel bir meydan okuma olarak göstermek istedim. Bu cevabın iyileştirilmesine kesinlikle yer var, ancak UIKit ve CoreGraphics görüntü yazma yöntemi adlarının uzunluğundan dolayı bunu birkaç yüz baytın altına indirmenin zor olacağını düşünüyorum. Kendim için bir alıştırma olarak PPM değerleri yerine gerçek bir PNG dosyası yazmayı seçtim, ancak PPM formatını kullanırsam kısa cevaplar kesinlikle mümkün olacaktır.
Zaten tohuma bir değişken bildirmek zorunda tarafından bir kayıp olarak başlar srand48
ile time
. Bunu tercih ettim arc4random()
ya da arc4random_uniform()
nihayetinde onlarla daha fazla bayt kaybederim. Rng'yi drand48
rastgele bir renk üretmek için kullanıp , ne zaman bir piksele renk yazacağımı seçiyorum.
CGSize
vs CGSizeMake
ve CGRect
vs CGRectMake
:
Her biri için en kısa kurucuyu bulmak için satır içi C API işlevleri ve Swift uzantıları arasında geçiş yapıyorum. CGSizeMake
biter daha kısa CGSize()
ve CGRect
biter daha kısa olur 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)
Ben oluşturması gerekecektir CGFloat
s x
ve y
bağlı döngü için doğası gereği. 2B döngüden gerçekten heyecan duymuyorum ve eşitlik kontrol ederse, gerçekten daha kısa bir yol bulmak için mücadele ediyordum. Burada birkaç bayt olmak için kesinlikle yer var.
Arayan CGContextFillRects
bir dizi CGRect
yapılar aramaktan daha ucuz olduğunu CGContextFillRect
ben dizide ve pointer ile birkaç bayt kaydetmek böylece, iki farklı değerlerle iki kez.
Ayrıca arayarak 27 bayt tasarruf ediyorum UIGraphicsEndImageContext()
. Bu normalde üretim kodunda bir "hata" olmasına rağmen, bu oyuncak programı için gerekli değildir.
Renkler:
Renkler de başa çıkmak için acı verici, çünkü ben UIColor
nesneler yaratıyorum ama CGColor
her piksele opak tip yazmam gerekiyor . Ben rastgele bir renk oluşturmak için bulunan en kısa kod kullanmaktı UIColor
yapıcı ve almak CGColor
bundan UIColor
. Beyaz ile aynı. Cocoa Touch yerine Cocoa çerçevesini kullanıyor olsaydım, bazı baytları kullanarak kaydedebilirdim CGColorGetConstantColor()
, ancak ne yazık ki bu yöntem Cocoa Touch SDK'da mevcut değil.
Dosyaya Yazma:
Bir dosyaya yazma neredeyse 100 bayt alır. Bunu nasıl optimize edeceğime bile emin değilim. İzinlerine bağlı olarak bazı sistemlerde, daha uzun sürecek olan Belgeler dizinini kullanmanız gerekebilir:
UIImagePNGRepresentation(i)!.writeToURL(NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory,inDomains:.UserDomainMask).first!.URLByAppendingPathComponent("a.png"), atomically:true)
Kesinlikle diğer optimizasyonlara açık.
Düzenleme 1: Bazı değişken bildirimlerini yeniden düzenleyerek birkaç bayt kaydedildi.