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)
Aggiornare
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")!)
Sono al WWDC e ho appena ricevuto l'Xcode 8 beta con Swift 3. Apple ha fatto alcune delle chiamate CoreGraphics più "Swifty" e sono in grado di ridurre il numero di byte.
Codice Swift 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)
Questa risposta presuppone che UIKit sia disponibile e utilizzi il framework Cocoa Touch.
Alcuni esempi di immagini di output:
So di non poter competere con la maggior parte delle altre risposte, ma volevo provarlo come una sfida personale. C'è sicuramente spazio per miglioramenti con questa risposta, ma penso che sarà difficile scendere sotto alcune centinaia di byte a causa della lunghezza dei nomi dei metodi di scrittura delle immagini UIKit e CoreGraphics. Ho scelto di scrivere un vero file PNG anziché i valori PPM come esercizio per me stesso, ma se avessi usato il formato PPM sarebbero state possibili risposte più brevi.
Ho già iniziano come una perdita dal dover dichiarare una variabile alle sementi srand48
con time
. Ho scelto questo arc4random()
o arc4random_uniform()
perché alla fine perderei più byte con quelli. Semino l'Rng da usare drand48
per generare un colore casuale e scelgo quando scrivere un colore su un pixel.
CGSize
vs CGSizeMake
e CGRect
vs CGRectMake
:
Passo tra le funzioni API C incorporate e le loro estensioni Swift per trovare il costruttore più corto per ognuna. CGSizeMake
finisce per essere più corto di CGSize()
e CGRect
finisce per essere più corto di 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)
Avrei dovuto creare CGFloat
s x
ed y
a causa della natura del ciclo for. Non sono davvero entusiasta del loop 2D e se l'uguaglianza controlla, ma stavo davvero lottando per trovare un modo più breve. C'è sicuramente spazio per radere qualche byte qui.
Chiamare CGContextFillRects
con una matrice di CGRect
strutture è più economico che chiamare CGContextFillRect
due volte con due valori diversi, quindi salvo qualche byte con la matrice e il puntatore.
Inoltre salvo 27 byte non chiamando UIGraphicsEndImageContext()
. Mentre questo sarebbe normalmente un "bug" nel codice di produzione, non è necessario per questo programma giocattolo.
Colori:
Anche i colori sono un problema da affrontare, dal momento che sto creando UIColor
oggetti ma devo scrivere un CGColor
tipo opaco su ogni pixel. Il codice più corto che ho trovato per creare un colore a caso è stato quello di utilizzare il UIColor
costruttore e ottenere il CGColor
da quella UIColor
. Lo stesso vale per il bianco. Se stavo usando il framework Cocoa anziché Cocoa Touch, potrei essere in grado di salvare alcuni byte utilizzando CGColorGetConstantColor()
, ma sfortunatamente quel metodo non è disponibile in Cocoa Touch SDK.
Scrivere su un file:
La scrittura su un file richiede quasi 100 byte. Non sono sicuro di come fare per ottimizzare questo. Su alcuni sistemi a seconda delle tue autorizzazioni, potresti dover utilizzare la directory Documents che sarebbe ancora più lunga:
UIImagePNGRepresentation(i)!.writeToURL(NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory,inDomains:.UserDomainMask).first!.URLByAppendingPathComponent("a.png"), atomically:true)
Sicuramente aperto a ulteriori ottimizzazioni.
Modifica 1: salvato alcuni byte riorganizzando alcune dichiarazioni di variabili.