Kolory w naszych gwiazdach

90

Napisz program, który pobiera ciąg lub plik tekstowy, którego pierwszy wiersz ma postać

width height

a każda kolejna linia ma formę

x y intensity red green blue

gdzie:

  • widthi heightmogą być dodatnimi liczbami całkowitymi.
  • xi ymogą być dowolnymi liczbami całkowitymi.
  • intensity może być dowolną liczbą całkowitą nieujemną.
  • red, greeni bluemogą być dowolnymi liczbami całkowitymi od 0 do 255 włącznie.

Twój program musi wyprowadzić obraz truecolor w dowolnym popularnym bezstratnym formacie pliku obrazu, którego wymiary są widthzgodne height. Każda x y intensity red green bluelinia reprezentuje kolorową gwiazdę lub kulę, którą należy narysować na obrazie. Można narysować dowolną liczbę gwiazdek, w tym 0. Możesz założyć, że ciąg lub plik ma nową linię końcową.

Algorytm rysowania obrazu jest następujący, ale możesz go zaimplementować w dowolny sposób, o ile wynik jest identyczny:

Dla każdego piksela ( X , Y ) na obrazie (gdzie X to 0 przy skrajnej lewej krawędzi i szerokość-1 przy skrajnej prawej krawędzi, a Y to 0 przy górnej krawędzi i wysokość-1 przy dolnej krawędzi), kanał koloru C ϵ { czerwony , zielony , niebieski } (wartość przypięta od 0 do 255) jest podane równaniem:

równanie kanału koloru

Gdzie funkcją dist jest albo odległość euklidesowa :

Euklidesowe równanie odległości

Lub odległość na Manhattanie :

Równanie odległości Manhattanu

Wybierz dowolną funkcję odległości, którą preferujesz, w oparciu o możliwości gry w golfa lub estetykę.

Każda z linii na wejściu oprócz pierwszej jest elementem zestawu Gwiazdy . Tak więc, na przykład, S x oznacza xwartość na jednej z linii wejściowych i S, C oznacza albo red, greenalbo blue, w zależności od aktualnie kanału koloru obliczana.

Przykłady

Przykład A

Jeśli dane wejściowe to

400 150
-10 30 100 255 128 0

wyjście powinno być

Przykład A, euklides

jeśli używasz odległości euklidesowej, i

Przykład A, Manhattan

jeśli korzystasz z odległości Manhattan.

Przykład B

Jeśli dane wejściowe to

200 200
100 100 10 255 255 255
20 20 40 255 0 0
180 20 40 255 255 0
180 180 40 0 255 0
20 180 40 0 0 255

odpowiednie wartości wyjściowe dla odległości euklidesowej i Manhattanu powinny wynosić

Przykład B, euklidesa Przykład B, Manhattan.

Przykład C

Jeśli dane wejściowe to

400 400
123 231 10 206 119 85
358 316 27 170 47 99
95 317 3 202 42 78
251 269 17 142 150 153
43 120 3 145 75 61
109 376 6 230 231 52
331 78 21 31 81 126
150 330 21 8 142 23
69 155 11 142 251 199
218 335 7 183 248 241
204 237 13 112 253 34
342 89 18 140 11 123

wyjście powinno być

Przykład C, euklides

jeśli używasz odległości euklidesowej, i

Przykład C, Manhattan

jeśli korzystasz z odległości Manhattan.

Przykład D

Jeśli dane wejściowe to

400 400
123 231 5 206 119 85
358 316 5 170 47 99
95 317 5 202 42 78
251 269 5 142 150 153
43 120 5 145 75 61
109 376 5 230 231 52
331 78 5 31 81 126
150 330 5 8 142 23
69 155 5 142 251 199
218 335 5 183 248 241
204 237 5 112 253 34
342 89 5 140 11 123

wyjście powinno być

Przykład D, euklides

jeśli używasz odległości euklidesowej, i

Przykład D, Manhattan

jeśli korzystasz z odległości Manhattan.

Przykład E

Jeśli dane wejściowe to

100 1

wtedy wyjście powinno być obrazem o szerokości 100 pikseli na 1 piksel, który jest całkowicie czarny.

Uwagi

  • Weź ciąg wejściowy lub nazwę pliku tekstowego, który go zawiera ze standardowego wiersza poleceń lub wiersza poleceń, albo możesz napisać funkcję, która przyjmuje ciąg znaków.
  • „Przesyłanie” obrazu oznacza albo:
    • Zapisywanie go do pliku o wybranej nazwie.
    • Drukowanie danych surowego pliku obrazu na standardowe wyjście.
    • Wyświetlanie obrazu, takie jak z PIL „s image.show().
  • Nie będę sprawdzać, czy twoje obrazy są idealnie w pikselach (Stack Exchange i tak kompresuje stratnie obrazy), ale będę bardzo podejrzliwy, jeśli mogę wizualnie odróżnić.
  • Możesz używać bibliotek graficznych / obrazkowych.

Zwycięski

Najkrótsze przesłanie w bajtach wygrywa. W przypadku remisu wygrywa najwcześniejsze zgłoszenie.

Zabawna premia: daj wejściowy obraz, aby uzyskać naprawdę spektakularny obraz wyjściowy.

Hobby Calvina
źródło
38
+1 Wow. To jest cudowne. (I odpowiedni czas na publikację, ponieważ słyszymy wieści ze zdrowego statku kosmicznego Nowe Horyzonty!)
BrainSteel
Czy dane wejściowe muszą być w formacie rozdzielonym spacjami, czy może być oddzielone przecinkami? W każdym razie +1.
Maltysen
1
@Maltysen Spacja oddzielona. (Wiem, że to skąpe, ale jest to łatwiejsze niż dopuszczenie kilkunastu wariantów wprowadzania.)
Hobby Calvina,
4
Nie mogę zdecydować, czy kule lub gwiazdy są piękniejsze.
trichoplax
Aby uzyskać piksele, możesz porównać skrót mapy bitowej
Tobias Kienzler

Odpowiedzi:

26

Pyth - 46 bajtów

To była zabawa! W końcu mogłem użyć funkcji We / Wy obrazu Pytha. Czy odległość euklidesowa z powodu golfa, choć Manhattan to tylko krótka zmiana.

Krz7.wcmmsm/*@[email protected],<b2_.DdhKrR7.zU3*FKhK

To po prostu zapętla wszystkie piksele z formuły, chociaż skrapla pętlę pikseli w jedną pętlę i wykorzystuje, divmodponieważ Pyth obsługuje tylko 3 zagnieżdżone mapy, a obliczenia zajmują dwa (jeden dla RGB i jeden dla gwiazd).

Zapisuje obraz jako o.png. Dość powoli, pierwsze 2 testy trwają mniej niż 2 minuty, ale pozostałe 2 trwają pół godziny.

Jest błąd w .wtym, że nikt tego nie zauważył, bo nikt go nie używa;) Ale wysłałem żądanie ściągnięcia, więc użyj mojego rozwidlenia, aby sprawdzić, czy nie zostanie wkrótce połączone. Scalono!

Przykłady wyników

Przykład A

Przykład A

Przykład B

Przykład B

Przykład C

Przykład C

Przykład D

Przykład D

Maltysen
źródło
7
Wow, nie wiedziałem, że Pyth może to zrobić. Pewnego dnia możemy skończyć pisać oprogramowanie biznesowe w Pyth. Jest mniej kodu do napisania, więc refaktoryzacja powinna być szybsza i łatwiejsza. : D
Cristian Lupascu
7
@ w0lf „czas programisty jest ważniejszy niż czas wykonania” i wszyscy wiemy, że Pyth pomaga skrócić czas programisty :) Obraz I / O został dodany niedawno po tym, jak Pyth został pominięty w graficznym wyzwaniu wyjściowym. Używa Pillow wewnętrznie.
Maltysen
11
@Nit Absolutnie. Nie ma to również nic wspólnego z szybkością pisania. Mój poprzedni komentarz był żartem.
Cristian Lupascu,
2
Zapomnieliście o jednej ważnej rzeczy - łatwiej też debugować, ponieważ kod jest mniejszy;)
Optymalizator
14
Skracając czas programisty masz na myśli: „Grają w golfa w Pythona, a więc mają mniej czasu na pisanie„ prawdziwego ”kodu?
42

JavaScript 394 344

function X(a){for(l=a.match(/\d+/g),h=document,v=h.body.appendChild(h.createElement("canvas")),v.width=W=l[0],v.height=H=l[1],w=v.getContext("2d"),e=w.createImageData(W,H),d=e.data,N=W*H;N--;)for(i=2,c=N*4,d[c+3]=255;i<l.length;)for(x=N%W-l[i++],y=~~(N/W)-l[i++],k=l[i++],q=0;q<3;)d[c+q++]+=k*l[i++]/-~Math.sqrt(x*x+y*y);w.putImageData(e,0,0);}

Edycja: znacznie skróciłem kod, stosując niesamowite sugestie wolfhammera .

Test

Uwaga: Zaczekaj kilka sekund, aż poniższy fragment się wyrenderuje (zajmuje to około 4 sekund na moim komputerze).

Możesz także uruchomić go w JSFiddle .

Bonus: Niebieskie Zaćmienie

function X(a){for(l=a.match(/\d+/g),h=document,v=h.body.appendChild(h.createElement("canvas")),v.width=W=l[0],v.height=H=l[1],w=v.getContext("2d"),e=w.createImageData(W,H),d=e.data,N=W*H;N--;)for(i=2,c=N*4,d[c+3]=255;i<l.length;)for(x=N%W-l[i++],y=~~(N/W)-l[i++],k=l[i++],q=0;q<3;)d[c+q++]+=k*l[i++]/-~Math.sqrt(x*x+y*y);w.putImageData(e,0,0);}

var j = 0;
var renderFrame = function () {
  if(window.h && window.v){h.body.removeChild(v);} // clear prev frame
  X("225 150\n" +
    (70 + j) + " " + (120 - j) + " 170 135 56 0\n" + 
    j * 5 + " " + j * 3 + " 64 0 50 205");       
  if(++j < 50) { setTimeout(renderFrame, 1); } else { console.log('done!'); }
};
setTimeout(renderFrame, 10);

Możesz także uruchomić go w JSFiddle .

Opis

Jest to prosta implementacja kanwy JavaScript + HTML5: funkcja, która pobiera argument ciągu (bez spacji / znaków nowej linii) i wyświetla dane wyjściowe w DOM. Wykorzystuje odległość euklidesową.

Oto czytelny kod:

X = function (str) {
  var lines = str.split("\n");  
  var canvas = document.createElement('canvas');
  var z = lines[0].split(u=' ');
  var width = z[0], height = z[1];

  canvas.width = width;
  canvas.height = height;
  document.body.appendChild(canvas);

  var ctx = canvas.getContext("2d");
  var imageData = ctx.createImageData(width, height);

  for(var y = 0; y < height; y++){
    for(var x=0; x < width; x++){
      var coord = (y * width + x) * 4;

      for(i=1; i < lines.length;i++){
        var t = lines[i].split(u);

        var 
          dx = x - t[0], 
          dy = y - t[1];

        var distance = Math.sqrt(dx * dx + dy * dy);

        for(var channel = 0; channel < 3; channel++) {
          var channelIndex = coord + channel;
          imageData.data[channelIndex] += t[2] * t[3 + channel] / (distance + 1);
        }
      }

      var alphaIndex = coord + 3;
      imageData.data[alphaIndex] = 255;
    }
  }

  ctx.putImageData(imageData, 0, 0);
};
Cristian Lupascu
źródło
Uwielbiam to, jak halo sklejone razem w Blue Eclipse, czy możesz dodać styl manhatana?
PTwr
1
@PTwr Pewnie, oto: jsfiddle.net/pjLnazw1
Cristian Lupascu
Niesamowite! (
Zostanie
@ w0lf Możesz zmniejszyć liczbę bajtów swojej funkcji, łącząc iteratory xiy. jsfiddle
wolfhammer
@wolfhammer Wow, to teraz tylko „niektóre bajty”, to wiele ulepszeń. Przyjrzę się temu później, ponieważ uważam, że jest coś do naprawienia w indeksowaniu (w przypadku przykładowych obrazów 2, 3 i 4 piksele po lewej wydają się owijać). Dzięki!
Cristian Lupascu,
26

Java - 627 bajtów

Java jest rzeczywiście jednym z najlepszych języków golfowych :)

import java.awt.image.*;class M{void f(String n)throws Exception{String[]p=n.split("\n");int[]b=s(p[0]);BufferedImage o=new BufferedImage(b[0],b[1],2);for(int i=0;i<b[0];i++)for(int j=0;j<b[1];j++){int[]c=new int[3];for(int l=1;l<p.length;l++){int[]r=s(p[l]);for(int k=0;k<3;k++){c[k]+=r[2]*r[3+k]/(Math.sqrt(Math.pow(i-r[0],2)+Math.pow(j-r[1],2))+1);if(c[k]>255)c[k]=255;}}o.setRGB(i,j,new java.awt.Color(c[0],c[1],c[2]).getRGB());}javax.imageio.ImageIO.write(o,"png",new java.io.File("o.png"));}int[]s(String s){String[]a=s.split(" ");int[]r=new int[a.length];for(int i=0;i<a.length;i++)r[i]=Integer.valueOf(a[i]);return r;}}

Korzystając z danych wejściowych poniżej, możesz stworzyć nieco realistyczny model naszego Układu Słonecznego (wielkość niektórych planet jest nieprawidłowa, ale odległość między nimi powinna być dokładna). Próbowałem nadać pierścienie saturnowi, ale to nie zadziałało ... Źródło

1950 50
-15 25 25 255 255 0
39 25 1 255 0 0
55 25 3 255 140 0
68 25 4 0 191 255
92 25 2 255 0 0
269 ​​25 10 245 222 179
475 25 7 245 245 220
942 25 6 0 250 150
1464 25 6 0 0 255
1920 25 1 255 245 238

Układ słoneczny z plutonem

Obraz Full HD , który nie wygląda świetnie ... Byłby szczęśliwy, gdyby ktoś mógł go poprawić!

CommonGuy
źródło
15
+1 dla Układu Słonecznego. -1 za opuszczenie Plutona (teraz, kiedy znamy nawet jego prawdziwy kolor i rozmiar)
Optymalizator
1
Byłoby też naprawdę miło, gdyby połączono pełną tapetę 1080p :)
Optymalizator
@Optimizer dodałem pluto;) Zobaczmy, co mogę zrobić z tapetą
CommonGuy
1
@ Sp3000 Ups, zapomniałem intensywności, gdy dodałem
plutona
2
Zauważ, że Saturn nie jest jedyną planetą z pierścieniami. Jeśli sprawisz, że pierścienie zadziałają, powinieneś również dodać je do Urana.
mbomb007
20

Bash, 147 145 bajtów

ImageMagick służy do manipulowania obrazami. Stosowana jest odległość euklidesowa.

read w h
o=o.png
convert -size $w\x$h canvas:black $o
while read x y i r g b
do
convert $o -fx "u+$i*rgb($r,$g,$b)/(hypot(i-$x,j-$y)+1)" $o
done
SteelRaven
źródło
Możesz zapisać bajt za pomocą $w\x$h.
deltab
... i jeszcze jeden z o=o.png.
deltab
16

Python 3, 189 bajtów

Nie mam pojęcia o golfistach-ekspertach, ale proszę bardzo.

  • Dane wejściowe pochodzą stdini są przekazywane stdoutw formacie PPM .
  • Uruchom tak: python3 codegolf_stars_golfed.py < starfield.txt > starfield.pnm

Po pierwsze, odległość na Manhattanie:

import sys
(w,h),*S=[list(map(int,l.split()))for l in sys.stdin]
print('P3',w,h,255,*(min(int(sum((I*C[z%3]/(abs(X-z//3%h)+abs(Y-z//3//h)+1))for
X,Y,I,*C in S)),255)for z in range(h*w*3)))

Po drugie, odległość euklidesowa:

import sys
(w,h),*S=[list(map(int,l.split()))for l in sys.stdin]
print('P3',w,h,255,*(min(int(sum((I*C[z%3]/(abs(X-z//3%h+(Y-z//3//h)*1j)+1))for
X,Y,I,*C in S)),255)for z in range(h*w*3)))

Mógłbym zaoszczędzić cztery bajty, stosując zamiast tego dzielenie liczb całkowitych int(), i faktycznie wydaje się, że tak właśnie wyglądają oryginalne obrazy - ledwo dostrzegasz niektóre prążki na ciemnych obrzeżach blasku gwiazdy, które nie są obecne w ścisłej poprawności kod. W obecnej postaci ten kod jest zgodny z opisem, a nie z obrazkami.

Wersja bez golfa i moje oryginalne gry w golfa przed wieloma optymalizacjami, które inni zauważyli lub na których natknąłem się, są w tym sensie .

EDIT: Uratowałem 7 bajtów przesuwając for xi for ydo jednego print(lub ofunkcji), ale ta produkuje PNM pliku o bardzo długiej linii, które mogą lub nie mogą powodować pewne problemy.

EDYCJA 2: Maltysen zaoszczędził mi kolejne 20 bajtów. Dzięki!

EDYCJA ponownie: Teraz, gdy jest tylko jeden print, oalias jest zobowiązaniem, a nie oszczędnością. Jeszcze 4 bajty mniej.

EDYTUJ trochę więcej: Sp3000 zaoszczędził mi jeszcze 2 bajty. Tymczasem aliasing mapdo mniczego nie zapisywał, więc w trosce o czytelność (!) Ponownie go rozwinąłem. Teraz jest ładna okrągła 2 8 bajtów.

EDYCJA ostatniego (?): Teraz z obsługą odległości euklidesowych - i nadużywając liczb zespolonych, zrobiłem to dokładnie w tej samej liczbie bajtów!

EDIT, restart Hollywood: kolejna sugestia Sp3000 straciła 5 bajtów.

EDYCJA, głupio nazwana kontynuacja: obcięte 6 bajtów, dzięki sugestii Maltysen, że nie zrozumiałem, dopóki Sp3000 go nie powtórzy ... potem kolejne 8 bajtów od %nadużycia. A mówienie o tym na czacie wywołało fenomenalne zjawisko2126 bajtów. Jestem upokorzony.

Tim Pederick
źródło
@Maltysen: Całkiem słusznie. 20 bajtów zapisanych!
Tim Pederick
jeszcze więcej: zamiast tych skomplikowanych rzeczy sys.stdin z EOFs można użyć iter()wartości wartowników: docs.python.org/2/library/functions.html#iter as iter(raw_input,''), także umieścić w,h,Stę samą linię z rozszerzonym rozpakowywaniem.
Maltysen
@Maltysen: Nie jestem pewien, czy to zadziała. Robiłem już prawie dokładnie to, ale trafia EOFError(i dlatego potrzebowałem trybloku), ponieważ w pliku wejściowym nie ma pustej linii i nie jestem pewien, czy wyzwanie pozwala mi go dodać. A może coś mi brakuje?
Tim Pederick
Myślę, że jeśli jesteś wartą wartosci wartownika, możesz po prostu zakończyć pustą linię w porównaniu z wprowadzeniem pliku, jednak tak, plik nie działałby.
Maltysen
@ Sp3000: Zaskakujące, tak! Spodziewałem się, że narzeka, że stdinto nie był iterator.
Tim Pederick
10

C ++, 272 bajty

#include<png.hpp>
#define G(a)i>>C;for(x=0;x<w*h;++x){auto&p=img[x%h][x/h];c=p.a+I*C/(abs(x/h-X)+abs(x%h-Y)+1);p.a=c>255?255:c;}
auto&i=std::cin;main(){int w,h,x,X,Y,I,c,C;i>>w>>h;png::image<png::rgb_pixel>img(w,h);while(i>>X>>Y>>I){G(red)G(green)G(blue)}img.write("a");}

Potrzebuje łagodnego kompilatora C ++ 11 (GCC 4.9.2 jest tylko trochę niezadowolony) oraz biblioteki png ++ , która sama w sobie wymaga libpng. Wykorzystana odległość Manhattanu. Pobiera dane wejściowe stdin, dane wyjściowe do pliku o nazwie „a” w bieżącym katalogu w formacie PNG.

Przykład D:

wprowadź opis zdjęcia tutaj


wprowadź opis zdjęcia tutaj


wprowadź opis zdjęcia tutaj

Mata
źródło
1
Podoba mi się PCGobraz :) (Chociaż PPCGjest to mój ulubiony skrót;))
Hobby Calvina
8

Python 2, 240 232 228 bajtów

from PIL.Image import*
def f(S):
 L=map(int,S.split());t=a,b=L[:2];I=new("RGB",t)
 for k in range(a*b):I.load()[k/a,k%a]=tuple(sum(x[2]*x[c]/(abs(x[0]-k/a)-~abs(x[1]-k%a))for x in zip(*[iter(L[2:])]*6))for c in(3,4,5))
 I.show()

Wykorzystuje odległość na Manhattanie. Prawdopodobnie byłoby to jeszcze krótsze w Pythonie 3, ale ostatnio zepsułem swoje pakiety Pythona i mam problem z ponowną instalacją Pillow. PPM prawdopodobnie byłby jeszcze krótszy, ale lubię PIL.

Dla zabawy próbowałem zastosować algorytm taki jak w przestrzeni kolorów L * a * b * , myśląc, że dałoby to lepsze mieszanie kolorów (szczególnie w przykładzie B). Niestety algorytm Calvina pozwala kanałom przekroczyć ich maksymalne wartości, co sprawia, że ​​obrazy wyglądają trochę mniej niesamowicie niż się spodziewałem ...

wprowadź opis zdjęcia tutaj

Sp3000
źródło
6

Mathematica, 146 bajtów

Image@Table[Total[#3{##4}/255&@@@{##2}/(1+#~ManhattanDistance~{x,y}&/@({#1,#2}&@@@{##2}))],{y,0,Last@#-1},{x,0,#&@@#-1}]&@@#~ImportString~"Table"&

Czysta funkcja pobierająca ciąg znaków. Aby uruchomić go w rozsądnym czasie, zamień 1w 1+#~ManhattanDistance...na 1.; wymusza to obliczenia numeryczne zamiast symbolicznych.

Nie golfowany:

Image[
    Table[
        Total[
        (#3 * {##4} / 255 & @@@ {##2})
            / (1 + ManhattanDistance[#, {x, y}]& /@ ({#1, #2}& @@@ {##2}) )
        ], {y, 0, Last[#]-1}, {x, 0, First[#]-1}
    ] (* Header is #, data is {##2} *)
]& @@ ImportString[#, "Table"]&
jcai
źródło
6

Python 2, 287 251 bajtów

Golfowa wersja oryginalnego kodu, którego użyłam do wygenerowania obrazów. Prawdopodobnie można by trochę bardziej zagrać w golfa (przez lepszego golfistę niż ja). Jest to funkcja, która pobiera pełny ciąg wejściowy. Przetwarzanie obrazu odbywa się z PIL jest moduł obrazujący . Wykorzystuje odległość na Manhattanie.

from PIL import Image
def S(I,r=range):
 I=map(int,I.split());w,h=I[:2];M=Image.new('RGB',(w,h));P=M.load()
 for z in r(w*h):
  P[z%w,z/w]=tuple(int(sum(I[i+2]*I[i+j+3]/(1.+abs(I[i]-z%w)+abs(I[i+1]-z/w))for i in r(2,len(I),6)))for j in r(3))
 M.show()

Korzystanie z odległości euklidesowej jest o 5 bajtów dłuższe (256 bajtów):

from PIL import Image
def O(I,r=range):
 I=map(int,I.split());w,h=I[:2];M=Image.new('RGB',(w,h));P=M.load()
 for z in r(w*h):
  P[z%w,z/w]=tuple(int(sum(I[i+2]*I[i+j+3]/(1+((I[i]-z%w)**2+(I[i+1]-z/w)**2)**.5)for i in r(2,len(I),6)))for j in r(3))
 M.show()

Oto kompletny zestaw testów z przykładami od A do E z pytania dla obu wskaźników odległości:

from PIL import Image
def S(I,r=range):
 I=map(int,I.split());w,h=I[:2];M=Image.new('RGB',(w,h));P=M.load()
 for z in r(w*h):
  P[z%w,z/w]=tuple(int(sum(I[i+2]*I[i+j+3]/(1.+abs(I[i]-z%w)+abs(I[i+1]-z/w))for i in r(2,len(I),6)))for j in r(3))
 M.show()

def O(I,r=range):
 I=map(int,I.split());w,h=I[:2];M=Image.new('RGB',(w,h));P=M.load()
 for z in r(w*h):
  P[z%w,z/w]=tuple(int(sum(I[i+2]*I[i+j+3]/(1+((I[i]-z%w)**2+(I[i+1]-z/w)**2)**.5)for i in r(2,len(I),6)))for j in r(3))
 M.show()

A = """400 150
-10 30 100 255 128 0"""
B = """200 200
100 100 10 255 255 255
20 20 40 255 0 0
180 20 40 255 255 0
180 180 40 0 255 0
20 180 40 0 0 255"""
C = """400 400
123 231 10 206 119 85
358 316 27 170 47 99
95 317 3 202 42 78
251 269 17 142 150 153
43 120 3 145 75 61
109 376 6 230 231 52
331 78 21 31 81 126
150 330 21 8 142 23
69 155 11 142 251 199
218 335 7 183 248 241
204 237 13 112 253 34
342 89 18 140 11 123"""
D = """400 400
123 231 5 206 119 85
358 316 5 170 47 99
95 317 5 202 42 78
251 269 5 142 150 153
43 120 5 145 75 61
109 376 5 230 231 52
331 78 5 31 81 126
150 330 5 8 142 23
69 155 5 142 251 199
218 335 5 183 248 241
204 237 5 112 253 34
342 89 5 140 11 123"""
E = """100 1"""
for i in (A, B, C, D, E):
    S(i) #S for Star
    O(i) #O for Orb

Wszystkie wyglądają nie do odróżnienia. Większe mogą potrwać kilka sekund.

Hobby Calvina
źródło
Wierzę, że możesz zaoszczędzić kilka bajtów, zmieniając for x in r(I[0]):...for y in r(I[1]):je, zmieniając na for x in r(I[0]*I[1]):. Następnie można wziąć każdy poziom wcięcia w dół o 1, i wymienić xz x/I[1]i yz y%I[1].
Kade
Możesz zapisać 5 bajtów, zastępując from PIL import Imagetofrom PIL import*
sagiksp
6

C, 247 bajtów

Nie zamierzam wygrywać, ale lubię grać w golfa w C. Nie jest używana zewnętrzna biblioteka obrazów, wyjścia na standardowe wyjście w formacie PPM. Pobiera dane wejściowe na standardowe wejście. Wykorzystuje odległość do golfa dla golfisty.

j,w,h,k,*b,t[6];main(){scanf("%d %d",&w,&h);b=calloc(w*h,24);for(;~scanf("%d",t+j++%6);)for(k=0;j%6?0:k<3*w*h;k++)b[k]=fmin(b[k]+t[2]*t[3+k%3]/(abs(k/3%w-*t)+abs(k/3/w-t[1])+1),255);printf("P6\n%d %d\n255\n",w,h);for(k=0;k<3*w*h;putchar(b[k++]));}

Oto wariant odległości euklidesowej (257 bajtów):

j,w,h,k,*b,t[6];main(){scanf("%d %d",&w,&h);b=calloc(w*h,24);for(;~scanf("%d",t+j++%6);)for(k=0;j%6?0:k<3*w*h;k++)b[k]=fmin(b[k]+t[2]*t[3+k%3]/(sqrt(pow(k/3%w-*t,2)+pow(k/3/w-t[1],2))+1),255);printf("P6\n%d %d\n255\n",w,h);for(k=0;k<3*w*h;putchar(b[k++]));}
Andrea Biondo
źródło
6

CJam, 86 bajtów

q~]"P3 "\_2>:T;2<_S*" 255 "@:,~\m*{(+0a3*T6/{_2<3$.-:z~+)d\2>(f*\f/.+}/:i255fe<\;S*S}/

Chociaż może to wydawać się dość długie w przypadku języka golfowego, uważam, że spośród opublikowanych dotychczas rozwiązań jest to najkrótszy, który nie korzysta z funkcji wyświetlania obrazu. To tworzy plik PPM w formie ASCII. Poniższy obraz został przekonwertowany z PPM do PNG przy użyciu GIMP.

Nie polecam uruchamiać kodu w internetowym tłumaczu CJam. Przynajmniej nie dla zdjęć w pełnym rozmiarze. Moja przeglądarka została zablokowana, najprawdopodobniej z powodu użycia pamięci. Uzupełnia obrazy 400 x 400 w drugim zakresie w wersji offline.

Przykład C

Wyjaśnienie:

q~      Read and parse input.
]       Wrap it in an array.
"P3 "   Output start of PPM header.
\       Swap input to top.
_2>     Slice off first two values, leaving the star descriptors.
:T;     Store star descriptors in variable T.
2<      Get first two values in input, which is the image size.
_S*     Leave a copy of the size in the output for the PPM header.
" 255 " Rest of PPM header, range of color values.
@       Pop sizes to top.
:,      Expand sizes to ranges.
~       Unwrap size ranges into separate stack elements.
\       Swap ranges, since we need x-range second for Cartesian product.
m*      Generate all coordinate pairs with Cartesian product.
{       Loop over pixel coordinate pairs.
  (+      Swap values in coordinate pair to get x-coordinate first again.
  0a3*    Generate [0 0 0] array. Will be used to sum up colors from stars.
  T       Get list of stars.
  6/      Split into sub-lists with 6 values for each star.
  {       Loop over the stars.
    _2<     Get the first two values (position) of the star.
    3$      Pull current pixel coordinates to top of stack.
    .-      Subtract pixel coordinates from star position.
    :z      Absolute value of difference.
    ~+      Unpack differences and add them to get Manhattan distance.
    )d      Add 1 and convert to double to get denominator of formula.
    \       Swap star values to top.
    2>      Slice off first two values, leaving intensity and color.
    (       Pop off intensity.
    f*      Multiply it with color values.
    \       Swap denominator to top.
    f/      Perform division of color components by denominator.
    .+      Add it to sum of colors.
  }/      End loop over stars.
  :i      Convert double values for colors to integer.
  255fe<  Cap color components at 255.
  \;      Swap pixel coordinate to top and pop it.
  S*S     Join color components with space, and add another space.
}/      End loop over coordinate pairs.
Reto Koradi
źródło
5

C # 718 bajtów

Zdaję sobie sprawę, że c # jest straszny dla gry w golfa, ale oto moja próba na 718 bajtów

namespace System{using Collections.Generic;using Drawing;using Linq;using O=Convert;class P{int j,i;List<S> s=new List<S>();Image G(string t){var l=t.Replace("\r","").Split('\n');var w=O.ToInt32(l[0].Split(' ')[0]);var h=O.ToInt32(l[0].Split(' ')[1]);for(i=1;i < l.Length;i++){var p=l[i].Split(' ');s.Add(new S{X=O.ToInt32(p[0]),Y=O.ToInt32(p[1]),I=O.ToSingle(p[2]),R=O.ToByte(p[3]),G=O.ToByte(p[4]),B=O.ToByte(p[5])});}var b=new Bitmap(w,h);for(j=0;j<h;j++)for(i=0;i<w;i++)b.SetPixel(i,j,C());return b;}Color C(){return Color.FromArgb(X(x=>x.R),X(x=>x.G),X(x=>x.B));}int X(Func<S,float>f){return(int)Math.Min(s.Sum(x=>x.I*f(x)/(Math.Sqrt((x.X-i)*(x.X-i)+(x.Y-j)*(x.Y-j))+1)),255);}class S{public float X,Y,R,G,B,I;}}}

Jeśli ktoś ma jakieś sugestie dotyczące skrócenia, daj mi znać.

Allan Harper
źródło
Przegapiłeś przeciążenie Color.FromArgb (int, int, int). Zapisałby 4 bajty ...
Melvyn,
Ponadto prawdopodobnie powinieneś używać .Length zamiast .Count (). jeden bajt mniej i bardziej wydajny. Nawiasem mówiąc, możesz zaoszczędzić o wiele więcej bajtów, używając nowych pełnoprawnych członków C # 6, jeśli chcesz.
Melvyn,
Dobre punkty zarówno pod względem długości, jak i przeciążenia, dostosowują się teraz. I patrząc na pełnych wyrazu członków. Nie widziałem ich wcześniej. Dzięki
Allan Harper,
4

Python, 259 bajtów

Wkońcu zrobione! Pierwszy kod golfa, którego próbowałem, zdecydowałem się użyć Pythona i poszedłem na odległość Manhattanu. Krzycz Maltysenowi za pomoc w iteratorach, zmniejszając całkowity rozmiar do prawie połowy!

from PIL.Image import new
N,*s=[list(map(int,i.split()))for i in iter(input,'')]
q,m=new("RGB",(N[0],N[1])),[]
[m.append(tuple(sum(k[2]*k[i]//(abs(k[1]-x)+abs(k[0]-y)+1)for k in s)for i in(3,4,5)))for x in range(N[1])for y in range(N[0])]
q.show(q.putdata(m))
Nicolás Siplis
źródło
Wiem, że musi istnieć sposób na wykonanie jednego obliczenia dla wszystkich, ale szczerze mówiąc, nie znam tak dobrze Pythona.
Nicolás Siplis,
Twoje nadal nie działa poprawnie, musisz przełączyć k[0]i k[1]w obliczeniach.
Maltysen
Zajęło mi około 10 minut, aby zrozumieć, dlaczego działa na moim komputerze, okazało się, że je odwróciłem, ale zapomniałem go tutaj zmienić.
Nicolás Siplis,
2

CJam, 70 bajtów

"P3"l_~\:W*255\,[q~]6Te]6/f{\[Wmd\]f{.-Z/~\)\~mh)/f*}:.+{i255e<}/}~]S*

Odległość euklidesowa, wyjście ASCII PPM. Wypróbuj online

Powinno być możliwe ściśnięcie jeszcze kilku bajtów, ale nie chcę spędzać zbyt wiele czasu.

aditsu
źródło