Joe le serpent a faim.
Il mange des images, un pixel à la fois.
Il aime vraiment les pixels lumineux.
Le défi
Programmez Joe à manger les pixels les plus brillants qu'il puisse trouver, étant donné qu'il ne peut que se déplacer vers le haut, le bas, la gauche ou la droite.
Caractéristiques
- Joe doit commencer au pixel supérieur gauche de l'image.
- Joe ne peut se déplacer horizontalement ou verticalement que de 1 à chaque mouvement
- Joe n'a que le temps de déplacer 1/3 du nombre de pixels dans l'image (1/3 autant de mouvements que de pixels). Si le nombre de pixels n'est pas un multiple de 3, arrondissez à l'entier le plus proche.
- Joe peut croiser son chemin, bien que cela compte pour 0 luminosité
- La luminosité est basée sur la somme de r, g et b, donc rgb (0,0,0) a une luminosité de 0 tandis que rgb (255,255,255) a une luminosité maximale.
Contribution
Vous pouvez saisir l'image comme vous le souhaitez.
Sortie
- une image montrant le résultat final de votre photo (avec du noir mangé en pixels).
- La quantité de luminosité consommée (veuillez préciser quelle plage dans votre réponse)
Notation
Votre programme sera noté sur:
- La luminosité moyenne des pixels que Joe mange / La luminosité moyenne des pixels de l'image *
* vous pouvez coder en dur cela dans votre programme
Votre score total sera la moyenne des scores des images suivantes:
Images de test:
http://upload.wikimedia.org/wikipedia/en/thumb/f/f4/The_Scream.jpg/800px-The_Scream.jpg
code-challenge
image-processing
Stretch Maniac
la source
la source
[![image description](SE URL for downsized image)](URL for original image)
.Réponses:
C ++, Score:
1.420421.46766Il s'agit essentiellement d'une version légèrement plus sophistiquée des deux solutions existantes: des quatre mouvements possibles, il sélectionne celui qui maximise la luminosité. Cependant, au lieu de ne regarder que la luminosité du pixel cible, il examine la somme pondérée de la luminosité des pixels au voisinage du pixel cible, où les pixels plus proches de la cible ont un poids plus important.
EDIT: L' utilisation de la luminosité non linéaire dans le calcul du voisinage améliore légèrement le score.
Compilez avec
g++ joe.cpp -ojoe -std=c++11 -O3 -lcairo
. Nécessite le Caire.Courez avec
joe <image-file> [<radius>]
.<image-file>
est l'image PNG d'entrée.<radius>
(argument facultatif) est le rayon du voisinage additionné, en pixels (plus petit est plus rapide, plus grand est (à peu près) meilleur.) Produit la partition et une image nomméeout.<image-file>
.Résultats
Plus de bonbons pour les yeux
la source
if (o_neighborhood > o_max_neighborhood) o_max = *o, o_max_neighborhood = o_neighborhood;
seul ce code le définit. cependant, en raison de nan impliqués, la comparaison est toujours fausse, donc o_max n'est jamais défini et utilisé non initialisé.Python 3, score = 1,57
D'abord, notre serpent parcourt l'image en créant des lignes verticales à égale distance les unes des autres.
Nous pouvons étendre ce serpent en prenant deux points l'un à côté de l'autre sur une ligne verticale et en créant une boucle dont les points d'extrémité sont eux.
Nous organisons les points en paires et pour chaque paire, nous stockons la taille et la valeur de luminosité moyenne de la boucle qui donne la luminosité moyenne la plus élevée.
À chaque étape, nous choisissons la paire avec la valeur la plus élevée, étendez sa boucle pour obtenir une luminosité moyenne maximale sur l'extension et calculons la nouvelle taille de boucle et la valeur de luminosité optimales pour la paire.
Nous stockons les triplets (value, size, point_pair) dans une structure de tas triée par valeur afin que nous puissions supprimer le plus grand élément (dans O (1)) et ajouter le nouveau modifié (dans O (log n)) efficacement.
Nous nous arrêtons lorsque nous atteignons la limite de nombre de pixels et ce serpent sera le serpent final.
La distance entre les lignes verticales a très peu d'effet sur les résultats, donc un pixel constant de 40 pixels a été choisi.
Résultats
Remarque: l'image originale "The Scream" n'était pas disponible, j'ai donc utilisé une autre image "The Scream" avec une résolution similaire.
Gif montrant le processus d'extension du serpent sur l'image "tourbillon":
Le code prend un (ou plusieurs noms séparés par des espaces) de stdin et écrit les images de serpent résultantes dans des fichiers png et imprime les scores sur stdout.
la source
Python 2 (score: 0,0797116)
Juste un algorithme gourmand très simple et naïf pour faire rouler la balle.
Sortie:
la source
sum of brightnesses of eaten pixels / amount of eaten pixels
est la bonne formule, n'est-ce pas? Peut-être que c'est juste un algorithme vraiment terrible;)The average brightness of pixels Joe eats / The average brightness of the pixels in the picture*
Java (score: 0,6949)
Un algorithme simple qui mange le pixel le plus brillant des quatre pixels entourant le pixel actuel. Dans le cas d'une égalité, le pixel mangé est aléatoire, ce qui entraîne des scores différents et des images résultantes à chaque exécution. En tant que tel, les scores ci-dessous sont les moyennes de plus de 50 exécutions sur chaque image.
Pour l'exécuter, modifiez les trois arguments (existants en tant que constantes de classe) dans la source, ou passez-les via la ligne de commande sous la forme
java HungryImageSnake <source> <iterations> <printScores>
où se<source>
trouve le fichier source de l'image à manger,<iterations>
est le nombre de fois où manger l'image (en prenant le score moyen et la sauvegarde du meilleur score sur toutes les itérations), et il<printScores>
est vrai d'imprimer le score de chaque itération ou faux de ne pas.Scores moyens, par image, sur cinquante itérations:
Meilleurs scores, par image, sur les mêmes cinquante itérations:
Images des parcours avec le score le plus élevé:
Comme le montrent les images, bien moins d'un tiers des pixels sont réellement mangés, car le serpent est parfois coincé parmi les pixels qu'il a déjà mangés, auxquels il reste coincé dans la zone morte jusqu'à ce que le caractère aléatoire de ses mouvements le ramène à une partie comestible de l'image.
Également à la suite de la restauration des pixels par le serpent, les scores sont biaisés vers le bas, car la luminosité zéro des pixels morts est à nouveau prise en compte dans la moyenne. Je m'attendrais à voir des scores beaucoup plus élevés si l'algorithme de notation était modifié pour ne diviser que par le nombre de mouvements qui ont conduit à manger de nouveaux pixels, plutôt que tous les mouvements (y compris ceux où le serpent mange un pixel maintenant mort qu'il a déjà mangé auparavant) ).
Bien sûr, une meilleure approche serait de créer une sorte d'heuristique de luminosité pour chaque pixel et de trouver le chemin des
width * height / 3
pixels avec la luminosité moyenne la plus élevée, mais je doute que cette approche soit optimale en temps d'exécution, en particulier sur des images plus grandes, comme le nombre des permutations possibles seraient très importantes. Je pourrais peut-être essayer une certaine forme de cette approche plus tard et la publier dans une réponse distincte si c'est le cas.la source
Python 2, score: 1,205
J'ai mis au point une solution Python rapide il y a quelque temps, mais j'ai oublié de la publier. C'est ici. Il trouve les blocs les plus riches de l'image, puis se déplace vers chaque bloc, mangeant tous les meilleurs blocs auxquels il vient.
Résultats
Exemple d'image
Code Python 2.7
la source