Ecrivez un programme qui prend une chaîne ou un fichier texte dont la première ligne a la forme
width height
et chaque ligne suivante a la forme
x y intensity red green blue
où:
width
etheight
peut être n'importe quel entier positif.x
ety
peuvent être des nombres entiers.intensity
peut être n'importe quel entier non négatif.red
,green
etblue
peuvent être des nombres entiers compris entre 0 et 255 inclus.
Votre programme doit générer une image truecolor dans n’importe quel format de fichier image sans perte commun dont les dimensions sont définies width
par height
. Chaque x y intensity red green blue
ligne représente une étoile ou un globe coloré à dessiner sur l’image. Il peut y avoir un nombre quelconque d'étoiles à dessiner, y compris 0. Vous pouvez supposer que la chaîne ou le fichier a une nouvelle ligne.
L'algorithme pour dessiner l'image est le suivant, mais vous pouvez l'implémenter à votre guise tant que le résultat est identique:
Pour chaque pixel ( X , Y ) de l’image ( X étant 0 au bord le plus à gauche et 1 à la largeur au bord le plus à droite, et Y à 0 au bord supérieur et à la hauteur 1 au bord inférieur), le canal de couleur C ϵ { rouge , vert , bleu } (une valeur épinglée entre 0 et 255) est donné par l'équation:
Où la fonction dist est soit une distance euclidienne :
Choisissez la fonction de distance que vous préférez, en fonction de la golfabilité ou de l'esthétique.
En plus de la première, chacune des lignes de l'entrée est un élément du jeu d' étoiles . Ainsi, par exemple, S x représente la
x
valeur sur l' une des lignes d'entrée, et S C représente soitred
,green
oublue
, selon le canal de couleur est en cours de calcul.
Exemples
Exemple A
Si l'entrée est
400 150
-10 30 100 255 128 0
la sortie devrait être
si vous utilisez la distance euclidienne, et
si vous utilisez la distance de Manhattan.
Exemple B
Si l'entrée est
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
les sorties respectives pour la distance euclidienne et Manhattan devraient être
et .
Exemple C
Si l'entrée est
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
la sortie devrait être
si vous utilisez la distance euclidienne, et
si vous utilisez la distance de Manhattan.
Exemple D
Si l'entrée est
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
la sortie devrait être
si vous utilisez la distance euclidienne, et
si vous utilisez la distance de Manhattan.
Exemple E
Si l'entrée est
100 1
la sortie devrait alors être une image complètement noire de 100 pixels de large par 1 pixel de haut.
Remarques
- Prenez la chaîne d'entrée ou le nom d'un fichier texte qui le contient à partir de stdin ou de la ligne de commande, ou écrivez une fonction prenant une chaîne.
- "Produire" l'image signifie soit:
- Sauvegarde dans un fichier avec le nom de votre choix.
- Impression des données de fichier image brutes sur stdout.
- Affichage de l'image, comme avec PIL de
image.show()
.
- Je ne vérifierai pas que vos images sont parfaitement pixelisées (Stack Exchange compresse néanmoins les images avec perte), mais je serai très suspicieux si je peux distinguer visuellement toute différence.
- Vous pouvez utiliser des bibliothèques de graphiques / d'images.
Gagnant
La soumission la plus courte en octets l'emporte. En cas d'égalité, la première soumission gagne.
Bonus amusant: donnez une entrée pour une image de sortie vraiment spectaculaire.
la source
Réponses:
Pyth - 46 octets
C'était amusant! J'ai enfin pu utiliser les fonctionnalités d'E / S de l'image de Pyth. Fait distance euclidienne à cause de Golfiness, bien que Manhattan est juste un changement court.
Cela fait simplement une boucle à travers tous les pixels avec la formule, bien que cela condense la boucle de pixel en une boucle et l'utilise
divmod
puisque Pyth ne supporte que 3 cartes imbriquées et que les calculs en prennent deux (une pour les RVB et une pour les étoiles).Enregistre l'image sous
o.png
. Assez lent, effectue les 2 premiers tests en <2 min, mais les 2 autres prennent environ une demi-heure.Il y a un bug dansFusionné!.w
lequel personne n'a remarqué parce que personne ne l'utilise;) mais j'ai introduit une demande d'extraction, utilisez donc mon fork pour tester si elle n'est pas fusionnée bientôt.Exemples de sorties
Exemple A
Exemple B
Exemple C
Exemple D
la source
JavaScript
394344Edit: raccourci le code en appliquant les superbes suggestions de wolfhammer .
Tester
Remarque: attendez quelques secondes que l'extrait de code ci-dessous soit rendu (cela prend environ 4 secondes sur ma machine).
Afficher l'extrait de code
Vous pouvez également l'exécuter dans JSFiddle .
Bonus: Eclipse Bleue
Vous pouvez également l'exécuter dans JSFiddle .
La description
Il s'agit d'une implémentation directe de canevas JavaScript + HTML5: une fonction qui prend un argument de chaîne (sans espaces de fin ni nouvelles lignes) et affiche la sortie dans le DOM. Il utilise la distance euclidienne.
Voici le code lisible:
la source
Java - 627 octets
Java est en effet l’une des meilleures langues de golf :)
En utilisant les informations ci-dessous, vous pouvez créer un modèle relativement réaliste de notre système solaire (la taille de certaines planètes est fausse, mais la distance qui les sépare doit être précise). J'ai essayé de donner des bagues à Saturne, mais ça n'a pas fonctionné ... Source
Image Full HD , ce qui n’a pas l’air fantastique, serait heureux si quelqu'un pouvait l’améliorer!
la source
Bash,
147145 octetsImageMagick est utilisé pour manipuler des images. La distance euclidienne est utilisée.
la source
$w\x$h
.o=o.png
.Python 3, 189 octets
Je ne suis pas l'idée d'un golfeur expert, mais voilà.
stdin
et vastdout
dans le format PPM .python3 codegolf_stars_golfed.py < starfield.txt > starfield.pnm
Tout d'abord, distance de Manhattan:
Et deuxièmement, la distance euclidienne:
Je pourrais économiser quatre octets en utilisant la division entière au lieu de
int()
, et en fait, cela semble être ce que font les images originales - vous pouvez à peine distinguer quelques stries dans les franges sombres de la lueur d'étoile qui ne sont pas présentes dans des conditions parfaitement correctes. code. En l'état actuel, ce code suit la description, pas les images.La version non-golfée, et mon parcours de golf original avant les nombreuses optimisations que d'autres ont indiquées ou que je suis tombé sur moi-même, sont dans cette optique .
EDIT: j'ai enregistré 7 octets en déplaçant
for x
etfor y
en une seuleprint
(ouo
) fonction, mais cela produit un fichier PNM avec une très longue ligne, ce qui peut causer ou non des problèmes.EDIT 2: Maltysen m'a sauvé 20 octets supplémentaires. Merci!
EDIT à nouveau: maintenant qu’il n’y en a plus qu’un
print
, leo
pseudonyme est un passif, pas une économie. 4 octets de plus.EDIT encore: Sp3000 m'a sauvé 2 octets de plus. Pendant ce temps, le pseudonyme
map
dem
ne sauvegardait rien, alors, dans un souci de lisibilité (!), Je l’ai développé à nouveau. C'est maintenant un joli tour 2 8 octets.EDIT the last (?): Maintenant, avec le support de distance euclidien - et en abusant de nombres complexes, je l’ai fait exactement avec le même nombre d’octets!
EDIT, le redémarrage d'Hollywood: la prochaine suggestion de Sp3000 supprimait 5 octets.
EDIT, la suite bêtement nommée: 6 octets supprimés, grâce à une suggestion de Maltysen que je n’ai pas saisie jusqu’à ce que Sp3000 le répète ... puis encore 8 octets d’
%
abus. Et en parler en causant une phénoménale2126 octets. Je suis humble.la source
EOF
s, vous pouvez utiliseriter()
des valeurs sentinel: docs.python.org/2/library/functions.html#iter asiter(raw_input,'')
, égalementw,h,S
sur la même ligne avec décompression étendue.EOFError
(et donc j'avais besoin d'untry
bloc), car il n'y a pas de ligne vierge dans le fichier d'entrée et je ne suis pas sûr que le défi me permette d'en ajouter un. Ou est-ce que je manque quelque chose?stdin
n'était pas un itérateur.C ++, 272 octets
Nécessite un compilateur indulgent C ++ 11 (GCC 4.9.2 n’est que légèrement contrarié) et la bibliothèque png ++ , qui elle-même est nécessaire
libpng
. Manhattan distance utilisée. Accepte les entréesstdin
, les sorties dans un fichier nommé "a" dans le répertoire actuel au format PNG.Exemple D:
la source
PCG
image :) (Bien que cePPCG
soit mon abréviation préférée;))Python 2,
240232228 octetsUtilise la distance de Manhattan. Ce serait probablement encore plus court dans Python 3, mais j'ai récemment bousillé mes paquets Python et je ne parviens pas à réinstaller Pillow. La PPM serait probablement encore plus courte, mais j'aime bien la PIL.
Pour le plaisir, j'ai essayé d'appliquer l'algorithme tel quel dans l' espace colorimétrique L * a * b * , pensant qu'il donnerait un meilleur mélange des couleurs (en particulier dans l'exemple B). Malheureusement, l'algorithme de Calvin permet aux canaux de dépasser leurs valeurs maximales, ce qui rend les images un peu moins impressionnantes que je ne l'aurais espéré ...
la source
Mathematica, 146 octets
Une fonction pure prenant une chaîne. Pour l' exécuter dans un laps de temps raisonnable, remplacer
1
dans1+#~ManhattanDistance...
un1.
; cela oblige le calcul numérique au lieu de symbolique.Ungolfed:
la source
Python 2,
287251 octetsUne version golfée du code original que j'ai utilisé pour générer les images. Pourrait probablement être joué un peu plus au golf (par un meilleur golfeur que moi). C'est une fonction qui prend toute la chaîne d'entrée. Traitement des images effectué avec le module d’image de PIL . Utilise la distance de Manhattan.
L'utilisation de la distance euclidienne est plus longue de 5 octets (256 octets):
Voici une suite de tests complète qui exécute les exemples A à E de la question, pour les deux métriques de distance:
Ils ont tous l'air indiscernables. Les plus gros peuvent prendre quelques secondes à courir.
la source
for x in r(I[0]):...for y in r(I[1]):
enfor x in r(I[0]*I[1]):
. Vous pouvez ensuite prendre chaque niveau de retrait dans 1, et remplacerx
parx/I[1]
ety
avecy%I[1]
.from PIL import Image
tofrom PIL import*
C, 247 octets
Je ne vais pas gagner, mais j'aime jouer au golf en C. Aucune bibliothèque d'images externe utilisée, sorties sur stdout au format PPM. Prend une entrée sur stdin. Utilise la distance de Manhattan pour les golfeurs.
Voici la variante de distance euclidienne (257 octets):
la source
CJam, 86 octets
Bien que cela puisse paraître long pour une langue de golf, je pense que parmi les solutions publiées jusqu'à présent, c'est la plus courte qui n'utilise pas la fonctionnalité de sortie d'image. Cela produit un fichier PPM sous forme ASCII. L'image ci-dessous a été convertie de PPM en PNG à l'aide de GIMP.
Je ne recommande pas d'exécuter le code dans l'interpréteur en ligne de CJam. Du moins pas pour les images en taille réelle. Mon navigateur est bloqué, probablement à cause de l'utilisation de la mémoire. Il complète les images 400x400 de la deuxième gamme avec la version hors connexion.
Explication:
la source
C # 718 octets
Je me rends compte que c # est terrible pour le golf, mais voici ma tentative de 718 octets
Si quelqu'un a des suggestions pour le raccourcir, n'hésitez pas à me le faire savoir.
la source
Python, 259 octets
Finalement fait! Premier code de golf que j'ai essayé, j'ai décidé d'utiliser Python et je suis parti avec Manhattan. Shoutout à Maltysen pour m'avoir aidé avec les itérateurs, réduit la taille totale à près de la moitié!
la source
k[0]
etk[1]
dans les calculs.CJam, 70 octets
Distance euclidienne, sortie ASCII en PPM. Essayez-le en ligne
Il devrait être possible de compresser quelques octets supplémentaires, mais je ne veux pas passer trop de temps.
la source