Prefácio
Como eu estava disparando um tiro com arco 900 no início de hoje (10 termina em 6 flechas por fim e 10 termina em 3 flechas por fim, num total de 90 flechas e uma pontuação máxima de 900), pensei nesse desafio.
No arco e flecha (supondo que você esteja atirando em uma face-alvo fornecida pela FITA [o pedaço de papel em que você dispara]), para cada flecha você pode obter uma pontuação máxima de 10. A face-alvo contém 10 ou 11 anéis de diâmetro decrescente, aninhados um dentro do outro. Do anel interno para fora, eles são contados de 10 pontos a um ponto (e no caso de 11 anéis, existe um anel interno secundário que conta como 'X', que tem 10 pontos, mas é usado em casos de desempate como o valor mais alto). Observar:
Obviamente, estou me referindo à pontuação do FITA Metric, como visto na ilustração acima. Se você olhar atentamente, poderá observar o anel mais interno, que é uma linha pontilhada desbotada, cuja pontuação não está marcada. Esse é o 'X' ao qual eu estava me referindo, mas você não terá que prestar atenção a menos que esteja competindo pelo bônus.
Desafio
Crie uma função (ou programa completo, se o idioma não suportar funções), que receba uma imagem perfeitamente quadrada como entrada (ou nome do arquivo da imagem, se necessário), contendo algum número de verde (HEX # 00FF00, RGB (0, 255, 0)) pontos de algum tamanho e retorna a pontuação. A imagem pode conter dados que não sejam os pontos verdes , mas o verde sempre terá exatamente a mesma tonalidade.
Você pode imaginar que a imagem quadrada representa a face do alvo, com o anel mais externo tocando em 4 pontos (centro superior, centro inferior, centro direito, centro esquerdo). A face do destino representada sempre terá a mesma proporção, com todos os anéis com uma largura de exatamente 1/20 da largura da imagem de destino da entrada. Como exemplo, dada uma imagem de entrada com dimensões de 400px por 400px, você pode supor que cada anel tenha uma largura interna de 20px, conforme ilustrado abaixo:
Esclarecimentos
- Se tocar em dois anéis separados, o mais alto dos dois anéis será contado
- Você não precisa contabilizar automaticamente os erros ou o caso 'x', a menos que tente o bônus
- Você pode assumir que nenhum círculo verde se sobrepõe
- Você também pode assumir que nenhum outro pixel dessa tonalidade de verde está na imagem
- A imagem estará no formato PNG, JPEG ou PPM (sua escolha)
- Bibliotecas de processamento de imagem externas são permitidas, se criadas antes da publicação desta pergunta
- Você pode assumir que todos os círculos verdes em um alvo terão o mesmo diâmetro
- Se fotografar (hah) pelo bônus de círculos sobrepostos, você pode assumir que pelo menos um círculo na imagem não possui outro sobreposto
- As brechas padrão não são permitidas
Casos de teste
Os dois casos a seguir devem pontuar 52 (ou, no caso de bônus, 52 com 1 'x' e 1 falta):
E este último caso de teste deve marcar 25 :
Bônus
- -25 bytes se você também retornar o número de erros (fora de qualquer um dos toques) também
- -30 bytes se você também retornar a quantidade de Xs (suponha que o x mais interno seja 3 / 100º da largura da imagem e 10 seja 2 / 100º da largura da imagem. As proporções de 1 a 9 permanecem inalteradas)
- -35% de contagem de bytes, se você considerar círculos sobrepostos
Isso é código de golfe, então o mínimo de bytes vence. Diverta-se!