Swift 2.3, 593 585 octets
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)
Mise à jour
Swift 3, 551 octets
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")!)
Je suis à la WWDC et je viens de recevoir la version bêta de Xcode 8 avec Swift 3. Apple a fait certains des appels CoreGraphics plus "Swifty", et je suis en mesure de réduire le bytecount.
Code Swift 2 non golfé:
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)
Cette réponse suppose qu'UIKit est disponible et utilise le framework Cocoa Touch.
Quelques exemples d'images de sortie:
Je sais que je ne peux pas rivaliser avec la plupart des autres réponses, mais je voulais donner un coup de pouce à ce défi personnel. Il y a certainement matière à amélioration avec cette réponse, mais je pense qu'il sera difficile de descendre en dessous de quelques centaines d'octets en raison de la longueur des noms de méthode d'écriture d'image UIKit et CoreGraphics. J'ai choisi d'écrire un fichier PNG réel plutôt que des valeurs PPM comme exercice pour moi-même, mais des réponses plus courtes seraient certainement possibles si j'utilisais le format PPM.
Je commence déjà comme une perte en ayant à déclarer une variable à amorcer srand48
avec time
. J'ai choisi ça arc4random()
ouarc4random_uniform()
parce que finalement je perdrais plus d' octets avec ceux -ci . J'amorce le rng à utiliserdrand48
pour générer une couleur aléatoire et choisir quand écrire une couleur sur un pixel.
CGSize
vs CGSizeMake
etCGRect
vs CGRectMake
:
Je bascule entre les fonctions API C en ligne et leurs extensions Swift pour trouver le constructeur le plus court pour chacune. CGSizeMake
finit par être plus court que CGSize()
, et CGRect
finit par être plus court que 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)
Il faudrait que je crée CGFloat
sx
ety
raison de la nature de la boucle for. Je ne suis vraiment pas ravi de la boucle 2D et si l'égalité vérifie, mais j'avais vraiment du mal à trouver un moyen plus court. Il y a certainement de la place pour raser quelques octets ici.
Appeler CGContextFillRects
avec un tableau de CGRect
structures est moins cher que d'appelerCGContextFillRect
deux fois avec deux valeurs différentes, donc j'économise quelques octets avec le tableau et le pointeur.
J'économise également 27 octets en n'appelant pas UIGraphicsEndImageContext()
. Bien que ce soit normalement un "bug" dans le code de production, il n'est pas nécessaire pour ce programme de jouets.
Couleurs:
Les couleurs sont également difficiles à gérer, car je crée des UIColor
objets mais je dois écrire un CGColor
type opaque sur chaque pixel. Le code le plus court , j'ai trouvé pour créer une couleur au hasard était d'utiliser le UIColor
constructeur et obtenir le à CGColor
partir de ce UIColor
. Idem avec le blanc. Si j'utilisais le framework Cocoa au lieu de Cocoa Touch, je pourrais peut-être enregistrer quelques octets en utilisantCGColorGetConstantColor()
, mais malheureusement cette méthode n'est pas disponible dans le SDK Cocoa Touch.
Écrire dans un fichier:
L'écriture dans un fichier prend près de 100 octets. Je ne sais même pas comment procéder pour l'optimiser. Sur certains systèmes, selon vos autorisations, vous devrez peut-être utiliser le répertoire Documents qui serait encore plus long:
UIImagePNGRepresentation(i)!.writeToURL(NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory,inDomains:.UserDomainMask).first!.URLByAppendingPathComponent("a.png"), atomically:true)
Certainement ouvert à d'autres optimisations.
Édition 1: enregistré quelques octets en réorganisant certaines déclarations de variables.