स्विफ्ट 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)
अद्यतन करें
स्विफ्ट 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 में हूं और स्विफ्ट 3 के साथ सिर्फ Xcode 8 बीटा मिला। Apple ने कुछ CoreGraphics कॉल को "Swifty" कहा, और मैं bytecount को कम करने में सक्षम हूं।
स्विफ्ट 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 उपलब्ध है और कोको टच फ्रेमवर्क का उपयोग करता है।
कुछ उदाहरण आउटपुट चित्र:
मुझे पता है कि मैं अधिकांश अन्य उत्तरों के साथ प्रतिस्पर्धा नहीं कर सकता, लेकिन मैं इसे व्यक्तिगत चुनौती के रूप में शॉट देना चाहता था। इस उत्तर के साथ सुधार के लिए निश्चित रूप से जगह है, लेकिन मुझे लगता है कि UIKit और CoreGraphics की इमेज राइटिंग मेथड नामों की लंबाई के कारण इसे कुछ सौ बाइट्स से नीचे लाना मुश्किल होगा। मैंने अपने लिए एक अभ्यास के रूप में PPM मानों के बजाय एक वास्तविक PNG फ़ाइल लिखने का विकल्प चुना, लेकिन यदि मैंने PPM प्रारूप का उपयोग किया तो छोटे उत्तर निश्चित रूप से संभव होंगे।
मैं पहले से ही बीज के srand48
साथ एक चर घोषित करने के लिए एक नुकसान के रूप में बाहर शुरू करते हैं time
। मैंने इसे चुना arc4random()
या arc4random_uniform()
क्योंकि अंततः मैं उन लोगों के साथ अधिक बाइट्स खो देगा। मैं बीज का उपयोग करने के लिए बीजdrand48
यादृच्छिक रंग उत्पन्न करने के करने के और पिक्सेल पर रंग लिखने के ।
CGSize
बनाम CGSizeMake
और CGRect
बनाम CGRectMake
:
मैं इनलाइन सी एपीआई फंक्शंस और उनके स्विफ्ट एक्सटेंशन के बीच स्विच करता हूं ताकि प्रत्येक के लिए सबसे छोटा कंस्ट्रक्टर खोजा जा सके। 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
s x
और बनाना होगाy
पाश के लिए की प्रकृति के कारण। मैं वास्तव में 2D लूप से रोमांचित नहीं हूं और अगर समानता की जांच होती है, लेकिन मैं वास्तव में एक छोटा रास्ता खोजने के लिए संघर्ष कर रहा था। यहाँ कुछ बाइट्स शेव करने के लिए निश्चित रूप से कमरा है।
दो अलग-अलग मूल्यों के साथ दो बार कॉल करने की तुलना में CGContextFillRects
एक सरणी के साथ कॉल करना CGRect
सस्ता है CGContextFillRect
, इसलिए मैं सरणी और पॉइंटर के साथ कुछ बाइट्स बचाता हूं।
मैं कॉल न करके 27 बाइट भी बचा लेता हूं UIGraphicsEndImageContext()
। हालांकि यह आम तौर पर उत्पादन कोड में "बग" होगा, यह इस खिलौना कार्यक्रम के लिए आवश्यक नहीं है।
रंग की:
रंग भी एक दर्द से निपटने के लिए हैं, क्योंकि मैं UIColor
ऑब्जेक्ट्स बना रहा हूं, लेकिन CGColor
प्रत्येक पिक्सेल को एक अपारदर्शी प्रकार लिखने की आवश्यकता है । एक यादृच्छिक रंग बनाने के लिए मैंने जो सबसे छोटा कोड पाया, वह था UIColor
कंस्ट्रक्टर का उपयोग करना और उसी CGColor
से प्राप्त करना UIColor
। सफेद के साथ भी। अगर मैं कोकोआ टच के बजाय कोको फ्रेमवर्क का उपयोग कर रहा था, तो मैं कुछ बाइट्स का उपयोग करके बचा सकता हूं CGColorGetConstantColor()
, लेकिन दुर्भाग्य से कोको टच एसडीके में यह विधि अनुपलब्ध है।
फाइल करने के लिए लेखन:
किसी फ़ाइल में लिखना लगभग 100 बाइट्स लेता है। मुझे यकीन नहीं है कि कैसे भी इस बारे में अनुकूलन किया जा सकता है। आपकी अनुमति के आधार पर कुछ प्रणालियों पर, आपको दस्तावेज़ निर्देशिका का उपयोग करने की आवश्यकता हो सकती है जो कि अधिक लंबी होगी:
UIImagePNGRepresentation(i)!.writeToURL(NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory,inDomains:.UserDomainMask).first!.URLByAppendingPathComponent("a.png"), atomically:true)
निश्चित रूप से आगे अनुकूलन के लिए खुला।
संपादित करें 1: कुछ चर घोषणाओं को पुनर्व्यवस्थित करके कुछ बाइट्स को बचाया।