Тестирование первичности в Мануфактуре


13

Фон

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

Вызов

Ваша задача - создать программу, которая проверяет простоту числа.

На входе будет ряд из N синих маркеров в очереди. Если N простое, то ваша программа должна принять его (переместить робота в конец). Если N составное, то ваша программа должна отклонить его (куда-нибудь бросить на пол).

Параметры отправки

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

ваниль

Я создал пользовательский уровень 13x13 для создания и тестирования представлений. Уровень пользовательского тестирования выглядит следующим образом.

13x13 пользовательский уровень

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

1 -> reject
2 -> accept
4 -> reject
5 -> accept
7 -> accept
9 -> reject
11-> accept
15-> reject

Расширенная Сетка

Некоторые пользователи могут захотеть больше места, чем сетка 13x13. Вот ссылка на игровой пользовательский уровень 15x15, созданный путем изменения числа в URL:

15x15 пользовательский уровень

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

Мануфактура Esolang

Произошла адаптация Мануфактуры к языку на основе ASCII. Если вам нужен другой способ разработки / тестирования вашего творения, или если вы не можете разместить свое окончательное решение на игровой доске, вы можете использовать этот esolang. Вы можете найти информацию об этом esolang здесь:

Мануфактура esolang

Есть несколько несоответствий между esolang и реальной игрой. Например, конвейерные переходы обрабатываются по-разному. Старайтесь избегать использования этих несоответствий.

Более быстрый способ проверки

Игра очень медленная, когда дело доходит до программ, для выполнения которых требуется несколько тысяч шагов. Мое проверочное решение заняло 28042 шага, чтобы отклонить 15. Даже при 50-кратном ускорении в игре это просто занимает слишком много времени.

Я нашел этот очень полезный сайт . Просто скопируйте и вставьте ссылку на ваш ответ, и вы можете проверить свой ответ с конкретными входными данными. Процесс с 28042 шагами занял меньше секунды.

Стоит отметить, что он часто говорит что-то вроде «неправильно принято», даже если ваша машина работает правильно. Это потому, что веб-страница знает только контрольные примеры. Например, было бы сказано, что мое решение «неправильно приняло» число 3, хотя моя машина была на самом деле правильной.

Как победить

Критерием оценки является количество частей (занятых ячеек). Это код гольф, поэтому выигрывает представление с наименьшим количеством частей.

Для тех, кто интересуется, мое эталонное решение имеет 96 частей и помещается в сетку 13x13. Поиск лучшего алгоритма может привести к колоссальным улучшениям, поскольку я знаю, что использовал неоптимальный алгоритм.

Ответы:


10

53 части - сетка 11x11

Я только что научился играть в Мануфактуру 2 дня назад, так что она, вероятно, не очень оптимизирована для гольфа, но, по крайней мере, это решает проблему. Конечно, он реализует пробное деление путем многократного вычитания. Все делители от 2 до N-1 проверяются. Сложность времени должна быть O (N ^ 3), я считаю.

Решение из 53 частей

Ссылка на решение

Я был очень разочарован тем, что пришлось использовать конвейерную ленту :)

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