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)
Atualizar
Swift 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")!)
Estou na WWDC e acabei de adquirir o Xcode 8 beta com o Swift 3. A Apple fez algumas das chamadas da CoreGraphics mais "Swifty" e posso reduzir o número de bytes.
Código 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)
Esta resposta assume que o UIKit está disponível e usa a estrutura do Cocoa Touch.
Alguns exemplos de imagens de saída:
Sei que não posso competir com a maioria das outras respostas, mas queria tentar isso como um desafio pessoal. Definitivamente, há espaço para melhorias com esta resposta, mas acho que será difícil obter isso abaixo de algumas centenas de bytes devido ao comprimento dos nomes dos métodos de escrita de imagem UIKit e CoreGraphics. Optei por escrever um arquivo PNG real em vez de valores PPM como um exercício para mim, mas respostas mais curtas definitivamente seriam possíveis se eu usasse o formato PPM.
Já começou como uma perda por ter de declarar uma variável a semente srand48
com time
. Eu escolhi isso arc4random()
ou arc4random_uniform()
porque, em última análise, eu perderia mais bytes com esses. Eu proponho o rng a ser usado drand48
para gerar uma cor aleatória e escolho quando escrever uma cor em um pixel.
CGSize
vs CGSizeMake
e CGRect
vs CGRectMake
:
Alterno entre as funções da API C em linha e suas extensões Swift para encontrar o construtor mais curto para cada uma. CGSizeMake
acaba sendo mais curto que CGSize()
, e CGRect
acaba sendo mais curto 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)
Eu teria que criar CGFloat
s x
e y
devido à natureza do loop for. Eu realmente não estou emocionado com o loop 2D e se a igualdade verifica, mas eu estava realmente lutando para encontrar um caminho mais curto. Definitivamente, há espaço para cortar alguns bytes aqui.
Telefonar CGContextFillRects
com uma matriz de CGRect
estruturas é mais barato do que telefonar CGContextFillRect
duas vezes com dois valores diferentes; portanto, economizo alguns bytes com a matriz e o ponteiro.
Também economizo 27 bytes por não ligar UIGraphicsEndImageContext()
. Embora isso normalmente seja um "bug" no código de produção, não é necessário para este programa de brinquedos.
Cores:
As cores também são difíceis de lidar, já que estou criando UIColor
objetos, mas preciso escrever um CGColor
tipo opaco para cada pixel. O código mais curto que encontrei para criar uma cor aleatória foi usar o UIColor
construtor e obter o resultado CGColor
disso UIColor
. Mesmo com branco. Se eu estivesse usando a estrutura do Cocoa em vez do Cocoa Touch, poderia salvar alguns bytes usando CGColorGetConstantColor()
, mas infelizmente esse método não está disponível no SDK do Cocoa Touch.
Escrevendo para o arquivo:
A gravação em um arquivo leva quase 100 bytes. Não sei ao certo como otimizar isso. Em alguns sistemas, dependendo de suas permissões, pode ser necessário usar o diretório Documents, que seria ainda mais longo:
UIImagePNGRepresentation(i)!.writeToURL(NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory,inDomains:.UserDomainMask).first!.URLByAppendingPathComponent("a.png"), atomically:true)
Definitivamente aberto a novas otimizações.
Editar 1: salvou alguns bytes reorganizando algumas declarações de variáveis.