Пришло время взглянуть правде в глаза: мы не будем здесь вечно, но, по крайней мере, мы сможем написать программу, которая переживет человеческую расу, даже если она будет бороться до конца времен.
Ваша задача - написать программу с ожидаемым временем выполнения, превышающим оставшееся время до конца юниверса.
Вы можете предположить, что:
- Вселенная умрет от энтропии через 10 1000 лет.
- Твой компьютер:
- Будет переживать вселенную, потому что она сделана из Unobtainium .
- Имеет бесконечный предел памяти / стека / рекурсии.
- Его процессор имеет ограниченную скорость.
Вы должны показать, что ваша программа завершает работу (извините, бесконечных циклов нет) и рассчитать ожидаемое время ее выполнения.
В стандартных лазейки применяются.
Это задача для игры в гольф, поэтому выигрывает самый короткий код, удовлетворяющий критериям.
РЕДАКТИРОВАТЬ :
К сожалению, было обнаружено (30 минут спустя), что поле невероятности Unobtainium влияет на внутренние часы компьютера, делая его бесполезным. Поэтому программы, основанные на времени, немедленно останавливаются. (Во всяком случае, кто бы оставил программу, которая просто ожидает, что станет ее живым наследием?).
Процессор компьютера аналогичен процессору Intel i7-4578U, поэтому одним из способов измерения времени выполнения является запуск вашей программы на аналогичном компьютере с меньшими входными данными (я надеюсь) и экстраполяция времени ее выполнения.
подиум
#CharsLanguageUpvotes Author
1 5 CJam 20 Dennis
2 5 J 5 algorithmshark
3 7 GolfScript 30 Peter Taylor
4 9 Python 39 xnor
5 10 Matlab 5 SchighSchagh
* Upvotes 31/08
источник
Ответы:
CJam, 5 байтов
Как это устроено
Эта программа остановится, когда куча больше не сможет хранить Big Integer, что не произойдет в ближайшее время на современном настольном компьютере.
Размер кучи по умолчанию на моем компьютере составляет 4 179 623 936 байт (Java 8 в Fedora). Его можно увеличить до произвольного значения с помощью
-Xmx
, поэтому единственным реальным ограничением является доступная основная память.Время смерти
Предполагая, что интерпретатору требуется х бит памяти для хранения неотрицательного большого целого числа, меньшего 2 х , мы должны считать до 2 8 × 4 179 623 936 = 2 33 436 991 488 . С одним приращением за такт и моим Core i7-3770 (3,9 ГГц с турбонаддувом) это займет 2 33 436 991 488 ÷ 3 400 000 000> 10 10 065 537 393 секунды, что превышает 10 10 065 537 385 лет.
источник
!=
бесконечные типы данных. Если у меня есть терабайт оперативной памяти, 8-разрядное целое число без знака по-прежнему можетJavaScript, 39
объяснение
Поскольку JavaScript не точно представляет большие целые числа, цикл
for(;x!=++x;)
завершается, как толькоx
попадет9007199254740992
.Тело цикла for будет выполняться
Fib(9007199254740992) - 1
раз, гдеFib(n)
n-е число Фибоначчи.После тестирования я знаю, что мой компьютер будет выполнять менее 150000 итераций в секунду. На самом деле, он будет работать намного медленнее, потому что стек станет очень большим.
Таким образом,
(Fib(9007199254740992) - 1) / 150000
запуск программы займет не менее секунды. Я не смог рассчитать,Fib(9007199254740992)
потому что он очень большой, но я знаю, что он намного больше, чем 10 1000 * 150 000.РЕДАКТИРОВАТЬ: Как отмечено в комментариях,
Fib(9007199254740992)
составляет примерно 4,4092 * 10 1882393317509686 , что действительно достаточно велико.источник
fib(n)
может быть аппроксимированphi^n
, мы можем использовать,log((sqrt(5) + 1)/2)*9007199254740992
чтобы вычислить, сколько цифрfib(9007199254740992)
получается1.8823933*10^15
.Fib(9007199254740992)
(используя непрерывную форму сphi
) примерно4.4092... * 10^1882393317509686
. Расчетfor(x=0;x!=++x;)
и повторяется только 9007199254740992 раза.Python (9)
Это имеет более 10 ** 10000000 битов, поэтому вычисление этого должно перенести нас далеко после тепловой смерти.
Я проверил, что это занимает все больше и больше времени для больших, но все же разумных значений, поэтому он не просто оптимизируется интерпретатором.
Редактировать: Гольф два символа, удаляя паренсов благодаря @ user2357112. TIL, что Python рассматривает последующие показатели как энергетическую башню.
источник
...82528057365719799011536835265979955007740933949599830498796942400000000009
(2,6 * 10 ^ 954242509 цифр пропущено, чтобы избежать коллапса черной дыры ). Вы должны действительно перейти на Unobtanium.9**9**9e9
он такой же короткий и требует немного больше длины вселенной для вычисления, а также выглядит немного лучше.GolfScript (
127 символов)Это вычисляет и печатает 8 ^ 7 ^ 6 ^ 5 ^ 4 ^ 3 ^ 2 ~ = 10 ^ 10 ^ 10 ^ 10 ^ 183230. Чтобы напечатать его (не говоря уже о вычислениях) за 10 ^ 1000 лет ~ = 10 ^ 1007,5 секунд, нужно напечатать около 10 ^ (10 ^ 10 ^ 10 ^ 183230 - 10 ^ 3) цифр в секунду.
источник
Marbelous
6866 байтMarbelous - это 8-битный язык со значениями, представленными шариками только на машине, похожей на Rube Goldberg, так что это было не очень легко. Этот подход примерно эквивалентен следующему псевдокоду:
поскольку максимальное значение равно 256 (в программе Marbleous оно представлено 0, который обрабатывается по-разному в разных местах), recursiveFunction (1) будет вызываться как сумма,
256!*512^256
равная примерно10^1200
, достаточно легко, чтобы пережить юниверс.У Marbelous нет очень быстрого интерпретатора, кажется, что он может выполнять
10^11
вызовы этой функции в год, что означает, что мы смотрим на годы выполнения10^1189
.Дальнейшее объяснение Marbelous правления
00
является литералом языка (или мрамором), представленным в шестнадцатеричном (т. е. 0). Этот мрамор падает на--
, который уменьшает любой мрамор на 1 (00 оборачивается и превращается в FF или 255 в десятичном виде). Мрамор с теперь значением FF падает вниз,\\
который толкает его на один столбец вправо, вниз@0
. Это портал и телепортирует мрамор на другое@0
устройство. Там, мрамор приземляется на/\
устройство, которое является дубликатом, он помещает одну копию мрамора--
слева (этот мрамор будет повторяться между порталами и уменьшаться на каждой петле) и одну=0
справа от него.=0
сравнивает мрамор с нулевым значением и позволяет мрамору упасть, если он равен, и толкает его вправо, если нет. Если мрамор имеет значение 0, он попадает на&0
синхонизатор, который я объясню позже.В общем, это просто начинается с 0 значения мрамора в цикле и уменьшает его до тех пор, пока оно снова не достигнет 0, а затем помещает этот 0 значение мрамора в синхронизатор и продолжает цикл в то же время.
}0
является устройством ввода, изначально n-й (базовый 0) ввод командной строки при вызове программы помещается в каждое}n
устройство. Поэтому, если вы вызываете эту программу с помощью ввода 2 из командной строки, мрамор значения 02 заменит это}0
. Этот шарик затем падает в&0
устройство, другой синхронизатор,&n
синхронизаторы удерживают шарики, пока не&n
будут поданы все остальные соответствующие . Затем мрамор уменьшается, телепортируется и дублируется, как в ранее описанном цикле. Правильная копия затем проверяется на неравенство с помощью zero (>0
), если она не равна 0, она проваливается. Если он равен 0, он сдвигается вправо и приземляется!!
, что завершает доску.Итак, пока у нас есть цикл, который непрерывно ведет обратный отсчет от 255 до 0 и позволяет другому, аналогичному циклу (запитанному входом командной строки) запускаться один раз каждый раз, когда он достигает 0. Когда этот второй цикл выполняется n раз (максимум 256) ) программа завершается. Так что это максимум 65536 циклов цикла. Не достаточно, чтобы пережить вселенную.
Это должно выглядеть знакомо, входные данные уменьшаются один раз, затем это значение циклично оборачивается и копируется (обратите внимание, что мрамор уменьшается только один раз, а не при каждом запуске цикла). Затем он проверяется на равенство 0 и, если он не равен нулю, попадает на
MB
. Это функция в Marbelous, каждый файл может содержать несколько досок, и каждая доска - это функция, каждая функция должна быть названа перед сеткой:[name]
. Каждая функция, кроме первой функции в файле, которая имеет стандартное имя: МБ. Таким образом, этот цикл непрерывно вызывает основную плату снова со значением,n - 1
где n - это значение, с которым был вызван этот экземпляр функции.Так почему же
n*512
?Итак, первый цикл выполняется за 4 такта (и 256 раз), а второй цикл выполняется n раз до завершения платы. Это означает, что доска работает около
n*4*256
тиков. Последний цикл (который выполняет рекурсивный вызов функции) является компактным и выполняется в 2 такта, что означает, что ему удается вызывать функциюn*4*256/2 = n*512
раз.Какие символы вы не упомянули?
\/
Это мусорное ведро, которое удаляет шарики с доски, это гарантирует, что сброшенные шарики не будут мешать другим шарикам, которые зацикливаются в цикле, и предотвращают завершение программы.бонус
Так как шарики, которые падают с нижней части мраморной доски, выводятся в STDOUT, эта программа печатает множество символов ASCII во время работы.
источник
Perl,
6658 символовВышесказанное является реализацией функции Аккермана – Петера . Я понятия не имею, насколько велик A (9,9), но я уверен, что для его оценки потребуется поразительно много времени.
источник
$n?A($m-1,A($m,$n-1)):A($m-1,1)
позволяет легко сохранять 8 символов, нажимая на троичного оператора.MATLAB,
5852 символаНам нужно по крайней мере одно арифметическое решение конечной точности, следовательно:
x = единицы (1,999); y = x; в то время как any (y), y = mod (y + x, простые числа (7910)); конец( спасибо @DennisJaheruddin за то, что он сбил 6 символов )
Количество циклов, необходимое для завершения, дается произведением первых 999 простых чисел. Поскольку подавляющее большинство из них превышает 10, время, необходимое для реализации конвергенции, будет на сотни или тысячи порядков больше минимального временного предела.
источник
p=1:9e9;y=p;while+y*y',y=mod(y+1,p),end
Mathematica,
2519 байтовЭто решение было опубликовано до того, как временные функции были дисквалифицированы.
TimeUsed[]
возвращает секунды с начала сеанса, а Mathematica использует типы произвольной точности. В году около 10 7 секунд, поэтому достаточно 10 10000 секунд.Более короткая / простая (/ действительная) альтернатива:
Давайте просто посчитаем вместо этого. Нам придется посчитать немного дальше, потому что мы можем сделать довольно много приращений в секунду, но верхний предел на самом деле не стоит символов.
Технически, в обоих решениях я мог бы использовать гораздо более низкий предел, потому что проблема не определяет минимальную скорость процессора.
источник
9^9^9
занимает больше10^1000
лет? По моим оценкам,9^9^9
для использования моего U7300 с частотой 1,3 ГГцbc
потребуется менее 6 месяцев. (На основе экстраполяции времени для вычисления9^200000
и9^400000
.)Питон 3 - 49
Это делает что-то полезное: вычисляет Пи с беспрецедентной точностью, используя бесконечные ряды Грегори-Лейбница.
На случай, если вам интересно, эта программа зацикливает
10**10**10**2.004302604952323
время.Произвольная точность: 78
Источник изображения
Предельное дыхание
Из-за огромных вычислений
1e99**1e99
итерации занимают чуть меньше1e99**1e99
года. Теперь(1e99**1e99)-1e1000
почти ничего не меняет. Это означает, что эта программа будет работать намного дольше, чем смерть нашей вселенной.возрождение
Теперь ученые предполагают
10**10**56 years
, что Вселенная возродится из-за квантовых флуктуаций или туннелирования. Так что, если каждая вселенная будет в точности одинаковой, сколько всел будет жить в моей программе?Предполагая, что вселенная всегда будет жить
1e10+1e1000
годами, а затем потребуется10**10**56
годы, чтобы «перезагрузиться», моя программа будет жить через1e9701
вселенные. Это предполагает, конечно, что unobtainium может пережить Большой взрыв.источник
1000**1000
это1e3000
не1e2000
.100**100=1E200
.Python 59 (работает большую часть времени)
Я не смог устоять
Хотя теоретически это может прекратиться менее чем за миллисекунду, среднее время выполнения значительно превышает
10^400
указанный срок жизни юниверса. Спасибо @BetaDecay, @undergroundmonorail и @DaboRoss за сокращение до 17 символов или около того.источник
continue
наpass
J - 5 символов, я думаю
Обратите внимание, что все последующее в арифметике произвольной точности, потому что число 9 всегда имеет немного
x
рядом с ним.У нас в семи персонажах,
!^:!!9x
что-то вроде бегав произвольной точности арифметики. Это определенно за предел, потому что Synthetica так сказал , поэтому у нас есть верхняя граница.
В шести символах мы также можем написать
^/i.9x
, что вычисляет каждый промежуточный результат0 ^ 1 ^ 2 ^ 3 ^ 4 ^ 5 ^ 6 ^ 7 ^ 8
. Wolfram | Alpha говорит, что2^3^4^5^6^7^8
это приблизительно10 ^ 10 ^ 10 ^ 10 ^ 10 ^ 10 ^ 6.65185
, что, вероятно, также очищает проверку.У нас также есть пять символов
!!!9x
, что просто ((9!)!) !. W | A говорит10 ^ 10 ^ 10 ^ 6.2695
, что это должно быть достаточно большим ... Это похоже на1.6097e1859933
-ишские цифры, которые явно больше, чем3.154e1016
число наносекунд во вселенной, но я должен признать, что понятия не имею, как можно выяснить реальные времена этих вещей.Одна только печать должна занять достаточно много времени, чтобы продлиться дольше, чем вселенная, поэтому все должно быть хорошо.
источник
C
6356 символовДоказательство того, что это заканчивается, делается по индукции.
Доказательство шага индукции индукцией:
источник
Matlab (
108 символов)ИМХО, большинство записей слишком стараются, вычисляя большие, сложные вещи. Этот код просто инициализирует массив 9x10 1016
double
с, считая с 1, что занимает 7,2x10 ^ 1017 байт. На современном процессоре с максимальной пропускной способностью памяти 21 ГБ / с или 6,63x10 ^ 17 байт / год даже инициализация массива займет не менее 1,09x10 1000 лет, не говоря уже о том, чтобы попытаться напечатать его, поскольку я не беспокоился подавление вывода завершающей точкой с запятой. (;старое решение
альтернативно
Этот код просто создаст квадратную матрицу из
NaN
s / бесконечностей размером3e508
x3e508 = 9e1016
8-байтовых двойных или байтовых значений7.2e1017
.источник
Perl, 16 символов
Это создает строку, повторяющую «. *» Миллиард раз, а затем использует ее как иглу и стог сена в совпадении с регулярным выражением. Это, в свою очередь, заставляет механизм регулярных выражений пытаться выполнить каждый возможный раздел строки длиной два миллиарда символов. Согласно этой формуле из Википедии , существует около 10 35218 таких разделов.
Вышеупомянутое решение имеет длину 16 символов, но требует только около 2 ГБ памяти, что означает, что его можно запустить на реальном компьютере. Если мы предполагаем бесконечную память и конечный размер регистра (что, вероятно, не имеет смысла), его можно сократить до 15 символов, в то же время значительно увеличив время выполнения:
(Я не тестировал его, но думаю, что он может работать с 32-битным Perl, построенным на 64-битной машине с не менее 6 ГБ ОЗУ.)
Примечания:
x
является оператором повтора строкиfor
не является фактическим цикл; он используется только для сохранения одного символа (по сравнению с$_=".*"x1e9;/$_^/
).^
в регулярном выражении гарантирует, что может совпадать только пустая строка; так как квантификаторы регулярных выражений по умолчанию жадные, это последнее, что попробует движок.источник
J (12)
К чему это сводится в Python (при условии
!
работы):РЕДАКТИРОВАТЬ:
Ну, программа может занять не более
2 × 10^-1858926
секунд за цикл, чтобы завершить в течение требуемого времени. Совет: это не сработает даже для первого цикла, не говоря уже о последнем;).Кроме того: этой программе может потребоваться больше памяти, чем энтропии во вселенной ...
источник
xrange()
;)!
не работает в Python. Вам нужноimport math
иmath.factorial()
.C # 217
Я не большой игрок в гольф, но я не мог устоять перед функцией Акермана . Я также не знаю, как рассчитать время выполнения, но он определенно остановится и будет работать дольше, чем эта версия .
источник
ack
функцию в одно-символьное имя, напримерa
.Первая попытка кода гольф, но здесь идет.
VBA -
5745Таким образом, X увеличится на единицу, если произойдет событие 1 в 2 ^ 128, и сбросится, если оно не произойдет. Код заканчивается, когда это событие происходит 2 ^ 64 + 1 раз подряд. Я не знаю, как начать рассчитывать время, но, думаю, оно огромно.
РЕДАКТИРОВАТЬ: Я разработал математику, и вероятность этого в каждом цикле составляет 1 в 2 ^ 128 ^ (1 + 2 ^ 64), что составляет около 20000 цифр в длину. Предполагая, что 1000000 циклов в секунду (приблизительное число), 30000000 с / год, что составляет 3 * 10 ^ 13 циклов в год, оставшееся 10 ^ 1000 лет - это 3 * 10 ^ 1013 циклов, так что это, вероятно, будет длиться примерно в 20 раз больше оставшееся время осталось во вселенной. Я рад, что моя математика поддерживает мою интуицию.
источник
While x=1
, верно? (иначе это бесконечный цикл). Кроме того, вы можете сбрить 12 символов при заменеDim x As Double
наx=0
(VBA не требует объявления переменных, если вы не укажетеOption Explicit
)C, 30 символов
При условии переполнения со знаком с комплиментом в два комплимента и 32-битных целочисленных значений это будет выполняться примерно для 2 2 32 вызовов функций, что должно быть достаточно времени для завершения юниверса.
источник
GolfScript, 13 символов
Эта программа просто считает от 0 до 10 9 9 -1 = 10 387420488 . Предполагая, с оптимизмом, что компьютер работает на частоте 100 ГГц и может выполнять каждую итерацию программы за один цикл, программа будет работать в течение 10 9 9 -12 секунд или примерно 3 × 10 9 9 -20 = 3 × 10 387420469 года.
Чтобы протестировать программу, вы можете заменить ее на
9
a2
, что остановит ее на 10 2 2 −1 = 10 3 = 1000. (Использование3
вместо a2
остановит ее на 10 3 3 −1 = 10 26 , что даже с оптимистическими предположениями, изложенными выше, оно не достигнет хотя бы нескольких миллионов лет.)источник
Autohotkey 37
источник
Хаскелл, 23
Эта программа завершает работу после прочтения 1073741824 символов из
stdin
. Если он выполняется без передачи данныхstdin
, вам нужно будет набрать это количество символов на клавиатуре. Предполагая, что ваша клавиатура имеет 105 клавиш, каждая из которых рассчитана на 100 тыс. Механических циклов и запрограммирована для генерации не мертвых нажатий клавиш, автоповтор отключен, а гнездо для клавиатуры допускает 100 циклов подключения, что дает максимальное количество нажатий клавиш на один компьютер во время безотказной работы 1050000000, что составляет недостаточно для завершения программы.Следовательно, программа завершит работу только тогда, когда станет доступно лучшее оборудование с точки зрения количества циклов, чего практически никогда не бывает в этой работающей вселенной. Может быть, в следующий раз, когда качество имеет более высокий приоритет, чем количество. До тех пор эта программа прекращается в принципе, но не на практике.
источник
~ ATH, 56
На вымышленном языке ~ ATH :
Я прошу прощения за нарушения границы лазейки; Я думал, что это было слишком актуально, чтобы отказаться.
Если кого-то это действительно позабавило, подробности: (1) , (2) , (3) , (4)
источник
Рубин (34)
Линия
([0]*9).permutation.each{print}
занимает около 2,47 секунды на 9! печатает на моей машине, в то время как линия([0]*10).permutation.each{print}
занимает около 24,7 секунд на 10! печатает, так что я думаю, что я могу экстраполировать здесь и вычислить,(24.7/10!)*470! seconds in years
что составляет 6,87 * 10 ^ 1040, что должно быть время выполнения:источник
JavaScript
6862 символаПри этом используется функция Аккермана, которая может быть записана как
Его время выполнения увеличивается в геометрической прогрессии и поэтому очень долго вычисляется. Даже если это не английское здесь вы можете получить обзор возвращаемых значений. Согласно таблице
ackermann(5,1)
равно2↑↑(65533)-3
что, вы знаете, очень большой.источник
n==0?X:Y
, вы всегда можете сделатьn?Y:X
Befunge '93 - 40 байт
(Программа 20х2)
Эта программа полагается на случайные числа, чтобы дать ей задержку. Поскольку переводчики Befunge работают довольно медленно, эта программа должна отвечать всем требованиям. И если это не так, мы всегда можем расширить его по горизонтали. Я не совсем уверен, как рассчитать ожидаемое время выполнения этой программы, но я знаю, что каждый? имеет шанс 50/50 либо начать сначала, либо изменить горизонтальное положение на 1. Есть 18? Я думаю, что это должно быть что-то вроде (18 ^ 2) !, который Google Calculator говорит, что "Бесконечность"
РЕДАКТИРОВАТЬ: Ой, я не заметил другой ответ Befunge, это мой первый пост здесь. Сожалею.
источник
APL, 10
Я не думаю, что это правильный ответ (так как он не является детерминированным), но в любом случае ......
Эта программа вычисляет случайную перестановку чисел 1e9 (
?⍨1e9
) и повторяет до тех пор, пока два последовательных выхода не будут равны (⍣≡
)Таким образом, каждый раз, когда вычисляется перестановка, она имеет 1 в 1000000000! шанс прекратить. И 1000000000! составляет не менее 10 10 8 .
Время, необходимое для вычисления перестановки, не имеет значения из-за массивности 1000000000 !. Но некоторые тесты показывают, что это так,
O(n)
и экстраполяция дает около 30 секунд.Однако мой интерпретатор отказывается принимать входные данные для случайной функции, превышающей 2 31 -1 (поэтому я использовал 1e9), и генерация перестановок чисел 1000000000 дала ошибку полной рабочей области. Однако концептуально это можно сделать с помощью идеального интерпретатора APL с бесконечной памятью.
Это приводит нас к возможности использования 2 63 -1 вместо 1e9, чтобы увеличить время работы по крайней мере до 10 10 20 , предполагая 64-битную архитектуру.
Но подождите, уместна ли архитектура в идеальном интерпретаторе? Черт, нет, поэтому на самом деле нет верхней границы времени выполнения !!
источник
R, 45 байт
Это старая ветка, но я не вижу ответа R, и мы не можем этого иметь!
Время выполнения для меня было около 1 с, когда х было 20, предлагая время выполнения 2 ^ 9979 секунд.
Если вы замените ноль на единицу, то результат будет 2 ^ x, но, как он есть, выход равен нулю, каким бы x ни был (избегает проблем переполнения).
источник
Javascript, 120 байт
Может быть сделано с минимальным объемом памяти (вероятно, менее половины мегабайта), но (вероятно) занимает около 10 8 750 лет, чтобы остановиться.
Многократно увеличивает BigInteger с начальным порядком байтов до 9, пока не достигнет 9 10 4 -1 .
источник
Python 3, 191 байт
Во-первых, f является рекурсивной факториальной функцией и является очень медленной. Затем существует 9 * 10⁹⁹⁹, наделенная собой, которая генерирует OverflowError, но этого не происходит на этом компьютере Unobtanium. For-Loop повторяет 9E999! ^ (9E999 ^ 9E999)! раз и переходят к следующей итерации, только если 9E999! +1 случайные числа между 0 и 9E99 * ^ i! все равны 0 и в каждой итерации цикла while устанавливается значение (9E999 ^ s) !. Ну, я забыл, что печать s занимает много времени ...
Я знаю, что это не самое короткое решение, но я думаю, что это действительно эффективно. Может ли кто-нибудь помочь мне рассчитать время работы?
источник
Машина Тьюринга, но гораздо хуже , 167 байтов
Попробуйте онлайн!
Следует запустить Busy Beaver из 6 символов с двумя состояниями со страницы Википедии .
Как сказано на странице Википедии, он работает в7,412 × 1036534 шаги. Это намного больше, чем тепловая смерть, при условии, что она выполняет каждую команду более чем на одну наносекунду или равна ей.
источник