Préface
Alors que je tirais un tir à l'arc 900 plus tôt dans la journée (10 bouts à 6 flèches par bout et 10 bouts à 3 flèches par bout, pour un total de 90 flèches et un score maximum de 900), j'ai pensé à ce défi.
En tir à l'arc (en supposant que vous tirez sur une face cible fournie par la FITA [le morceau de papier que vous tirez]), pour chaque flèche, vous pouvez réclamer un score maximum de 10. La face cible contient 10 ou 11 anneaux de diamètre décroissant, imbriqués les uns dans les autres. De l'anneau intérieur vers l'extérieur, ceux-ci sont comptés de 10 points à un point (et dans le cas de 11 anneaux, il y a un anneau le plus intérieur secondaire qui compte comme `` X '', qui marque 10, mais qui est utilisé dans les cas de départage comme la valeur la plus élevée). Observer:
Bien sûr, je me réfère au score métrique FITA, comme le montre l'illustration ci-dessus. Si vous regardez de plus près, vous pouvez observer l'anneau le plus intérieur, qui est une ligne pointillée décolorée, dont le score n'est pas marqué. C'est le «X» auquel je faisais référence, mais vous n'aurez pas à en tenir compte à moins de concourir pour le bonus.
Défi
Créez une fonction (ou un programme complet, si la langue ne prend pas en charge les fonctions), qui reçoit une image parfaitement carrée en entrée (ou un nom de fichier d'image, le cas échéant), contenant un certain nombre de verts (HEX # 00FF00, RGB (0, 255, 0)) points d'une certaine taille, et renvoie le score. L'image peut contenir des données autres que les points verts , mais le vert sera toujours exactement la même nuance.
Vous pouvez imaginer que l'image carrée représente le visage cible, avec l'anneau le plus extérieur touchant en 4 points (centre supérieur, centre inférieur, centre droit, centre gauche). La face cible représentée sera toujours de la même proportion, tous les anneaux ayant une largeur d'exactement 1 / 20e de la largeur de l'image cible en entrée. À titre d'exemple, étant donné une image d'entrée de dimensions d'entrée 400px par 400px, vous pouvez supposer que chaque anneau a une largeur intérieure de 20px, comme illustré ci-dessous:
Clarifications
- Si vous touchez deux anneaux séparés, le plus élevé des deux anneaux est compté
- Vous n'avez pas à prendre automatiquement en compte les échecs ou le cas 'x', à moins d'essayer le bonus
- Vous pouvez supposer qu'aucun cercle vert ne se chevauche
- Vous pouvez également supposer qu'aucun autre pixel de cette nuance de vert n'est dans l'image
- L'image sera au format PNG, JPEG ou PPM (au choix)
- Les bibliothèques de traitement d'images externes sont autorisées, si elles sont créées avant la publication de cette question
- Vous pouvez supposer que tous les cercles verts sur une cible auront le même diamètre
- Si vous photographiez (hah) pour le bonus des cercles qui se chevauchent, vous pouvez supposer qu'au moins un cercle dans l'image n'a pas un autre chevauchement
- Les failles standard sont interdites
Cas de test
Les deux cas suivants devraient chacun marquer 52 (ou dans le cas des bonus, 52 avec 1 'x' et 1 manque):
Et ce dernier cas de test devrait marquer 25 :
Prime
- -25 octets si vous renvoyez également le nombre de ratés (en dehors de l'un des anneaux)
- -30 octets si vous retournez également la quantité de Xs (supposez que le x le plus à l'intérieur soit 3 / 100ème de la largeur de l'image, et 10 est alors 2 / 100ème de la largeur de l'image. Les proportions 1-9 restent inchangées)
- -35% d'octets si vous tenez compte des cercles qui se chevauchent
C'est le golf de code, donc le moindre octet gagne. S'amuser!
la source
Réponses:
Traitement 2, 448-25 = 423 octets
Lit un fichier image f parcourt les pixels jusqu'à ce qu'il trouve le vert puis remplit le cercle en déterminant le point le plus proche du centre. Ajoute ensuite ce score à un total. si le score est négatif, il est ajouté à un compteur de ratés.
Le programme affichera 2 nombres, le premier est le score et le second est le nombre de ratés.
vous pouvez obtenir le traitement ici
la source
Perl 5 + GD: 225 - 25 = 200
Modifier: a trouvé la raison de la lecture incorrecte des pixels dans les fichiers PNG indexés et a appliqué une solution de contournement.
Pour une raison quelconque avec la bibliothèque GD, les valeurs des pixels verts sont lues comme (4,254,4). Je ne sais pas si cela est spécifique aux fichiers PNG inclus dans la question.Les sauts de ligne peuvent être supprimés dans le code ci-dessous.Prend une image PNG sur l'entrée et imprime 2 valeurs: Nombre de points et de ratés. Par exemple:
Changement de dernière minute:
En mode couleur véritable, j'avais besoin de toute façon des index de couleur utilisés par
getPixel
etfill
sont simplement des valeurs RVB codées en entier, donc pas besoin d'utiliserrgb
etcolorAllocate
de convertir vers et depuis ces index.Explication:
sub v
ce qui prend le paramètre$_
place des paramètres standard car il est plus court).la source
Haskell -
579-25 = 554603-25-30576-25-30 = 521 octetsStratégie:
La sortie est un triple (score, échecs, X), par exemple
(52,1,1)
pour l'image de test.Le programme peut échouer si le pixel d'un cercle le plus proche du centre se trouve à moins de 3 pixels d'un autre cercle.
la source
all id
c'est la même chose queand
.aussi, vous pouvez l'implémenterj
avec des protections de motifj n m|PixelRGBA8 0 255 0 _<-getColor n m v=0<1|0<1=0>1
Mathematica -
371386 - 25 = 361Une solution plus optimale. Calcule la réponse beaucoup plus rapidement que ma solution Python.
Python avec PIL - Une solution triviale et non optimale, 961 octets
Il s'agit simplement d'essayer de démontrer une approche idiote pour résoudre le problème. Il faut environ 2 minutes pour exécuter les deux premiers cas de test et environ 20 minutes pour exécuter le troisième sur mon système en raison du détecteur de cercle rapidement constitué, terriblement gourmand en ressources et répulsivement complexe sur le plan algorithmique. Malgré cela, il répond aux exigences, bien qu'il ne soit certainement pas joué de manière optimale. Plus il y a de vert sur l'image, plus il faut de temps pour courir.
Prend un objet image PIL et renvoie le score.
Étapes à suivre:
n
, s'il y a des pixels verts, ajoutez-les au cerclela source
a
peut être écrite sous la formea=lambda x,y,w,h:[(X,Y)for X in(x-1,x,x+1)for Y in(y-1,y,y+1)if w>X>-1<Y<h]