Ваша задача - создать самую длинную итерацию периода , в которой длина каждой программы в последовательности ограничена 500 байтами.
То есть, если вы повторите следующие шаги:
- Начните с вашей начальной программы
- Запустите текущую программу
- Вернитесь к шагу 2
В конечном итоге вы вернетесь к своей первоначальной программе. Количество программ в цикле - это ваш счет, который вы пытаетесь максимизировать.
Ни одна из программ не может вызвать каких-либо ошибок. Каждая программа должна также выполняться одинаково (например, без разных версий, реализаций, опций компилятора, платформ и т. Д.) (РЕДАКТИРОВАТЬ: Да, любое внешнее состояние, такое как состояние генератора псевдослучайных чисел, было включено в последний Заявление. Внешнее состояние должно быть «сброшено» после каждого запуска. Если вы используете истинные случайные числа, предполагается худший случай.)
Что отличает эту задачу от самой длинной итерации за период (кроме 100 против 500), так это то, что каждая программа в цикле также должна иметь размер 500 байт или меньше. Это означает, что самый длинный возможный цикл равен (256 ^ 501 - 1) / 255 или меньше. Это, конечно, большое число, но не такое большое с точки зрения того, сколько кода требуется для вычисления. Таким образом, задача состоит в том, чтобы использовать как можно больше (256 ^ 501 - 1) / 255 возможностей, а не занятие занятого бобра.
Программы не имеют доступа к своему исходному коду. Однако пустая программа будет разрешена , если вы хотите ( до тех пор , пока вы будете следовать другим правилам).
Так как проверять программы вручную было бы сложно, вы можете вычислить счет, используя теоретические методы. Вы должны включить объяснение оценки и правильности в вашу программу. Если вы не можете определить счет, вы можете вместо этого использовать нижнюю границу количества программ в цикле в качестве значения по умолчанию. Вам разрешается обновлять это по мере того, как вы находите лучшие нижние границы, или если вы находите точную фактическую оценку.
Это вызов кода , поэтому выигрывает самый высокий балл!
РЕДАКТИРОВАТЬ: Рекомендуется, чтобы вы написали, что ваш счет в научной записи, чтобы ответы были легче сопоставимы. Прекрасно иметь и другие формы партитуры, особенно если они более четко связаны с вашей программой. Также читателям предлагается отредактировать предыдущие ответы, чтобы соответствовать этому.
источник
Ответы:
Perl 6 ,126398≈ 8,86 × 10835 итераций
Попробуйте онлайн!
Это повторяет все возможные комбинации первых 126 байтов длиной 398 и ниже (исключая строки с ведущими байтами NUL). Если вы хотите увидеть, что он действительно возвращается к первой итерации, вы можете уменьшить длину до 1, изменив ограничение следующим образом .
Объяснение:
Каждая итерация увеличивает строку, сохраненную в форме базы 126, а затем преобразует ее обратно в базу 126. Она делает это до тех пор, пока не достигнет строки длиной 399, а затем сбрасывает строку обратно до пустой снова. Если у вас возникли проблемы с концептуализацией числа, представьте вместо этого десять байтов. Начиная с104 - 1 итераций (включая
0
, увеличивайте до 4 цифр1000
и сбрасывайте. Это0
или пустую строку в случае моей программы).источник
Рунические чары ,
64654 106; 122 387 -1 ≈ 2,638 × 10 807 итерацийПопробуйте онлайн!
Предупреждение:
€
неправильно отображается, оно должно быть `` (0x80).Вместо стека используйте строку и операторы стека, измененные с помощью,
͍
чтобы изменить строку, а не стек (см. Предыдущую версию). Таким образом, каждый символ ограничен 1 байтом (диапазон 0-127, минус проблемные символы), но их более чем в 3 раза больше (из-за меньшего количества шаблонов обработки из-за отсутствия необходимости пропускать символы объединения Юникода, как а также некоторые другие байтовые сбережения) достигается большее количество итераций.Если разрешено кодирование в качестве истинного байта с обратным порядком байтов (то есть, если байтовые значения выше 127 без пересекающихся
0x00
байтов), это может обеспечить 251 387 -1 ≈ 4,717 × 10 928 итераций. Однако латинская кодировка TIO предотвращает это, как отметил Эрик Аутгольфер в своем ответе на Python 2. Мне нужно проверить, работает ли он локально, прежде чем претендовать на этот счет.Должен быть в состоянии заменить
f1+0B
на'0B
(там есть распечатка0x16
), но он боролся со мной (вещи не хотели правильно разветвляться / пропускать / возвращаться), поэтому я оставил это в покое. Это поднимет структуру с прямым порядком байтов с 387 до 388.источник
DOS COM, 49 байтов, период 2 ^ 3608
Оригинальная сборка для создания:
Эта маленькая жемчужина записывает следующий этап в q.com, а не стандартный вывод из-за нулей и других вещей, которые терминал не может обработать. Техника корневых квин эквивалентна строковому форматированию, а комната полезной нагрузки используется как 3608-битный счетчик. Благодаря тому, как работает DOS, начальное состояние счетчика содержит мусор из того, что было в памяти до его первого выполнения.
Исходный 49-байтовый ввод недоступен, поэтому, если вы хотите набрать 500 байт, вы можете продолжить.
источник
C # (интерактивный компилятор Visual C #) , флаги:
/u:System.Numerics.BigInteger
и/r:System.Numerics
Оценка: 10 332
Спасибо JoKing, который увеличил мой счет с 10 255 * 2 - 1 до сих пор!
Попробуйте онлайн!
объяснение
Увеличивает BigInteger каждую итерацию, пока его длина не станет слишком большой, что в этом случае мы немедленно возвращаем к исходной квине.
источник
Python 2 , 500 байт,252219
Обратите внимание, что есть завершающий перевод строки. Это может быть удалено выше, если подсветка синтаксиса пробивается внутрь.
К сожалению, вы не можете выполнить эту программу в TIO, так как она закодирована в Latin-1.
Выше,
s
содержит 219 0x01 байтов. После запуска программы печатается ее источник, за исключением одного отличия:s
был увеличен как число с прямым порядком байтов в 252, поэтому его самый левый символ был «увеличен» до 0x02. Байты 0x00, 0x22, 0x25 и 0x5C исключаются, поэтому, если какой-либо символ строки становится одним из символов после увеличения, сам символ снова увеличивается."
): Существует опасность формирования трех байтов 0x22 в строке, т. Е."""
Последнего символа строки, становящегося"
так, что строка будет преждевременно закрыта.%
): Printf типа строки форматирования используется до завершения Куайна скелета, поэтому%
не рядом с другим%
инs
вызовут проблемы. К сожалению, невозможно изменить порядок форматирования, чтобы избежать этого предостережения.\
): существует вероятность того, что\
вместо строки дословно используется escape-знак в строке, поэтому его избегают.Таким образом, 252 из 256 байтов могут быть использованы. Если
s
содержит 219 0xFF (ÿ
) байт, он просто возвращается к 219 0x01 байт, что завершает цикл.Учитывая вышеизложенное, имеем252219 возможные строки, следовательно, так много программ в целом.
источник
Чистый ,251226≈ 2,1 × 10542
251 39убрал зависимость отText
251 122функция приращения в гольфе251 128комбинированных исходных строк префикса и суффикса251 188убрал зависимость отGast.GenLibTest
Представлено в формате xxd из-за непечатных / недействительных UTF-8:
Попробуйте онлайн!
Приращивает 226-байтовую строку через все значения байт за исключением
\0
,\n
,\r
,'
и\
.Причина, по которой мы избегаем этих символов:
\0
раздражает компилятор\n
и\r
не может появиться в списках'
закончил бы чарлист\
может вызвать проблемы, если он предшествует экранируемому символуКак только строка становится все
\377
s, она оборачивается на все\001
s, давая оригинальную программу.источник
C2 80
. Это то же самое, что и поведение на вашем локальном компьютере?Gol> <> , 70 байт, 39039000 итераций
Вау, это намного ниже, чем я думал, что будет ... Следующий шаг! У этого есть больше итераций !!!
Попробуйте онлайн!
источник