Swift 2.3, 593 585 bytes
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 bytes
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 และเพิ่งได้รับ Xcode 8 beta พร้อม Swift 3 Apple ทำให้ CoreGraphics บางสายเรียก "Swifty" มากขึ้นและฉันสามารถลดจำนวน bytecount ได้
Swift 2 code 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 ฉันเลือกที่จะเขียนไฟล์ PNG จริงแทนที่จะเป็นค่า PPM เป็นการออกกำลังกายสำหรับตัวเอง แต่คำตอบที่สั้นกว่านั้นจะเป็นไปได้แน่นอนถ้าฉันใช้รูปแบบ PPM
ฉันแล้วเริ่มต้นเป็นความสูญเสียโดยไม่ต้องประกาศตัวแปรเมล็ดพันธุ์ด้วยsrand48
time
ฉันเลือกสิ่งนี้มากกว่าarc4random()
หรือarc4random_uniform()
เพราะในที่สุดฉันจะเสียจำนวนไบต์ที่มากกว่า ฉันหว่าน rng เพื่อใช้drand48
ในการสร้างสีแบบสุ่มและเลือกเวลาที่จะเขียนสีไปยังพิกเซล
CGSize
vs CGSizeMake
และCGRect
vs 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
s x
และy
เนื่องจากลักษณะของการวนรอบ ฉันไม่ได้ตื่นเต้นกับการวนซ้ำ 2D และถ้าตรวจสอบความเท่าเทียมกัน แต่ฉันพยายามดิ้นรนเพื่อหาวิธีที่สั้นกว่านี้ มีที่ว่างสำหรับการโกนไม่กี่ไบต์ที่นี่
การโทรCGContextFillRects
ด้วยอาร์เรย์ของCGRect
structs นั้นถูกกว่าการโทรCGContextFillRect
สองครั้งด้วยสองค่าที่แตกต่างกันดังนั้นฉันจึงประหยัดสองสามไบต์ด้วยอาร์เรย์และตัวชี้
ฉันยังประหยัด 27 UIGraphicsEndImageContext()
ไบต์โดยไม่ได้เรียกร้อง แม้ว่าปกติแล้วจะเป็น "บั๊ก" ในรหัสการผลิต แต่ก็ไม่จำเป็นสำหรับโปรแกรมของเล่นนี้
สี:
สีก็เป็นความเจ็บปวดที่ต้องจัดการด้วยเนื่องจากฉันสร้างUIColor
วัตถุ แต่ต้องเขียนCGColor
ชนิดทึบแสงให้แต่ละพิกเซล รหัสที่สั้นที่สุดที่ฉันพบในการสร้างสีสุ่มคือการใช้UIColor
ตัวสร้างและได้รับจากCGColor
UIColor
เหมือนกันกับสีขาว หากฉันใช้เฟรมเวิร์ก Cocoa แทน Cocoa Touch ฉันอาจบันทึกบางไบต์ที่ใช้CGColorGetConstantColor()
แต่น่าเสียดายที่วิธีนี้ไม่สามารถใช้งานได้ใน Cocoa Touch SDK
เขียนไปยังไฟล์:
การเขียนไฟล์มีขนาดเกือบ 100 ไบต์ ฉันไม่แน่ใจว่าจะทำสิ่งนี้อย่างไรให้เกิดประโยชน์สูงสุด ในบางระบบขึ้นอยู่กับการอนุญาตของคุณคุณอาจต้องใช้ไดเรกทอรีเอกสารซึ่งจะยิ่งนานขึ้น:
UIImagePNGRepresentation(i)!.writeToURL(NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory,inDomains:.UserDomainMask).first!.URLByAppendingPathComponent("a.png"), atomically:true)
เปิดแน่นอนเพื่อเพิ่มประสิทธิภาพเพิ่มเติม
แก้ไข 1:บันทึกสองสามไบต์โดยจัดเรียงการประกาศตัวแปรใหม่