Самый короткий код для самого длинного вывода [закрыт]


10

Это довольно просто.

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

Чтобы сделать это забавным, программы, которые производят бесконечный вывод, будут дисквалифицированы.

Победителем стала программа с наибольшим соотношением выходного размера / размера кода.

Результаты основаны на том, что работает на моем компьютере - Mac с Mac OS X 10.7.5 с Intel Core i5 и 8 ГБ памяти.


Непонятно, что именно вы спрашиваете. Должны ли ответы принимать неограниченную память, неограниченный размер индекса и т. Д.?
Питер Тейлор

@PeterTaylor Я исправил это.
13

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

8
@LegoStormtroopr GolfScript отвечает всем требованиям. Выполнение пустого скрипта приведет к выводу ровно одного символа:\n
primo

1
@ user2509848 нет, потому что, как я уже сказал, бесконечный вывод не считается.
tbodt

Ответы:


18

Python: 8-значный код, 387420489 выходных символов - соотношение: 48427561.125: 1

'a'*9**9

Мы можем получить отношение к бесконечности, добавив больше **9s:

'a'*9**9**9
'a'*9**9**9**9
etc.

Например:

'a'*9**9**9**9**9**9

который имеет отношение ~ 10 10 10 10 10 8,568 (невообразимо большое число).


Лучше, чем другой ...
tbodt

@tbodt Почему? O_o @arshajii Если вы добавите достаточно **9s, не станет ли это в итоге Infinity?
Дверная ручка

@ Doorknob Извините, я не знаю все о питоне. Теперь задача состоит в том, чтобы: выяснить максимальное количество **9s, которое вы можете поместить до того, как результат станет Infinity.
tbodt

1
@ Doorknob Python имеют произвольную точность.
Аршаджи

@tbodt Смотрите комментарий выше.
Аршаджи

16

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

брейнфук, 5 символов, 255 байт вывода

-[.-]

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

брейкфак, 4 символа, бесконечный вывод

-[.]

Я предполагаю, что это самая короткая программа с бесконечным выводом.

На самом деле, подожди, мой друг только что придумал действительно хороший.

Python, 80 байтов, неизвестный объем вывода

from datetime import datetime
while datetime.now()!=datetime.max()
 print "This will probably get disqualified"

Эта программа определенно остановится в конце концов, но это произойдет только через 8000 лет. Точное количество выводимых символов зависит от скорости, с которой ваш компьютер может воспроизводить символы.


1
Мне нравится питон один: D
Кевин Кокс

2
«Я предполагаю, что это самая короткая программа с бесконечным выводом», нет, здесь пригодится неявный цикл Бефунга (через wraparound): .выводит бесконечный поток из 0 символов.
FireFly

14

Perl - 19 байт, 187200000000000000 байт (9852631578947368.42: 1)

print+($]x9e7)x26e7

166 петабайтов с одним оператором печати, используя не более 1,7 ГБ памяти.

Есть несколько вещей, которые сделали этот вызов более интересным, чем я думал. Perl, похоже, отказывается выделять более 1 ГБ памяти для какого-либо одного списка. Следовательно, 4-байтовая скалярная ссылка на внутреннюю строку может повторяться только 26e7 ≈ 2 28 раз. $]это номер «старой версии Perl», который в виде строки имеет длину 8 байт и напоминает 5.016002.

С большей системной памятью она должна быть в состоянии пойти выше. Предполагая, что все 8 ГБ фактически были доступны, вы должны использовать $]x9e8вместо внутренней строки, которая выдаст 1,62 эксабайт.


16
«Если вы дадите 1 000 000 обезьян 1 000 000 пишущих машинок и дадите им 1 000 000 лет на написание материала, одна обезьяна в конечном итоге напишет программу на Java. Другие просто создадут сценарии Perl». Это то, что я подумал, когда увидел это: P источник
дверная ручка

5

Ruby and Python, 13 символов, 599994 символов, соотношение ~ 46153: 1

999999**99999

Просто возводит очень большое число в степень другого очень большого числа. Занимает около 20 секунд, чтобы бежать. Я не могу увеличить числа, потому что это сделало бы число бесконечностью.

делал это раньше , сейчас я работаю над созданием цикла для еще более длительного вывода)

Редактировать: я сделал это!

Рубин, 28 символов, выход 6e599999, соотношение ~ 6e599998 (я думаю)

a=999999**99999;a.times{p a}

Не проверено (по понятным причинам), но я уверен, что первое число составляет около 1e599994, а умноженное на 599994 - около 6e599999. Теоретически это будет работать, но я не уверен, что это может привести к поломке вашего компьютера, поэтому отказ от ответственности: я не несу ответственности, если это каким-либо образом повредит вашему компьютеру

Конечно, вы можете продолжать:

Рубин, 37 символов, выход 6e359992800041, соотношение ~ 6e359992800040

a=999999**99999;a.times{a.times{p a}}

И так далее, но я сомневаюсь, что любой компьютер справится с этим: P


Это действительно полиглот ...
13:30

@ tbodt Хе-хе, верно! Когда я добавлю свои изменения, этого не произойдет
Doorknob

5

Если бесконечный ввод был разрешен,

cat /dev/random

Так как это не так,

head -99 /dev/random

(25128 вывод: 20 входов = 1256,4: 1)

Я не на Linux box, но я думаю, что вы могли бы сделать что-то вроде

timeout 99d cat /dev/random

и получить огромный выход. (через ответ GigaWatt)


2
Вы можете заменить один символ и сделать свой вывод 8562 раз больше: timeout 99d. Да, 99 дней выполнения. Кроме того, я не уверен в этом, но в конечном итоге вы очистите пул энтропии, /dev/randomи он заблокируется, поэтому /dev/urandomможет быть более уместным. (Мне удалось получить 40 МБ / с urandomи только 128 КБ / с random)
г-н Лама

@GigaWatt, это круто.
Тристин

4

HQ9 +, 11471

9

Фактическое количество символов варьируется в зависимости от переводчика, но, вероятно, около 10000 будет правильным?


Что такое HQ9 +? Я никогда не слышал об этом.
2011 г.

Ааа, извините, это была в основном шутка, поскольку это не «настоящий» язык программирования, но: esolangs.org/wiki/HQ9%2B
Дом Гастингс,

2

C #: 108 символов. Соотношение: 742123445489230793057592: 1

for(ulong i=0;i<ulong.MaxValue;i++){Console.Write(new WebClient().DownloadString(@"http://bit.ly/dDuoI4"));}

Он просто загружает и распечатывает Список юрисконсультов Википедии Верховного суда США (4344904 символа) 18446744073709551615 раз.


Это требует сокращения URL. Я не уверен в этом.
tbodt

1
Хорошо. И что по этому поводу: for(ulong i=0;i<ulong.MaxValue;i++){Console.Write(new string('a',int.MaxValue));}2147483647 символов * 18446744073709551615 раз = 39614081238685424720914939905/81 => Соотношение: 489062731341795366924875801
thepirat000

Намного лучше. Укорачивание URL не требуется.
tbodt

2

~ - ~! - Соотношение: (64 4 4 4 64 ) / 154 ~ = 10 10 10 10 10 1,58328920493678

'=~~~~,~~~~,~~~~:''=|*<%[%]'=',',',':''&*-~|:'''=|*<%[%]''&',',',':'''&*-~|:''''=|*<%[%]'''&',',',':''''&*-~|:''''&':''=|*<%[%]@~~~~,~~~~,~~:''&*-~|:''&':

Как это работает: Во- первых, он устанавливает '4 ^ 3 или 64. Затем он делает ''функцию , которая устанавливает 'для '^ 4 * раз (где * это вход). '''Затем делается функция, которая вызывает ''с вводом как '^ 4. Затем ''''производится функцию , которая вызывает '''с '^ 4 , как это вход. ''''затем вызывается с вводом 64. Наконец, ''изменяется на функцию, которая печатает пробел * раз; затем вызывается с помощью ввода '.

Оказывается, в конце концов, 'это 64 4 4 4 64 , и длина моей программы составляет 154 ; вставьте это в Wolfram | Alpha, и оно выплюнет 10 10 10 10 10 1.583328920493678 , которое он даже не потрудится вычислить. Я даже не знаю, сколько в нем цифр , но 64 4 4 содержит 463. Довольно неплохо для языка, который поддерживает только унарные явные числа и не имеет функции экспоненты; 3

Я мог бы сделать это намного больше, но, излишне.


1

Javascript: 27 символов; 260 431 976 символов; Соотношение 9 645 628,74

for(s=i=61;s=btoa(s),i--;)s

Этот код рекурсивно кодирует ввод 61в Base64 61 раз. Кодирование любого ввода длины nв Base64 производит вывод длины n * 8/6, округленный до кратного 4.

Это должно выполняться из консольной среды JavaScript, которая изначально поддерживает функцию кодирования Base64 btoa. (Любой современный браузер, но не Node.js.) Примечание. Chrome не может работать выше, чем i=61, в то время как Firefox может только работать i=60. Также обратите внимание, что консоль Chrome не может отображать вывод, потому что он слишком большой, но вы можете проверить размер результата, выполнив

for(s=i=61;s=btoa(s),i--;)s.length

Если бы этой программе было разрешено запускаться по максимуму i=99, она выдала бы гипотетический результат размером 14 566 872 071 840 (14,5 триллионов, 14,5e12) символов при гипотетическом соотношении около 540 миллиардов (5,39e11).


1

Ruby, 23 символа - ~ 500000000000000 (5e14) Вывод

while rand
puts 0
end

Ti-Basic 84, 13 символов - ~ 3000 Вывод

:Disp 1
:prgmA

Назовите программу prgmA


1

рубин, 283 96 44 символов

a=1e99.times;a{a{a{a{a{puts'a'*99}}}}}}}}}}

Не очень короткий, но он компенсирует это в результате, а это так много, что я пока не смог измерить его.


2
по моим подсчетам это будет о 1e127выходе символов. в любом случае, присвоение переменной уменьшит размер кода примерно вдвое. также, 1e99это большее число, которое занимает меньше места. также используйте mapвместо each, используйте putsвместо print, удалите лишние пробелы между printи "ier.... Вы также можете заменить эту большую строку 'a'*999(или даже ?a*999), которая является более длинной строкой, которая занимает меньше места. Резюме: это вовсе не игра в
гольф

@ Doorknob Спасибо. Я ничего не знаю о рубине, кроме 3-й главы о том, почему острое руководство по рубину.
2013 г.

да, почему бы вам просто не присвоить (0..1e99).mapпеременную? какa=(0...1e99).map;a{a{a{a{a{puts'a'*99}}}}}
Дверная ручка

Моему интерпретатору Ruby не хватило памяти для оценки a=(0...1e99).map. Возможно, вы захотите немного прояснить это. 0..1e9будет использовать около 4 ГБ.
Примо

1

Mathematica 9 символов Соотношение: ~ 4564112: 1

Ниже приведена картина ввода Mathematica. Я не понял, как сделать это в SE.

экспонент

Вот снимок экрана, показывающий количество цифр в выводе. IntegerDigitsпреобразует вывод в список цифр. Lengthподсчитывает количество цифр

подсчитывать

Клавиши для ввода: 9, ctrl6, 9, ctrl6, 9, ctrl6, 9, ctrl6, 9....


1
Какая? Вы можете напечатать это в Mathematica?
13

Да, это законный вклад в Mathematica.
DavidC

И какие нажатия клавиш требуются?
tbodt

@tbodt Теперь нажатия клавиш отображаются в ответе.
DavidC

1
Я не знаю, нужно ли вам указывать порядок, но вы хотите, чтобы он вычислялся сверху вниз: (9 ^ 9) ^ 9 - это 78-значное число, а 9 ^ (9 ^ 9) - это 369 693 100-значное число. (спасибо, wolframalpha)
SeanC

0

Befunge-93: 48 символов, около ((2 ^ 32) ^ 2) * 10 символов на выходе

Стек Befunge теоретически бесконечен, но числа, которые хранятся в стеке, ограничены размером беззнакового длинного целого числа (здесь предполагается, что оно составляет 32 бита). Таким образом, для интерпретатора Befunge (x + 1)> x ложно для правильного значения x. Мы используем этот факт, чтобы сначала сдвинуть все значения от нуля до максимума (дважды, по одному на каждое третье число), а затем для каждого значения в стеке мы выводим и уменьшаем его, а затем выталкиваем его, когда оно достигает нуля. В конце концов стек очищается, и программа завершается. Возможно, я немного не согласен с размером вывода, но он должен быть где-то на этом этапе.

>::1# + #1\`# :# _> #- #1 :# :# .# _# .# :# _@

0

C: 48 символов, ок. (2 ^ 32 - 1) * 65090 байт

main(){for(int i=1<<31;i<~0;)puts("!");main();}

Обратите внимание, что 65090 не является точным и зависит от размера стека. Программа в конечном итоге остановится, когда она выйдет из строя. Кроме того, я мог бы просто поместить более длинную строку в put (), чтобы рацион приблизился к бесконечности, но это кажется довольно обманчивым.


1
это бесконечный цикл
изабера

Ой, ты прав, я думаю. Я посмотрю, смогу ли я понять, как это исправить.
Stuntddude

0

Java (131): неизвестно, но конечное количество

class A{public static void main(String[] args){while(Math.random()>0){for(long l=0;l!=-1;l++){System.out.println("1234567890");}}}}

Используя низкую вероятность того, что Math.random () попадет в 0 в цикле, а затем перейдет в циклы 2 ^ 64-1 через foreach с выводом 1234567890;


0

Python 3, 115 байт, работает в течение 7983 лет (неизвестное количество символов)

РЕДАКТИРОВАТЬ: Ymbirtt избили меня к этому.

Я знаю, это не очень коротко, и я знаю, что другой ответ Python очень длиннее, но я решил дать этому шанс.

Программа работает около 8000 лет, что, как вы знаете, довольно долгое время.

Он непрерывно получает текущее время, используя datetime.datetime.now()функцию, и сравнивает его с9999-12-31 24:59:59.999999 , насколько я знаю, максимальная дата в Python.

Если это является равным, то программа останавливается. Если это не так, он постоянно выводит a.

import datetime
while 1:
    if str(datetime.datetime.now())=="9999-12-31 24:59:59.999999":exit
    else:print("a")

1
Что если вы пропустите этот момент?
C5H8NNaO4

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