스위프트 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에 있으며 Swift 3와 함께 Xcode 8 베타 버전을 얻었습니다.
스위프트 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을 사용할 수 있고 Cocoa Touch 프레임 워크를 사용한다고 가정합니다.
출력 이미지 예 :
나는 다른 대부분의 답변과 경쟁 할 수 없다는 것을 알고 있지만 개인적으로 도전하기를 원했습니다. 이 답변으로 개선의 여지가 분명히 있지만 UIKit 및 CoreGraphics 이미지 작성 방법 이름의 길이로 인해 수백 바이트 미만으로 낮추기가 어려울 것이라고 생각합니다. PPM 값 대신 실제 PNG 파일을 직접 작성하기로 선택했지만 PPM 형식을 사용하면 더 짧은 답변이 가능합니다.
이미 씨앗에 변수를 선언함으로써 손실로 시작 srand48
과 함께 time
. 나는 이것을 선택 arc4random()
했거나 arc4random_uniform()
궁극적으로는 더 많은 바이트를 잃을 것이기 때문입니다. drand48
임의의 색상을 생성하고 픽셀에 색상을 쓸 때 선택 하는 rng를 시드합니다 .
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
들 x
과 y
반복문의 특성. 나는 2D 루프에 크게 감명받지 않았고 평등이 확인되면 더 짧은 길을 찾기 위해 고심하고있었습니다. 여기에 몇 바이트를 줄일 공간이 있습니다.
구조체 CGContextFillRects
배열로 호출 하는 것은 두 개의 다른 값으로 두 번 CGRect
호출하는 것보다 저렴 CGContextFillRect
하므로 배열과 포인터로 몇 바이트를 절약합니다.
또한을 호출하지 않고 27 바이트를 저장 UIGraphicsEndImageContext()
합니다. 이것은 일반적으로 프로덕션 코드에서 "버그"이지만이 장난감 프로그램에는 필요하지 않습니다.
그림 물감:
UIColor
객체를 만들지 만 CGColor
각 픽셀에 불투명 한 유형을 작성해야하기 때문에 색상도 처리 하기가 어렵습니다. 임의의 색상을 만드는 가장 짧은 코드는 UIColor
생성자 를 사용 하고 CGColor
그로부터 얻는 것입니다 UIColor
. 흰색과 동일합니다. Cocoa Touch 대신 Cocoa 프레임 워크를 사용하는 경우을 사용하여 일부 바이트를 절약 할 수 CGColorGetConstantColor()
있지만 불행히도 Cocoa Touch SDK에서 해당 방법을 사용할 수 없습니다.
파일에 쓰기 :
파일에 쓰려면 거의 100 바이트가 걸립니다. 이것을 최적화하는 방법조차 확실하지 않습니다. 권한에 따라 일부 시스템에서는 더 긴 Documents 디렉토리를 사용해야 할 수도 있습니다.
UIImagePNGRepresentation(i)!.writeToURL(NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory,inDomains:.UserDomainMask).first!.URLByAppendingPathComponent("a.png"), atomically:true)
추가 최적화를 위해 확실히 개방하십시오.
편집 1 : 변수 선언을 재정렬하여 몇 바이트를 절약했습니다.