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)
Aktualisieren
Schnelle 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")!)
Ich bin bei WWDC und habe gerade die Xcode 8 Beta mit Swift 3 erhalten. Apple hat einige der CoreGraphics-Aufrufe "schneller" gemacht, und ich bin in der Lage, den Bytecount zu reduzieren.
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)
Diese Antwort setzt voraus, dass UIKit verfügbar ist und das Cocoa Touch-Framework verwendet.
Einige beispielhafte Ausgabebilder:
Ich weiß, dass ich mit den meisten anderen Antworten nicht mithalten kann, aber ich wollte dies als persönliche Herausforderung versuchen. Es gibt definitiv Raum für Verbesserungen mit dieser Antwort, aber ich denke, es wird schwierig sein, dies unter ein paar hundert Bytes zu bringen, aufgrund der Länge der Namen der UIKit- und CoreGraphics-Bildschreibmethoden. Ich habe mich entschieden, eine tatsächliche PNG-Datei anstelle von PPM-Werten als Übung für mich zu schreiben, aber kürzere Antworten wären definitiv möglich, wenn ich das PPM-Format verwenden würde.
Ich beginne bereits als Verlust, indem ich eine Variable deklarieren muss, mit der gesät srand48
werden soll time
. Ich habe dies vorgezogen arc4random()
oder arc4random_uniform()
weil ich damit letztendlich mehr Bytes verlieren würde. Ich setze den Befehl ein, drand48
um eine zufällige Farbe zu erzeugen, und wähle aus, wann eine Farbe in ein Pixel geschrieben werden soll.
CGSize
vs CGSizeMake
und CGRect
vs CGRectMake
:
Ich wechsle zwischen den Inline-C-API-Funktionen und ihren Swift-Erweiterungen, um den jeweils kürzesten Konstruktor zu finden. CGSizeMake
am Ende kürzer als CGSize()
und CGRect
am Ende kürzer als 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)
Ich müsste CGFloat
s x
und y
aufgrund der Art der for-Schleife erstellen . Ich bin wirklich nicht begeistert von der 2D-Schleife und den Gleichheitsprüfungen, aber ich hatte wirklich Mühe, einen kürzeren Weg zu finden. Hier ist definitiv Platz für ein paar Bytes.
Das Aufrufen CGContextFillRects
mit einem Array von CGRect
Strukturen ist billiger als das CGContextFillRect
zweimalige Aufrufen mit zwei verschiedenen Werten. Daher spare ich mit dem Array und dem Zeiger ein paar Bytes.
Ich spare auch 27 Bytes, indem ich nicht anrufe UIGraphicsEndImageContext()
. Während dies normalerweise ein "Fehler" im Produktionscode ist, ist dies für dieses Spielzeugprogramm nicht erforderlich.
Farben:
Farben sind auch ein Problem, da ich UIColor
Objekte erstelle , aber CGColor
für jedes Pixel einen undurchsichtigen Typ schreiben muss . Der kürzeste Code, den ich zum Erstellen einer zufälligen Farbe gefunden habe, bestand darin, den UIColor
Konstruktor zu verwenden und den CGColor
daraus zu erhalten UIColor
. Das gleiche gilt für Weiß. Wenn ich das Cocoa-Framework anstelle von Cocoa Touch verwende, kann ich möglicherweise einige Bytes mithilfe von speichern. CGColorGetConstantColor()
Leider ist diese Methode im Cocoa Touch-SDK nicht verfügbar.
Schreiben in die Datei:
Das Schreiben in eine Datei dauert fast 100 Bytes. Ich bin mir nicht sicher, wie ich das überhaupt optimieren soll. Abhängig von Ihren Berechtigungen müssen Sie auf einigen Systemen möglicherweise das Dokumentverzeichnis verwenden, das noch länger ist:
UIImagePNGRepresentation(i)!.writeToURL(NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory,inDomains:.UserDomainMask).first!.URLByAppendingPathComponent("a.png"), atomically:true)
Auf jeden Fall offen für weitere Optimierungen.
Edit 1: Speichert ein paar Bytes, indem einige Variablendeklarationen neu angeordnet werden.