সুইফট 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")!)
আমি ডাব্লুডাব্লুডিসিতে এসেছি এবং স্যুইফট ৩ এর সাথে সবেমাত্র এক্সকোড 8 বিটা পেয়েছি অ্যাপল কিছু কোরগ্রাফিককে আরও "সুইফটি" কল করেছে, এবং আমি বাইকাউন্টটি হ্রাস করতে সক্ষম হয়েছি।
সুইফট 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)
এই উত্তরটি ধরে নিয়েছে ইউআইকিট উপলব্ধ এবং কোকো টাচ ফ্রেমওয়ার্ক ব্যবহার করে।
কিছু উদাহরণ আউটপুট চিত্র:
আমি জানি আমি অন্যান্য উত্তরগুলির বেশিরভাগের সাথে প্রতিযোগিতা করতে পারি না তবে আমি ব্যক্তিগত চ্যালেঞ্জ হিসাবে এটি একটি শট দিতে চেয়েছিলাম। এই উত্তরটির সাথে অবশ্যই উন্নতির অবকাশ রয়েছে তবে আমি মনে করি ইউআইকিট এবং কোরগ্রাফিক্স চিত্রের লেখার পদ্ধতির নামগুলির দৈর্ঘ্যের কারণে এটি কয়েক শত বাইটের নিচে নামা শক্ত হবে। আমি নিজের জন্য অনুশীলন হিসাবে পিপিএম মানগুলির চেয়ে একটি আসল পিএনজি ফাইল লেখার পছন্দ করেছি, তবে আমি পিপিএম ফর্ম্যাটটি ব্যবহার করলে সংক্ষিপ্ত উত্তর অবশ্যই সম্ভব হবে।
আমি ইতিমধ্যে বীজ করার জন্য একটি ভেরিয়েবল ডিক্লেয়ার করা না থাকার একটি ক্ষতি হিসাবে শুরু 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
গুলি তৈরি করতে হবে x
এবং y
লুপটির প্রকৃতির কারণে। আমি 2 ডি লুপের সাথে এবং যদি সাম্যতা পরীক্ষা করে দেখি তবে আমি সত্যিই রোমাঞ্চিত হই না, তবে আমি একটি সংক্ষিপ্ততর উপায় খুঁজে পাওয়ার জন্য লড়াই করে যাচ্ছিলাম। এখানে কয়েকটি বাইট শেভ করার স্পষ্টভাবে জায়গা আছে।
দুটি আলাদা মানের সাথে দুটি বার কল করার চেয়ে স্ট্রকের 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: কিছু পরিবর্তনশীল ঘোষণাগুলি পুনরায় সাজিয়ে কয়েকটি বাইট সংরক্ষণ করা হয়েছে।