Существует 40 способов размещения направленного гамильтонова пути на сетке 3 × 3: на
этом графике ( спасибо Sp3000! ) Показаны только 20 ненаправленных путей. Пройдите каждую цветную линию в обоих направлениях для 40 направленных путей.
Вызов
Используя только ASCII для печати , напишите сетку символов 3 × 3, например:
ABC
DEF
GHI
Когда каждый из 40 направленных путей считывается из этой сетки как 40 однострочных, 9-символьных программ, цель состоит в том, чтобы каждая программа выводила уникальное целое число от 1 до 40. Делать это для всех 40 путей кажется трудным и маловероятным, поэтому вам нужно только заставить его работать на столько путей, сколько сможете.
Представление, чьи 40 путевых программ выводят самые разные числа от 1 до 40, будет победителем. Tiebreaker переходит к более раннему представлению.
Программы путей, которые выдают ошибку или не выводят целое число от 1 до 40, или выводят целое число, которое другая пройденная программа не учитывает. В частности:
- Программы, которые выдают ошибку при компиляции, запуске или выходе, не учитываются. Предупреждения в порядке.
- Программы, которые не выводят целое число от 1 до 40 или выводят что-то слегка искаженное, например,
-35
или35 36
не учитываются. - Программы, которые требуют пользовательского ввода для получения результата, не учитываются.
- Программы, которые никогда не заканчиваются, не учитываются.
- С этого момента , программы, которые не являются детерминированными, не учитываются.
- В противном случае действительные программы, которые выводят целое число от 1 до 40, которое уже выполнила другая действительная программа, не учитываются. (Первая программа будет учитываться.)
- Только программы, которые выводят целочисленные представления чисел от 1 до 40 (включительно), засчитываются в общую сумму. Числа должны быть в обычном
1
,2
...39
,40
формате, если это не является нормой для вашего языка. (Завершающий перевод строки в выводе в порядке.) - Какие номера выводят ваши программы и в каком порядке они не имеют значения. Только количество различных целых чисел из допустимых программ имеет значение.
Все path-программы должны быть запущены на одном языке. Однако на самом деле «программы» могут быть функциями (без обязательных аргументов) или командами REPL , а также полными программами, которые печатают или возвращают целевое целое число. Вы можете смешивать и сопоставлять функции, команды REPL и полные программы.
Ваши 9 печатных символов ASCII не должны быть различимыми.
пример
Если ваша сетка 3 × 3 была
ABC
DEF
GHI
и ваши 40 программ и выходов выглядели так
ABCFEDGHI -> 26
ABCFIHEDG -> 90
ABCFIHGDE -> 2
ABEDGHIFC -> syntax error
ADEBCFIHG -> prints 40 but then errors
ADGHEBCFI -> 6
ADGHIFCBE -> 6
ADGHIFEBC -> 6
CBADEFIHG -> runtime error
CBADGHEFI -> 3
CBADGHIFE -> 4
CFEBADGHI -> -32
CFIHEBADG -> 38.0
CFIHGDABE -> "36"
EDABCFIHG -> 33
EFCBADGHI -> no output
EHGDABCFI -> compilation error
EHIFCBADG -> 8
GDABCFEHI -> 22
GHEDABCFI -> 41
IHGDEFCBA -> 0
GDEHIFCBA -> '9'
EDGHIFCBA -> +10
CFIHGDEBA -> 11
GHIFCBEDA -> error
IFCBEHGDA -> error
EBCFIHGDA -> prints 23 but then loops infinitely
CBEFIHGDA -> randomly prints either 24 or 44
GHIFEDABC -> error
IFEHGDABC -> 30
EFIHGDABC -> 39
IHGDABEFC -> 7
GDABEHIFC -> 29
EBADGHIFC -> -1
GHIFCBADE -> 26
IHGDABCFE -> 1
IFCBADGHE -> error
GDABCFIHE -> no output
IHEFCBADG -> no output
IFCBADEHG -> "quack"
Ваша оценка будет 14, потому что есть 14 различных целых чисел от 1 до 40, а именно 26 2 6 3 4 33 8 22 11 30 39 7 29 1
.
источник
123654789
Ответы:
PARI / GP - 24
PARI / GP игнорирует пробелы между цифрами, так что
1 8 2
, например, обрабатывается как182
. То же самое может работать для Perl, заменяя пробелы подчеркиванием. Я не исчерпал все пространство поиска, так что могут быть лучшие кандидаты.Программа может быть передана в gp as
gp -q -f program.gp
или интерактивно в repl.Выход
Все значения, кроме 4, находятся в требуемом диапазоне, с 12 повторяющимися записями.
Обновить
Я закончил анализировать, есть шесть различных 23-х и только один 24 (как читается по строкам):
Программа, которую я использовал для хруста, ниже. PARI / GP имеет ограниченные возможности по обработке строк, поэтому имеет дело в основном с массивами символов (иначе
Vecsmall
). Операторы испытанные являются+
,-
,*
,\
(пол дел),%
,;
(выражение сепаратора, по существу , отбрасывает все перед ним), и(пространство, как описано выше).
^
Можно также добавить оператор экспоненты , но он становится слишком медленным для исчерпывающего тестирования.источник
Deadfish , 18
На самом деле это был первый язык, который я попробовал, прежде чем рассматривать инфиксные операторы. Я выкладываю это сейчас для полной радости идеи, что Deadfish может быть полезен для чего-то.
Для тех, кто не знает Deadfish,
i
это приращение,s
квадрат иo
вывод, с аккумулятором, начинающимся с 0 (здесь также есть 4-я инструкцияd
для декремента, которая не используется). Тот факт, что у нас нет автоматической печати и нам нужно ее использовать,o
является серьезным недостатком, но, как ни странно, Deadfish здесь не слишком страшен, учитывая все обстоятельства. Получается, что оптимальное размещение оператора вывода находится посередине.источник
Python REPL и многое другое,
2223Ключевое наблюдение: если вы раскрашиваете сетку как шахматную доску, путь чередует цвета сетки, поскольку он идет и начинается и заканчивается на том же цвете.
Все еще грубой силы к лучшему.Попытка с+*%
(и даже**
для языков, где^
возведение в степень) не принесла ничего лучшего, к сожалению. Я также попытался добавить побитовые операторы, и только^
(xor), казалось, слегка помогло, но поиск занял слишком много времени, поэтому я сдался.источник
6+7*5%6%4
,6+7*4%6%5
и6+8*4%6%5
(слева направо, сверху вниз), и ничего другого.+
и-
в углах / в центре? Поскольку они являются одинарными, а также бинарными операторами, это все равно должно приводить ко всем допустимым выражениям. Маловероятно, что это приведет к лучшему решению, но по крайней мере это расширяет пространство поиска. Хм, на самом деле, это может быть проблемой, потому что вы можете получить последовательности операторов.J, 15
Это выводит только действительные числа, но многие являются дубликатами. Уникальные значения
17 11 16 28 31 23 13 10 21 33 18 24 22 29 27
. Вы можете определенно добиться большего успеха, изменив операторы и соответствующие целые числа.источник
Yes
,> <>, 36 *
Если вам повезет!
Поскольку задача не требует, чтобы код был детерминированным, нам нужно только доказать, что можно (даже если это невозможно) вернуть 36 чисел, и все готово.Думаю, было хорошо, пока это продолжалось.(Для тех, кто не знаком с> <>, отличное введение можно найти здесь )
Я решил использовать инструкцию «x» в> <>, которая меняет направление указателей инструкций на произвольно вверх, вниз, влево или вправо. Поскольку наш код будет состоять только из одной строки, это означает, что мы можем рассматривать только случаи, когда он идет вправо или влево, поскольку, если указатель поднимается или опускается, он просто снова нажимает на инструкцию «x».
Инструкция «n» выскакивает число в верхней части стека и печатает его. Однако, если стек пуст и нечего выталкивать, возникает ошибка.
Инструкция "l" просто помещает длину стека в стек (и, к счастью для нас, она не отправляет ошибку, если стек пуст), поэтому, например, если бы стек был пустым, а "l" вызывался, он поместит 0 в стек. Если бы мы теперь снова вызывали «l», то, так как в стеке есть один элемент (0), он бы выдвинул 1 на вершину стека, и теперь это будет означать, что в стеке будет две вещи, и это будет означать, что если бы мы снова вызвали «l», мы бы поместили 2 в стек и т. д. Таким образом, мы можем использовать «l», чтобы вставить произвольное число в стек с помощью метода, показанного ранее.
";" инструкция завершает программу.
Идея использования «x» заключается в том, что, например, если в коде был только один «x» (где A, B, C, D - некоторые инструкции):
Программа выполнит A, затем B, а затем C, и при достижении «x» у нас будет две возможности: код либо будет продолжать работать правильно, и ударит «;» и выходит или идет налево и выполняет C, затем B, затем A, затем D и только затем выходит. Таким образом, если наш код содержал один «x», программа получает два возможных программных потока, из которых мы можем выбрать наиболее подходящую программу.
Если существует два или более «х», то мы получаем бесконечное число возможных программных потоков.
В нашем коде есть пять «x» es, кроме того, каждый из них находится в «начальной ячейке» гамильтоновых путей, что означает, что каждая отдельная программа будет начинаться с «x», и каждая программа будет иметь структуру:
Где A, B, C, D принадлежат {; , n, l, l} Это означает, что есть только 12 уникальных программ. Кроме того, поскольку мы всегда начинаем с «x», мы можем посмотреть на случай, когда программа уходит влево, поэтому симметричные программы также могут рассматриваться как одинаковые. До симметрии есть только 6 различных возможных программ. Только 4 из них встречаются в программах, сгенерированных как гамильтоновы пути:
Давайте посмотрим на первую программу «xnxlxlx; x», если мы пойдем прямо на первом шаге, мы нажмем команду print, что вызовет ошибку, поскольку у нас ничего нет в стеке. Если мы идем налево, мы нажимаем на команду завершения программы. Таким образом, мы не можем вывести любое число из этих программ.
Вторая программа, "xlxnxlx; x", намного более обнадеживающая, так как при переходе вправо в начале ноль ставится в стек, если мы затем идем влево при следующем "x", наш стек получает единицу, затем Если мы снова идем направо, у нас есть 2, который мы можем затем распечатать и продолжить движение вправо, чтобы завершить программу. Мы можем заметить, что на самом деле мы можем напечатать любое четное число , так как в начале части «xlx» мы можем достичь произвольного размера, пройдя вправо, затем влево, затем вправо снова определенное количество раз.
Аналогично можно видеть, что третья программа xnxlx; xlx может вывести любое нечетное число , перейдя вначале налево и затем повторив процедуру «xlx» только на этот раз, двигаясь влево, затем вправо, затем влево.
И четвертая программа по сути такая же, как и вторая программа, и может выводить любое четное число .
Итак, для необходимых программ у нас есть:
Это 4 программы, которые не могут вывести числа, 20, которые могут вывести любое четное число, 16, которые могут вывести любое нечетное число. Поскольку в диапазоне от 1 до 40 имеется ровно 20 четных чисел и не менее 16 нечетных чисел, существует вероятность того, что в этом кодовом блоке будет 36 различных чисел в диапазоне от 1 до 40.
источник
GolfScript, 8
В настоящее время самое высокое решение для оценки. : PБыло приятно, пока это продолжалось.программы
источник
0)1#2#3(4
15. Красивая симметрия тоже.CJam, 14
Ниже рабочие программы:
Сгенерированные значения: [1, 3, 4, 11, 13, 14, 20, 21, 22, 23, 24, 30, 31, 33]
источник
постоянный ток (20)
32 выхода, 20 из них различны (помечены знаком
$
)2, 3, 4, 5, 6, 8, 9, 10, 11, 12, 14, 15, 16, 20, 22, 24, 25, 32, 34, 40
источник