Swift 2.3, 593 585 bajtów
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)
Aktualizacja
Swift 3, 551 bajtów
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")!)
Jestem w WWDC i właśnie dostałem Xcode 8 w wersji beta z Swift 3. Apple wykonało niektóre z połączeń CoreGraphics bardziej „Swifty” i jestem w stanie zmniejszyć liczbę bajtów.
Kod 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)
Ta odpowiedź zakłada, że UIKit jest dostępny i korzysta ze struktury Cocoa Touch.
Niektóre przykładowe obrazy wyjściowe:
Wiem, że nie mogę konkurować z większością innych odpowiedzi, ale chciałem dać temu szansę jako osobiste wyzwanie. Ta odpowiedź zdecydowanie wymaga poprawy, ale myślę, że trudno będzie obniżyć ją poniżej kilkuset bajtów ze względu na długość nazw metod zapisu obrazów UIKit i CoreGraphics. Jako ćwiczenie dla siebie zdecydowałem się napisać rzeczywisty plik PNG zamiast wartości PPM, ale zdecydowanie krótsze odpowiedzi byłyby możliwe, gdybym użył formatu PPM.
I już zaczynają jako straty poprzez zadeklarować zmienną do materiału siewnego srand48
z time
. Wybrałem to ponad arc4random()
lub arc4random_uniform()
ponieważ ostatecznie stracę z nimi więcej bajtów. Rozstawiam rng, aby użyć drand48
do wygenerowania losowego koloru i wybieram, kiedy napisać kolor na piksel.
CGSize
vs CGSizeMake
i CGRect
vs CGRectMake
:
Przełączam się między wbudowanymi funkcjami API C i ich rozszerzeniami Swift, aby znaleźć najkrótszy konstruktor dla każdej z nich. CGSizeMake
kończy się na niższym niż CGSize()
i CGRect
kończy się na 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)
Musiałbym stworzyć CGFloat
s x
i y
ze względu na naturę pętli for. Naprawdę nie jestem zachwycony pętlą 2D i sprawdzaniem równości, ale naprawdę starałem się znaleźć krótszą drogę. Zdecydowanie jest tu miejsce na ogolenie kilku bajtów.
Wywoływanie CGContextFillRects
za pomocą tablicy CGRect
struktur jest tańsze niż wywoływanie CGContextFillRect
dwukrotnie przy użyciu dwóch różnych wartości, więc zapisuję kilka bajtów za pomocą tablicy i wskaźnika.
Zapisuję również 27 bajtów, nie dzwoniąc UIGraphicsEndImageContext()
. Chociaż normalnie byłby to „błąd” w kodzie produkcyjnym, nie jest to konieczne w przypadku tego programu zabawkowego.
Zabarwienie:
Kolory są również trudnym problemem, ponieważ tworzę UIColor
obiekty, ale muszę pisać CGColor
nieprzejrzysty typ dla każdego piksela. Najkrótszym kodem, który znalazłem, aby stworzyć losowy kolor, było użycie UIColor
konstruktora i uzyskanie CGColor
tegoUIColor
. To samo z białym. Gdybym używał frameworka Cocoa zamiast Cocoa Touch, mógłbym być w stanie zapisać niektóre bajty CGColorGetConstantColor()
, ale niestety ta metoda jest niedostępna w Cocoa Touch SDK.
Zapis do pliku:
Zapis do pliku zajmuje prawie 100 bajtów. Nie jestem pewien, jak nawet zoptymalizować to. W niektórych systemach, w zależności od twoich uprawnień, może być konieczne użycie katalogu Dokumenty, który byłby jeszcze dłuższy:
UIImagePNGRepresentation(i)!.writeToURL(NSFileManager.defaultManager().URLsForDirectory(.DocumentDirectory,inDomains:.UserDomainMask).first!.URLByAppendingPathComponent("a.png"), atomically:true)
Zdecydowanie otwarty na dalsze optymalizacje.
Edycja 1: Zapisano kilka bajtów, przestawiając niektóre deklaracje zmiennych.