Ваша задача - написать программу или функцию, которая может заполнить данный прямоугольник простыми числами. width
И height
прямоугольник будет вход. Выходные данные должны быть списком height
строк, состоящих из width
цифр и пробелов. Каждая горизонтальная (слева направо) и вертикальная (сверху вниз) последовательность цифр (разделенных пробелами или границами прямоугольника) длиной 2 или более должна быть простым числом. Каждое простое число может быть использовано только один раз. Ведущие нули не допускаются. Завершающая новая строка необязательна на выходе.
Пример:
With input (5, 3) a valid output would be:
11 13
7 0
173
which scores 11, 13, 173, 17, 103 for a total of 5 points.
Гол:
Размер прямоугольника для выигрыша будет 80, 60
. Каждое простое число по горизонтали или вертикали длиной 2 или более в прямоугольнике приносит одно очко. Ответ с наибольшим количеством очков выигрывает. В случае ничьей победит самый ранний ответ.
Правила:
- Стандартные лазейки запрещены.
- Ваша программа не должна быть рассчитана на
80, 60
размер. Если я подозреваю, что ответ оптимизирован для этого размера, я оставляю за собой право изменить размер прямоугольника до100, 100
. - Используемые простые числа должны быть реальными простыми числами (не вероятностными или псевдопримерами). Ваша программа может вычислять или проверять числа во время выполнения или жестко их кодировать. Метод нахождения простых чисел не является важной частью задачи.
- Ваш ответ должен включать выходной текст и ваш код. Если ваша программа слишком велика, вы можете просто добавить код основного алгоритма с небольшим объяснением.
Изменить: Уточнил, что нужны реальные простые числа. Добавлен максимальный размер прямоугольника.
Редактировать 2: уточнил, какой код должен быть опубликован.
источник
Ответы:
Клинго с питоном ,
160016891740 простых чиселПодходить
Я создаю гигантскую проблему удовлетворения ограничений и решаю ее, используя промышленный анализатор удовлетворенности. Много магии ушло на то, чтобы сделать решатели удовлетворительности относительно быстрыми (хотя в целом проблема NP-завершена), но, к счастью, мне не нужно беспокоиться об этой части.
В частности, я фиксирую положение цифр в шаблоне, предназначенном для плотной упаковки 4- и 5-значных чисел с случайными 2- и 3-значными числами на границе, и добавляю ограничения, говорящие о том, что каждое число представляет собой отдельное простое число. В текущей упаковке используется большая часть всех четырехзначных простых чисел (854 из 1061).
Код
использование
Предупреждение: при 80 × 60 это занимает около 8 минут и использует 3 ГБ памяти. Возможно, вы захотите начать с меньших размеров, если хотите, чтобы он работал.
Выход (80 × 60, 1740 простых чисел):
источник
Smalltalk, 1098 простых чисел
Прежде всего, хороший сложный вопрос - о чем свидетельствует отсутствие нетривиальных ответов до сих пор.
У меня было решение готовить на работе, но мне пришлось ждать долгих выходных, чтобы успеть немного его почистить. Несмотря на это, он довольно «тяжелый», поэтому извините за длину этого ответа - к счастью, это не вопрос игры в гольф. По пути было много маленьких ошибок, но я уверен, что теперь в них нет ошибок, хотя есть много возможностей для улучшения и тонкой настройки.
язык
Моим языком выбора для такого рода вещей является Smalltalk - превосходная отладка и способность тестировать как ваш код превосходит все, что я знаю. Кроме того, даже не кодеры могут прочитать его и понять основы того, что происходит. Я ограничил приведенный ниже код интересной частью, потому что я думал, что подход и результаты будут более интересными, чем стандартный код, но файл полного кода вставляется сюда, если кто-то хочет его опробовать (просто сохраните как
*.st
и файл из браузера файлов в Pharo). Я использовал Pharo 4.0, который является FOSS и может быть загружен с pharo.org для Win / Mac / Linux. Также с удовольствием вставлю сюда полный код, но я взял «должен включать выводной текст и ваш код» в качестве предложения - дайте мне знать, если я ошибаюсь.Подходить
Итак, я подумал: а что, если бы вы могли начать с середины, собрать как можно больше длинных простых чисел в коробке и оттуда уйти? Давайте начнем с
Box
объекта, содержащегоmatrix
символы, а затем воспользуемсяStuffer
объектом, чтобы попытаться заполнить его, найдя лучшийInsertion
(другой объект) для каждой точки матрицы и для каждого простого числа (начиная с длинных). Pharo имеет приятныйMatrix
иPoint
классы с кучей полезных методов (хотя матрица способ использования ряда-мажорных обозначения по сравнению с использованием XY-координаты точек может получить немного запутанным , если вы не будете осторожны).Основные шаги моего алгоритма:
Stuffer
экземпляр для заданных размеров.Настраиваемый:
Для приведенной ниже матрицы я использовал 80x60, простые числа менее 20 000 (поскольку их общая длина составляет чуть менее 10 000 символов, т. Е. Максимум для заполненного, хотя и недопустимого, поля 100x100), и, после некоторых экспериментов, следующий рейтинг для
each
вставки :где
accidentalPrimes
перпендикулярные простые числа, «случайно» созданные при вставке между соседними простыми числами, иnumberOfOverlaps
количество перезаписываемых символов (например, при добавлении символа3
в конце11
для вставки113
). Первоначально у меня был больший весaccidentalPrimes
, но я получил еще несколько простых чисел, выполнив это таким образом - не совсем уверен, почему (не стесняйтесь тестировать / настраивать).Результат
Эта матрица содержит 1098 простых чисел, что составляет «нагрузку» около 70%.
Это простые числа (
box primesUsed asSortedCollection printString
):Как видите, некоторые из «случайных» простых чисел становятся довольно длинными ... 20 цифр для самого длинного. :-)
Детали
Чтобы понять, как это работает, вот результат выполнения первых нескольких шагов - вставка
19997
сначала (если вы посмотрите в середину большой матрицы, вы также увидите19997
там), а затем вниз по списку, где есть место в 5x5 поле (>
означает, что вставка идет вправо,v
значит идет вниз; все, что в{}
случайно добавлены простые числа:В вставке, показанной выше, поле становится размером 7x7 и заполняется содержимым 5x5 до следующей вставки. Я также пересчитываю простые числа, используемые в этой точке, потому что некоторые «освобождаются» из-за перезаписи (
11
были вставлены, но затем перезаписаны113
).Код
Вот наиболее важные части кода:
Stuffer класс
Сторона класса
Сторона экземпляра
Коробка класс
Сторона экземпляра
Коллекция
О, и я добавил один метод на стороне экземпляра
Collection
, просто для удобства:Запуск это
Чтобы запустить мой код, все, что мне нужно сделать, это выбрать следующий код в рабочей области («площадка» в Pharo) или в любой текстовой панели и «сделать это» из контекстного меню:
Остальной код довольно скучный.
Как я уже сказал, возможности для улучшения, но при 80х60, каждый прогон занимает более 3 минут на моей машине. Очевидно, что производительность не была моей заботой, но есть много простых чисел, летающих вокруг. Это конечно было интересным испытанием. :-)
источник
Javascript, оценка 659
Почти наверняка неоптимальный.
Результаты для 30x30:
И для случая 60x60:
источник