I colori nelle nostre stelle


90

Scrivi un programma che contiene una stringa o un file di testo la cui prima riga ha il modulo

width height

e ogni riga successiva ha il modulo

x y intensity red green blue

dove:

  • widthe heightpuò essere qualsiasi numero intero positivo.
  • xe ypuò essere qualsiasi numero intero.
  • intensity può essere qualsiasi numero intero non negativo.
  • red, greene bluepossono essere numeri interi compresi tra 0 e 255 inclusi.

Il tuo programma deve produrre un'immagine truecolor in qualsiasi formato di file immagine lossless comune le cui dimensioni sono widthdi height. Ogni x y intensity red green bluelinea rappresenta una stella o un globo colorato che deve essere disegnato sull'immagine. È possibile disegnare un numero qualsiasi di stelle, incluso 0. Puoi supporre che la stringa o il file abbia una nuova riga finale.

L'algoritmo per disegnare l'immagine è il seguente, sebbene tu possa implementarlo come preferisci purché il risultato sia identico:

Per ogni pixel ( X , Y ) nell'immagine (dove X è 0 sul bordo più a sinistra e larghezza-1 sul bordo più a destra, e Y è 0 sul bordo superiore e altezza-1 sul bordo inferiore), il canale del colore C ϵ { rosso , verde , blu } (un valore compreso tra 0 e 255) è dato dall'equazione:

equazione del canale colore

Dove la funzione dist è la distanza euclidea :

Equazione della distanza euclidea

O distanza di Manhattan :

Equazione della distanza di Manhattan

Scegli la funzione di distanza che preferisci, in base alla golfabilità o all'estetica.

Ciascuna delle linee nell'input oltre alla prima è un elemento dell'insieme di stelle . Così, per esempio, S x rappresenta il xvalore su una delle linee di ingresso e S C rappresenta o red, greeno blue, a seconda di quale canale di colore viene attualmente calcolato.

Esempi

Esempio A

Se l'ingresso è

400 150
-10 30 100 255 128 0

l'output dovrebbe essere

Esempio A, Euclideo

se stai usando la distanza euclidea, e

Esempio A, Manhattan

se stai usando la distanza di Manhattan.

Esempio B

Se l'ingresso è

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

le rispettive uscite per la distanza euclidea e Manhattan dovrebbero essere

Esempio B, Euclideoe Esempio B, Manhattan.

Esempio C

Se l'ingresso è

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

l'output dovrebbe essere

Esempio C, Euclideo

se stai usando la distanza euclidea, e

Esempio C, Manhattan

se stai usando la distanza di Manhattan.

Esempio D

Se l'ingresso è

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

l'output dovrebbe essere

Esempio D, Euclideo

se stai usando la distanza euclidea, e

Esempio D, Manhattan

se stai usando la distanza di Manhattan.

Esempio E

Se l'ingresso è

100 1

quindi l'output dovrebbe essere un'immagine di 100 pixel di larghezza per 1 pixel di altezza completamente nera.

Appunti

  • Prendi la stringa di input o il nome di un file di testo che lo contiene da stdin o dalla riga di comando, oppure potresti scrivere una funzione che accetta una stringa.
  • "Emissione" dell'immagine significa:
    • Salvandolo in un file con il nome desiderato.
    • Stampa dei dati del file di immagine non elaborati su stdout.
    • Visualizzazione dell'immagine, come ad esempio con PIL 's image.show().
  • Non verificherò che le tue immagini siano pixel perfetti (Stack Exchange comprime comunque le immagini in modo perdita) ma sarò molto sospettoso se posso dire visivamente qualsiasi differenza.
  • È possibile utilizzare librerie di grafica / immagini.

vincente

Vince l'invio più breve in byte. In caso di parità vince la prima domanda.

Divertente bonus: dai l'input per un'immagine di output davvero spettacolare.


38
+1 Wow. Questo è stupendo. (E un momento adatto per la pubblicazione, mentre sentiamo le parole di una sana navicella spaziale New Horizons!)
BrainSteel,

L'input deve essere in quel formato separato da spazio o può essere separato da virgola? Comunque, +1.
Maltysen,

1
@Maltysen Spazio separato. (So ​​che è avaro, ma è più facile che consentire una dozzina di varianti di input.)
Calvin's Hobbies

4
Non riesco a decidere se le sfere o le stelle sono più belle.
trichoplax,

Per la perfezione dei pixel puoi confrontare l'hash della bitmap
Tobias Kienzler,

Risposte:


26

Pyth - 46 byte

È stato divertente! Finalmente ho potuto usare le funzionalità I / O delle immagini di Pyth. Fa distanza euclidea a causa del golfiness, anche se Manhattan è solo una piccola modifica.

Krz7.wcmmsm/*@b+3k@b2h.a,<b2_.DdhKrR7.zU3*FKhK

Questo scorre semplicemente attraverso tutti i pixel con la formula sebbene conduca il pixel loop in un loop e lo usi divmodpoiché Pyth supporta solo 3 mappe nidificate e i calcoli ne prendono due (uno per RGB e uno per le stelle).

Salva l'immagine come o.png. Abbastanza lento, fa i primi 2 test in <2 minuti, ma gli altri 2 prendono l'ordine di mezz'ora.

C'è un bug .wche nessuno ha notato perché nessuno lo usa;) ma ho inserito una richiesta pull quindi usa il mio fork per testare se non viene unito presto. Uniti!

Esempi di output

Esempio A

Esempio A

Esempio B

Esempio B

Esempio C

Esempio C

Esempio D

Esempio D


7
Wow, non sapevo che Pyth potesse farlo. Un giorno potremmo finire per scrivere software aziendale in Pyth. È meno codice da scrivere, quindi dovrebbe essere più veloce e più facile da refactoring. : D
Cristian Lupascu,

7
@ w0lf "Il tempo del programmatore è più importante del tempo di esecuzione" e sappiamo tutti che Pyth aiuta a ridurre il tempo del programmatore :) L'immagine I / O è stata aggiunta di recente dopo che Pyth è stato escluso da una sfida di output grafico. Usa il cuscino internamente.
Maltysen,

11
@Nit Assolutamente. Inoltre non ha nulla a che fare con la velocità di scrittura. Il mio commento precedente era uno scherzo.
Cristian Lupascu,

2
Ragazzi, avete dimenticato una cosa importante: è anche più facile eseguire il debug, poiché il codice è inferiore;)
Optimizer,

14
Riducendo il tempo del programmatore intendi "Stanno giocando a golf con Pyth e quindi hanno meno tempo per scrivere codice 'reale'"?

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);}

Modifica: abbrevia molto il codice applicando i fantastici suggerimenti di wolfhammer .

Test

Nota: attendi qualche secondo per il rendering dello snippet di seguito (richiede circa 4 secondi sulla mia macchina).

Puoi anche eseguirlo in JSFiddle .

Bonus: Blue Eclipse

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);

Puoi anche eseguirlo in JSFiddle .

Descrizione

Questa è un'implementazione di tela JavaScript + HTML5 semplice: una funzione che accetta un argomento stringa (senza spazi finali / nuove righe) e visualizza l'output nel DOM. Usa la distanza euclidea.

Ecco il codice leggibile:

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);
};

Adoro gli aloni incollati insieme in Blue Eclipse, puoi aggiungere lo stile manhatan?
PTwr

1
@PTwr Certo, eccolo: jsfiddle.net/pjLnazw1
Cristian Lupascu,

Eccezionale! (7 in più per andare ... ugh)
PTwr

@ w0lf È possibile eliminare alcuni byte dalla funzione combinando gli iteratori xey. jsfiddle
wolfhammer il

@wolfhammer Wow, ora sono solo "alcuni byte", sono molti miglioramenti. Daremo un'occhiata più avanti, poiché credo che ci sia qualcosa da sistemare sull'indicizzazione (per le immagini di esempio 2, 3 e 4 i pixel a sinistra sembrano avvolgersi). Grazie!
Cristian Lupascu,

26

Java - 627 byte

Java è davvero uno dei migliori linguaggi del golf :)

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;}}

Usando l'input qui sotto, puoi creare un modello alquanto realistico del nostro sistema solare (la dimensione di alcuni pianeti è sbagliata, ma la distanza tra loro dovrebbe essere accurata). Ho provato a dare anelli a Saturno, ma non ha funzionato ... Fonte

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

Sistema solare con plutone

Immagine Full HD , che non sembra eccezionale ... Sarebbe felice se qualcuno potesse migliorarlo!


15
+1 per il sistema solare. -1 per lasciare Plutone (ora che conosciamo persino il suo colore e le sue dimensioni reali)
Ottimizzatore

1
Inoltre, sarebbe davvero bello se fosse collegato uno sfondo completo a 1080p :)
Optimizer,

@Optimizer Ho aggiunto Plutone;) Vediamo cosa posso fare per lo sfondo
CommonGuy

1
@ Sp3000 Ups, ho dimenticato l'intensità quando ho aggiunto
Plutone

2
Nota che Saturno non è l'unico pianeta con anelli. Se riesci a far funzionare gli anelli, dovresti aggiungerli anche a Urano.
mbomb007,

20

Bash, 147 145 byte

ImageMagick viene utilizzato per manipolare le immagini. Viene utilizzata la distanza euclidea.

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

È possibile salvare un byte con $w\x$h.
deltab,

... e un altro con o=o.png.
deltab,

16

Python 3, 189 byte

Non ho idea di un golfista esperto, ma ecco qui.

  • L'input viene stdine viene stdoutin formato PPM .
  • Eseguilo così: python3 codegolf_stars_golfed.py < starfield.txt > starfield.pnm

Innanzitutto, distanza di Manhattan:

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)))

E in secondo luogo, la distanza euclidea:

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)))

Potrei salvare quattro byte usando la divisione intera invece di int(), e in effetti sembra essere quello che fanno le immagini originali - puoi appena distinguere alcune striature nelle frange scure del bagliore della stella che non sono presenti in modo strettamente corretto codice. Allo stato attuale, tuttavia, questo codice segue la descrizione, non le immagini.

La versione non golfata e il mio golf originale prima delle molte ottimizzazioni che altri hanno sottolineato o che mi sono imbattuto in me stesso, sono in questo senso .

EDIT: ho risparmiato 7 byte spostando for xe for yin un singolo print(o ofunzione), ma questo produce un file PNM con una linea molto lunga, che può o non può causare alcuni problemi.

EDIT 2: Maltysen mi ha salvato altri 20 byte. Grazie!

MODIFICA di nuovo: ora che ce n'è solo uno print, l' oalias è una responsabilità, non un risparmio. 4 byte in più off.

MODIFICA ancora: Sp3000 mi ha salvato altri 2 byte. Nel frattempo, aliasing mapa mnon era salvare niente, quindi nell'interesse di leggibilità (!) Ho ampliato di nuovo. Ora è un bel giro di 2 8 byte.

MODIFICA l'ultimo (?): Ora con il supporto della distanza euclidea - e abusando di numeri complessi, l'ho fatto esattamente nello stesso numero di byte!

EDIT, il riavvio di Hollywood: il prossimo suggerimento di Sp3000 ha eliminato 5 byte.

EDIT, il sequel chiamato stupidamente: 6 byte eliminati, grazie a un suggerimento che Maltysen ha fatto che non ho capito fino a quando Sp3000 non lo ha ripetuto ... poi altri 8 byte da %abuso. E parlarne in chat è stato fenomenale2126 byte. Sono umiliato.


@Maltysen: giusto. 20 byte salvati!
Tim Pederick,

un po 'di più: invece di quella roba complicata di sys.stdin con EOFs puoi usare iter()con i valori sentinella: docs.python.org/2/library/functions.html#iter come iter(raw_input,''), anche mettere w,h,Ssulla stessa linea con il disimballaggio esteso.
Maltysen,

@Maltysen: non sono sicuro che funzionerebbe. Lo stavo già facendo quasi esattamente, ma colpisce EOFError(e quindi avevo bisogno di un tryblocco), perché non c'è una riga vuota nel file di input e non sono sicuro che la sfida mi permetta di aggiungerne uno. O mi sta sfuggendo qualcosa?
Tim Pederick,

Penso che se tu fossi il valore del sentinella, potresti semplicemente terminare con una riga vuota invece di inserire il file, anche se sì, il file non funzionerebbe.
Maltysen,

@ Sp3000: Sorprendentemente, sì! Mi aspettavo che si lamentasse che stdinnon era un iteratore.
Tim Pederick,

10

C ++, 272 byte

#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");}

Ha bisogno di un compilatore clemente C ++ 11 (GCC 4.9.2 è solo leggermente scontento) e della libreria png ++ , che a sua volta richiede libpng. Distanza di Manhattan utilizzata. Attiva l'input stdin, l'output in un file denominato "a" nella directory corrente in formato PNG.

Esempio D:

inserisci qui la descrizione dell'immagine


inserisci qui la descrizione dell'immagine


inserisci qui la descrizione dell'immagine


1
Mi piace l' PCGimmagine :) (Anche se PPCGè la mia abbreviazione preferita;))
Calvin's Hobbies

8

Python 2, 240 232 228 byte

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()

Usa la distanza di Manhattan. Questo sarebbe probabilmente ancora più breve in Python 3, ma di recente ho incasinato i miei pacchetti Python e ho problemi a reinstallare Pillow. La PPM sarebbe probabilmente ancora più breve, ma mi piace il PIL.

Per divertimento, ho provato ad applicare l'algoritmo nello spazio colore L * a * b * , pensando invece che avrebbe dato una migliore fusione dei colori (specialmente nell'esempio B). Sfortunatamente, l'algoritmo di Calvin consente ai canali di superare i loro valori massimi, il che rende le immagini un po 'meno fantastiche di quanto sperassi ...

inserisci qui la descrizione dell'immagine


6

Mathematica, 146 byte

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

Una funzione pura che prende una stringa. Per eseguirlo in un ragionevole lasso di tempo, sostituire 1in 1+#~ManhattanDistance...con un 1.; questo forza il calcolo numerico anziché simbolico.

Ungolfed:

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"]&

6

Python 2, 287 251 byte

Una versione giocata a golf del codice originale che ho usato per generare le immagini. Probabilmente potrebbe essere giocato a golf un po 'di più (da un giocatore di golf migliore di me). È una funzione che accetta l'intera stringa di input. Elaborazione delle immagini eseguita con il modulo immagine PIL . Usa la distanza di Manhattan.

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()

L'uso della distanza euclidea è più lungo di 5 byte (256 byte):

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()

Ecco una suite di test completa che esegue gli esempi da A a E della domanda, per entrambe le metriche di distanza:

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

Sembrano tutti indistinguibili. I più grandi potrebbero richiedere alcuni secondi per essere eseguiti.


Credo che puoi salvare un sacco di byte cambiando for x in r(I[0]):...for y in r(I[1]):cambiandolo in for x in r(I[0]*I[1]):. È quindi possibile prendere ogni livello di rientro in basso di 1 e sostituirlo xcon x/I[1]e ycon y%I[1].
Kade,

È possibile salvare 5 byte sostituendo from PIL import Imageafrom PIL import*
sagiksp il

6

C, 247 byte

Non ho intenzione di vincere, ma mi piace giocare a golf in C. Nessuna libreria di immagini esterna utilizzata, output su stdout in formato PPM. Accetta input su stdin. Usa la distanza di Manhattan per il golfismo.

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++]));}

Ecco la variante della distanza euclidea (257 byte):

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++]));}

6

CJam, 86 byte

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

Anche se questo può sembrare un po 'lungo per un linguaggio del golf, credo che delle soluzioni pubblicate finora, sia il più breve che non utilizza la funzionalità di output delle immagini. Questo produce un file PPM in formato ASCII. L'immagine seguente è stata convertita da PPM in PNG utilizzando GIMP.

Non consiglio di eseguire il codice nell'interprete CJam online. Almeno non per le immagini a dimensione intera. Il mio browser si è bloccato, molto probabilmente a causa dell'utilizzo della memoria. Completa le immagini 400x400 nel secondo intervallo con la versione offline.

Esempio C

Spiegazione:

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.

5

C # 718 byte

Mi rendo conto che c # è terribile per il golf, ma ecco il mio tentativo di 718 byte

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;}}}

Se qualcuno ha qualche suggerimento per accorciarlo, sentiti libero di farmelo sapere.


Hai perso il sovraccarico Color.FromArgb (int, int, int). Salverebbe 4 byte ...
Melvyn,

Inoltre, dovresti probabilmente usare .Length invece di .Count (). un byte in meno e più efficiente. E comunque, potresti risparmiare molti più byte usando i nuovi membri corposi di espressione di C # 6, se lo desideri.
Melvyn,

Buoni punti sia sulla lunghezza che sul sovraccarico, regolando ora. E guardando i membri dal corpo espressivo. Non li ho mai visti prima. Grazie
Allan Harper il

4

Python, 259 byte

Finalmente concluso! Primo codice golf che ho provato, ho deciso di usare Python e sono andato con la distanza di Manhattan. Shoutout a Maltysen per avermi aiutato con gli iteratori, ha ridotto la dimensione totale a quasi la metà!

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))

So che deve esserci un modo per fare un calcolo per tutti, ma onestamente non conosco Python così bene.
Nicolás Siplis,


Il tuo non funziona ancora correttamente, devi cambiare il k[0]e k[1]nei calcoli.
Maltysen,

Mi ci sono voluti 10 minuti per capire perché funzionava sulla mia macchina, risulta che li ho invertiti ma ho dimenticato di cambiarlo qui.
Nicolás Siplis,

2

CJam, 70 byte

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

Distanza euclidea, uscita ASCII PPM. Provalo online

Dovrebbe essere possibile spremere qualche byte in più, ma non voglio passare troppo tempo.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.