Снайперский паттерн премьер-ботаника


16

Самый длинный день в году - вот на что тратить лишнее время ...


обзор

Обратите внимание, что это не конкурс популярности и не графическая задача вывода - вам нужно только вывести строку из 65 536 нулей и единиц. Фрагмент стека в нижней части вопроса отобразит это как черно-белое изображение 256 на 256 и подсчитает ваш официальный счет. Затем вы можете сохранить изображение и загрузить его в свой ответ вместе с вашим кодом (поскольку вывод строки не будет соответствовать ответу Stack Exchange из 30000 символов).


счет

Оценка изображения - это сумма оценок отдельных пикселей. Оценка отдельного пикселя сумма subscores для каждого из неортогональных , простых расстояний пикселей , которые имеют противоположный цвета на пиксел набрали. Подсчет для каждого такого пикселя - это 1/pгде pрасстояние.

В контексте этого вопроса термины имеют следующие определения:

  • Неортогональный: пиксель не ортогонален оцениваемому пикселю, если он не находится в той же строке и не находится в том же столбце.

  • Простое расстояние: пиксель находится на простом расстоянии от оцениваемого пикселя, если они разделены евклидовым расстоянием, которое является в точности простым числом. В частности, расстояние - это минимальное расстояние, измеренное тороидально - верхний левый пиксель - это расстояниеsqrt(2)от нижнего правого пикселя (все 4 ребра оборачиваются).

  • Противоположный цвет: пиксель имеет цвет, противоположный оцениваемому пикселю, если их значения равны 1. То есть, первое равно 0, а второе равно 1 или первое равно 1, а второе равно 0.

Фрагмент стека включает в себя пример кода, который показывает, как оценивать изображение, но не включает каких-либо оптимизаций или эффективного подхода, просто исправьте код, чтобы можно было последовательно оценивать итоговые изображения.

Если что-то в коде неверно, пожалуйста, сообщите мне об этом в комментариях или в чате .

JavaScript может быть не обязательно лучшим языком для ответа на этот конкретный вызов. Обратите внимание, что код Snippet намеренно не дает никаких подсказок относительно более быстрых подходов. В него будут введены только те эффективности, которые уже были продемонстрированы в существующем ответе.


Визуализация

Подсчет пикселей

Для интуитивного понимания распределения баллов оценки здесь (фиолетовым цветом) представлены пиксели неортогонального простого расстояния для пикселя (128, 128) изображения 256 на 256:

изображение неортогонального распределения простых расстояний


Случайное изображение

Это случайно сгенерированное изображение из примера ответа Python 3. Он набрал 138 267,64 балла и дает вам возможность выиграть.

случайно сгенерированное изображение


вход

Код не требует ввода.

Выход

Код должен вывести строку из 65 536 нулей и единиц, представляющих пиксели черно-белого изображения 256 на 256. Цифры должны быть непрерывной строкой без разделителей. Копирование и вставка могут оказаться проще, если вы выводите в файл, но это ваше дело.

Ваш код может также выводить другую информацию, которая будет вам полезна, если строку можно скопировать и вставить в фрагмент стека. Например, вы можете захотеть выводить в файл лучшую, но пока еще строку, а лучшую оценку - в STDOUT через регулярные промежутки времени, позволяя пользователю выбрать, когда следует остановить поиск.


Фрагмент стека

Как указывает Sp3000 , сниппету потребовалось 10 минут, чтобы вычислить оценку, которая слишком медленная, даже для намеренно неэффективной эталонной реализации. Я отредактировал в предложении Sp3000 улучшенное предварительное вычисление смещения пикселей для оценки, и теперь для подсчета очков требуется несколько секунд.


Если вы используете вывод или код другого ответа в качестве отправной точки для своего собственного кода, пожалуйста, не забудьте дать ссылку и ссылку на вспомогательный ответ. Ответы на этот вопрос не нужно указывать в качестве примера ответа или кода в вопросе.

Кредит Рэндаллу Манро на срок Снайперский ботаник

Ответы:


36

CJam, оценка 276496,9062958626

2,128*_(]128*

Это оказывается оптимальным, потому что: не существует неортогональных пар с расстоянием 2. Таким образом, расстояние должно быть нечетным, как и расстояние в квадрате. Поскольку p 2 = x 2 + y 2 , одно из x и y (в квадрате или нет) должно быть нечетным, а другое должно быть четным. Эти точки всегда имеют противоположный цвет на этом изображении.

Это и его негатив также являются единственными оптимальными решениями. В оптимальном решении никакие неортогональные пиксели с простым расстоянием не должны иметь одинаковый цвет. Существуют противоположные по диагонали противоположные пиксели, такие как (3,4) и (4,3). Заполняя пиксели противоположного противоположного цвета и т. Д., Мы можем получить диагональ с тем же цветом. Начиная с каждого пикселя по диагонали, мы можем заполнить все антидиагонали одинаково. Обратите внимание, что они обертывают вокруг. Это все еще оптимально, если они этого не делают.


3
Я надеялся, что людям потребуется больше времени, чтобы заметить это ...
trichoplax

1
Мне потребовалось много времени, чтобы понять, что было оптимальное решение при написании этого вопроса, поэтому я подумал, что это будет стоить опубликовать как вызов. Как ты увидел это так быстро? Это было просто очевидно, или у вас был определенный мыслительный процесс?
Трихоплакс

4
PS Я не знаю, когда вы увидели этот вопрос, но оптимальное решение через 71 минуту после того, как вопрос был опубликован, заслуживает награды - мне просто нужно подождать 2 дня, прежде чем я смогу его назначить ...
trichoplax

@trichoplax Из вашего первого изображения казалось, что в одной диагонали много точек. Вначале я думал об использовании более широких полос. А потом я открыл Gimp, чтобы проверить мою идею. И, к моему удивлению, я получил полностью черное изображение, когда заполнил его этим узором.
jimmy23013

8
@trichoplax Учитывая, что вы знали, что существует оптимальное решение, я думаю, вам лучше было бы пересмотреть вопрос, чтобы сделать его менее разрешимым. Хотя jimmy23013 нашел его быстро, всегда остается вопросом времени, когда кто-то его находит, и тогда все кончается.
xnor

1

Python 3, оценка 138267,64

Это минимальный ответ как пример того, что требуется, и как что-то, чтобы победить ...

Это включает

  • Название языка.
  • Счет из фрагмента стека в вопросе.
  • Изображение сохранено из фрагмента стека.
  • Код, используемый для получения строки из 65 536 нулей и единиц.

Выход

случайно сгенерированное изображение

Код

from random import random

output_string = ''
filename = '65536digits.txt'

for t in range(65536):
    digit = int(random() * 2)
    output_string += str(digit)

with open(filename, 'w') as output_file:
    output_file.write(output_string)

Это всего лишь пример. Python не обязательно может быть лучшим языком для конкурентных ответов на этот конкретный вызов.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.