Предисловие
Поскольку сегодня я стрелял в стрельбу из лука 900 раундом ранее (10 заканчивается по 6 стрел в конце и 10 заканчивается по 3 стрелы в конце, всего 90 стрел и максимальный счет 900), я подумал об этом испытании.
В стрельбе из лука (при условии, что вы стреляете по целевому лицу, предоставленному FITA [листу бумаги, на который вы стреляете)), для каждой стрелки вы можете получить максимальный балл 10. Целевая грань содержит 10 или 11 колец с уменьшающимся диаметром, вложенные друг в друга Начиная с внутреннего кольца, они отсчитываются от 10 баллов до одного балла (а в случае 11 колец есть вторичное самое внутреннее кольцо, которое считается как «X», которое оценивается как 10, но используется в случаях разрыва связи как чем выше значение). Заметим:
Конечно, я имею в виду оценку FITA Metric, как показано на иллюстрации выше. Если вы присмотритесь, вы можете увидеть самое внутреннее кольцо, которое представляет собой заштрихованную пунктирную линию, счет которой не отмечен. Это «Х», о котором я говорил, но вам не придется обращать на это внимание, если только вы не будете бороться за бонус.
Вызов
Создайте функцию (или полную программу, если язык не поддерживает функции), которая получает идеально квадратное изображение в качестве входных данных (или имя файла изображения, если это необходимо), содержащее некоторое количество зеленых (HEX # 00FF00, RGB (0, 255, 0)) точек некоторого размера и возвращает счет. Изображение может содержать данные, отличные от зеленых точек , но зеленый цвет всегда будет иметь одинаковый оттенок.
Вы можете себе представить, что квадратное изображение представляет целевую грань, причем самое наружное кольцо соприкасается в 4 точках (верхний центр, нижний центр, правый центр, левый центр). Представленная целевая грань всегда будет иметь одинаковую пропорцию, причем все кольца имеют ширину ровно 1/20 ширины входного целевого изображения. В качестве примера, учитывая входное изображение с входными размерами 400 на 400 пикселей, вы можете предположить, что каждое кольцо имеет внутреннюю ширину 20 пикселей, как показано ниже:
Разъяснения
- Если дотронуться до двух отдельных колец, считается высшее из двух колец
- Вам не нужно автоматически учитывать промахи или случай «х», если только вы не пытаетесь получить бонус
- Вы можете предположить, что зеленые круги не перекрываются
- Вы также можете предположить, что на изображении отсутствуют другие пиксели этого зеленого цвета.
- Изображение будет в формате PNG, JPEG или PPM (на ваш выбор)
- Библиотеки внешней обработки изображений разрешены, если они созданы до публикации этого вопроса
- Вы можете предположить, что все зеленые круги на одной цели будут иметь одинаковый диаметр
- Если вы снимаете (ха) на бонус перекрывающихся кругов, вы можете предположить, что хотя бы один круг на изображении не имеет другого перекрывающегося круга.
- Стандартные лазейки запрещены
Контрольные примеры
В следующих двух случаях каждый должен набрать 52 (или в случае бонусов 52 с 1 'x' и 1 промахом):
И этот последний контрольный пример должен набрать 25 :
бонус
- -25 байт, если вы также возвращаете количество пропусков (вне любого из колец)
- -30 байт, если вы также возвращаете количество X (предположим, что самый внутренний x равен 3/100-й ширины изображения, а 10 - 2/100-й ширины изображения. Пропорции 1-9 остаются неизменными)
- Количество байтов -35%, если вы учитываете перекрывающиеся круги
Это код гольф, поэтому выигрывает наименьшее количество байтов. Веселиться!
источник
Ответы:
Обработка 2, 448-25 = 423 байта
Считывает из файла изображения f цикл по пикселям, пока не станет зеленым, а затем заливка заполняет круг, определяющий точку, которая находится ближе всего к центру. Затем добавляет этот счет к общему количеству. если оценка отрицательная, она добавляется к счетчику пропущенных.
Программа выведет 2 числа, первое - это счет, а второе - количество пропущенных.
Вы можете получить обработку здесь
источник
Perl 5 + GD: 225 - 25 = 200
Изменить: нашел причину неправильного чтения пикселей в индексированных PNG и применил обходной путь.
По какой-то причине в библиотеке GD значения зеленого пикселя читаются как (4,254,4). Я не уверен, относится ли это к файлам PNG, включенным в вопрос.Разрывы строк могут быть удалены в коде ниже.Принимает изображение PNG на вход и печатает 2 значения: Количество точек и промахов. Например:
Последнее изменение:
В режиме истинного цвета, который мне в любом случае понадобился, индексы цвета используются
getPixel
иfill
являются просто целочисленными значениями RGB, поэтому нет необходимости использоватьrgb
иcolorAllocate
для преобразования в и из этих индексов.Объяснение:
sub v
которого пропускает параметр$_
вместо стандартных параметров, поскольку он короче).источник
Haskell -
579-25 = 554603-25-30576-25-30 = 521 байтСтратегия:
Вывод тройной (оценка, промахи, X), например,
(52,1,1)
для тестового изображения.Программа может не работать, если пиксель круга, ближайшего к центру, находится в пределах 3 пикселей от другого круга.
источник
all id
то же самое, что иand
.also, вы можете реализоватьj
с паттернамиj n m|PixelRGBA8 0 255 0 _<-getColor n m v=0<1|0<1=0>1
Mathematica -
371386 - 25 = 361Более оптимальное решение. Вычисляет ответ намного быстрее, чем мое решение на Python.
Python с PIL - тривиальное и неоптимальное решение, 961 байт
Это просто попытка продемонстрировать глупый подход к решению проблемы. Для запуска первых двух тестовых случаев требуется ~ 2 минуты, а для запуска третьего в моей системе - ~ 20 минут из-за быстро выстроенного, чрезвычайно ресурсоемкого и отталкивающего алгоритмически сложного кругового детектора. Несмотря на это, он действительно отвечает требованиям, хотя он, безусловно, не оптимально для игры в гольф. Чем больше зеленого на изображении, тем больше времени требуется для его запуска.
Берет объект изображения PIL и возвращает результат.
Шаги, которые нужно предпринять:
n
, если они есть, и добавьте их в кругисточник
a
может быть записана какa=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]