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)
Cập nhật
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")!)
Tôi đang ở WWDC và vừa nhận được bản Xcode 8 beta với Swift 3. Apple đã thực hiện một số cuộc gọi CoreGraphics nhiều hơn là "Swifty" và tôi có thể giảm số lượng bằng cách.
Swift 2 mã 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)
Câu trả lời này giả định rằng UIKit có sẵn và sử dụng khung Cacao Touch.
Một số ví dụ hình ảnh đầu ra:
Tôi biết tôi không thể cạnh tranh với hầu hết các câu trả lời khác nhưng tôi muốn đưa ra một thử thách này như một thử thách cá nhân. Chắc chắn có chỗ để cải thiện với câu trả lời này, nhưng tôi nghĩ sẽ khó để đưa nó xuống dưới vài trăm byte do độ dài của tên phương thức viết hình ảnh UIKit và CoreGraphics. Tôi đã chọn viết một tệp PNG thực tế thay vì các giá trị PPM như một bài tập cho chính mình, nhưng câu trả lời ngắn hơn chắc chắn sẽ có thể nếu tôi sử dụng định dạng PPM.
Tôi đã bắt đầu ra như là một sự mất mát bằng cách khai báo một biến để hạt giống srand48
với time
. Tôi đã chọn cái này hơn arc4random()
hoặc arc4random_uniform()
vì cuối cùng tôi sẽ mất nhiều byte hơn với những cái đó. Tôi chọn rng để sử dụng drand48
để tạo màu ngẫu nhiên và chọn thời điểm viết màu cho pixel.
CGSize
vs CGSizeMake
và CGRect
vs CGRectMake
:
Tôi chuyển đổi giữa các hàm C API nội tuyến và các tiện ích mở rộng Swift của chúng để tìm ra hàm tạo ngắn nhất cho mỗi hàm. CGSizeMake
cuối cùng ngắn hơn CGSize()
và CGRect
cuối cùng ngắn hơn 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)
Tôi sẽ phải tạo CGFloat
s x
và y
do tính chất của vòng lặp for. Tôi thực sự không hào hứng với vòng lặp 2D và nếu kiểm tra sự bình đẳng, nhưng tôi thực sự loay hoay tìm một con đường ngắn hơn. Chắc chắn có chỗ để cạo một vài byte ở đây.
Gọi CGContextFillRects
với một mảng các CGRect
cấu trúc rẻ hơn so với gọi CGContextFillRect
hai lần với hai giá trị khác nhau, vì vậy tôi lưu một vài byte với mảng và con trỏ.
Tôi cũng lưu 27 byte bằng cách không gọi UIGraphicsEndImageContext()
. Mặc dù điều này thường là một "lỗi" trong mã sản xuất, nhưng nó không cần thiết cho chương trình đồ chơi này.
Màu sắc:
Màu sắc cũng là một vấn đề khó giải quyết, vì tôi đang tạo UIColor
các đối tượng nhưng cần phải viết một CGColor
loại mờ cho mỗi pixel. Mã ngắn nhất tôi tìm thấy để tạo màu ngẫu nhiên là sử dụng hàm UIColor
tạo và lấy CGColor
từ đó UIColor
. Tương tự với màu trắng. Nếu tôi đang sử dụng khung Ca cao thay vì Ca cao cảm ứng, tôi có thể lưu một số byte bằng cách sử dụng CGColorGetConstantColor()
, nhưng tiếc là phương pháp đó không có sẵn trong SDK của Touch Touch.
Viết vào tập tin:
Viết vào một tập tin mất gần 100 byte. Tôi không chắc làm thế nào để tối ưu hóa điều này. Trên một số hệ thống tùy thuộc vào quyền của bạn, bạn có thể cần sử dụng thư mục Tài liệu sẽ còn dài hơn:
UIImagePNGRepresentation(i)!.writeToURL(NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory,inDomains:.UserDomainMask).first!.URLByAppendingPathComponent("a.png"), atomically:true)
Chắc chắn mở để tối ưu hóa hơn nữa.
Chỉnh sửa 1: Đã lưu một vài byte bằng cách sắp xếp lại một số khai báo biến.