Мне интересно видеть программы, которые не запрашивают какой-либо ввод, печатают googol копии какой-нибудь непустой строки, не меньше, не больше, а затем останавливаются. Гугол определяется как 10 ^ 100, то есть 1 с последующим ста 0 'в десятичной системе .
Пример вывода:
111111111111111111111111111111111111111111111111111111111111111111111111...
или же
Hello world
Hello world
Hello world
Hello world
Hello world
Hello world
...
Строка также может быть полностью составлена из пробела или специальных символов. Единственное исключение из идентичных копий фиксированной строки - это то, что ваш язык каким-то образом украшает вывод, что не может быть предотвращено, но может быть тривиально отменено в скрипте-обертке, например, добавление номера строки к каждой строке. Скрипт-оболочка в таких случаях не требуется.
Вы можете предположить, что на вашем компьютере никогда не закончится время, но кроме этого ваша программа должна иметь разумную потребность в ресурсах. Кроме того, вы должны соблюдать все ограничения, которые накладывает выбранный вами язык программирования, например, вы не можете превышать максимально допустимое значение для его целочисленных типов, и ни в коем случае не требуется более 4 ГБ памяти.
Другими словами, программа должна в принципе быть тестируемой, запустив ее на вашем компьютере. Но из-за размера этого числа вы должны будете доказать, что количество копий строки, которую она выводит, равно 10 ^ 100 и что программа останавливается после этого. Остановка может быть завершением, остановкой или даже прекращением работы из-за ошибки, но если это так, ошибка не должна приводить к выводу, который не может быть легко отделен от вывода программы.
Это код-гольф , поэтому выигрывает решение с наименьшим количеством байтов.
Пример решения (C, ungolfed, 3768 байт)
#include <stdio.h>
int main() {
int a00, a01, a02, a03, ..., a99;
for(a00 = 0; a00 < 10; a00++)
for(a01 = 0; a01 < 10; a01++)
for(a02 = 0; a02 < 10; a02++)
for(a03 = 0; a03 < 10; a03++)
...
for(a99 = 0; a99 < 10; a99++)
puts("1");
return 0;
}
Ответы:
Желе ,
64 байтаЭто нильадная ссылка (функция без аргументов), которая печатает 10 200 копий строки 100 , что означает, что она печатает 10 100 копий строки, которая состоит из 10 100 копий строки 100 .
Попробуйте онлайн!
Обратите внимание, что онлайн-переводчик сокращает вывод на 100 КБ по практическим соображениям. Код также работает как полная программа, но из-за неявного вывода эта программа печатает одну копию слишком много.
Как это устроено
источник
10^100
копий оригинального вывода (10^100
копий строки) занимает немного далеко, даже для двух целых байтов. Вы уже отправили это на конкурс "оценка - результат / длина программы, самые высокие выигрыши"?Нечеткое окто гуакамоле,
13121110 байтОбъяснение:
Образец козы напечатан:
источник
Python, 28 байт
-1 байт благодаря Джонатану Аллану!
Python 2:
Python 3 (30 байт):
источник
i=10**100
Новая строкаwhile i:print();i-=1
сохраняет байт. Сохраните еще два с помощью Python 2 сwhile i:print;i-=1
Haskell, 28 байт
Объединяет 10 ^ 100 копий строки
"1"
и печатает ее.источник
s=[1..10^100]>>"1"
разрешенный формат ответа?s
из вашего примера не печатается - или, если вы используете REPL, окружает1
с"
. Я думаю, чтоputStr$[1..10^100]>>"1"
без этогоmain=
было бы хорошо, но я хотел представить полную программу.Brainfuck,
48018811410698 байтПросто потому, что это нужно сделать.
Предполагает 8-битные ячейки с упаковкой. Печатает 250 255 NUL байтов, что составляет 10 100 раз 10 155 раз 25 255 NUL байтов.
Объяснение:
>>>>>>
необходимо оставить немного рабочего пространства.-
производит 255.[[->>>+<<<]------>>>-]
превращает это в 255 копий значения 250, давая ленту, которая выглядит следующим образом:<<<[<<<]+
перемещает указатель данных назад и завершает начальные данные:Затем идет цикл:
[+...-]
первоначально устанавливает 1 в 2, который возвращается в 1 в конце цикла. Цикл завершается, когда тело цикла уже установлено от 2 до 1.Теперь числа 2 250 250 250 ... 250 представляют счетчик в базе 250, причем каждое число на единицу больше цифры, которую оно представляет.
[>>>]<<<
движется полностью вправо. Поскольку каждая цифра представлена ненулевым числом, это тривиально.->+[<[+>-]>[-<<<<->+>>------>>]<<<<]>>-
уменьшает счетчик на 1. Начиная с последней цифры: цифра уменьшается. Если это останется положительным, мы сделали. Если он обнуляется, установите его на 250 и продолжайте с цифрой раньше.[<<<].>>>
перемещает указатель назад перед самой левой цифрой, и это хороший момент для печати байта NUL. Затем измените положение на крайнюю левую цифру, чтобы убедиться, что мы закончили.Для проверки правильности, изменить исходные
-
для+
напечатать 250 1 NUL байт,++
для 250 2 , и т.д.источник
C 51 байт
Функция
g()
вызывает рекурсивную функциюf()
на глубину 99.Исключает ненужные символы новой строки, добавленные между
f()
иg()
для ясности.Печать 1E100 новых строк.
Объявление в
i
качестве второго параметраf()
не гарантируется для работы во всех версиях C. Протестировано на моей собственной машине (GCC на CygWin) и на ideone.com (я полагаю, они также запускают GCC), но не до f (99) для очевидного причины!источник
f()
около 1980 байтов.puts
Сбрасывает новую строку в API и API должен выводить и очищать буфер по мере необходимости.f
записывает в пространство стека то, что вызывающий не был не ожидаю этого). clang предупреждает об «слишком малом количестве аргументов при вызове« f »» в-std=c89
и-std=c99
, поэтому определение действует как объявление с определенным числом аргументов. Но я забыл; Я думаю, это может означать, что компилятор знает, что функция ожидает 2 аргумента, и всегда будет оставлять место для второго аргумента.g
и его вспомогательную функциюf
.main
будет дольше Здесь есть несколько других представлений функций, если вы посмотрите.Машинный код Commodore VIC 20 (40 байт)
... здесь показано как шестнадцатеричное:
(Начало работы с помощью:
SYS 4160
)Значение байтов в скобках
Это опечатка?
У нас есть 1981 год.
Типичный домашний компьютер имеет 1 до 16 K B ОЗУ! И вы вряд ли найдете профессиональные модели, которые имеют 1 M B или больше.
(Хорошо. Просто шутка.)
Программа была протестирована с другими базами и показателями. Я не сомневаюсь, что это также будет работать со 100 и 50.
По крайней мере, он не падает с этими числами (но также не заканчивается в измеримое время).
Объем памяти достаточен для показателя 50, а 100 меньше 127, поэтому основание 100 не должно быть проблемой.
Основная идея
Существует 50-значный счетчик, который считает в 100-системе. Байты 0x01-0x64 представляют цифры 0-99. Первый байт в счетчике является самой младшей цифрой. За последним байтом в счетчике (старшая цифра) следует байт со значением 0x00.
Счетчик имеет начальное значение 100 ^ 50.
Внешний цикл записывает байт в «текущий канал» («стандартный вывод» в современных системах; обычно это экран), а затем уменьшает счетчик.
Уменьшение выполняется внутренним циклом: он уменьшает цифру, а в случае недостаточного значения от 1 до 99 он переходит к следующей цифре. Если байт 0x00 в конце счетчика уменьшается, программа останавливается.
Код сборки
РЕДАКТИРОВАТЬ
Программа работает на Commodore C64 тоже!
источник
Узел, 89 байт
Выходит 10 100 новых строк. (Теоретически, то есть, тест, заменив
100
с1
на выходе 10 1 новой строки вместо этого.)Это работает путем установки
i
строки(100 нулей и 1; гугол в обратном порядке), затем многократно «вычитая 1» с помощью регулярного выражения, заменяйте и выводите новую строку до тех пор, пока строка не станет нулевой.
Порт ответа C ++ будет 49 байтов:
источник
05AB1E , 6 байтов
объяснение
источник
Рубин, 20 байтов
Печать 1 с последующим переводом строки 1E100 раз.
1E100
не работает, так как вычисляет с плавающей точкой, а не с произвольным целым числом точности.источник
10**(100.times{p 1})
1E100.to_i
оцененных в 10000000000000000159028911097599180468360808563945281389781327557747838772170381060813469985856815104 на моем компьютере./// , 36 символов ASCII (4 разных)
Выводит
.
символ 3 * 10 ^ 125 раз, это означает, что он выводит строку, состоящую из 3 * 10 ^ 25 повторений.
символа, 10 ^ 100 раз.Объяснение:
/t./.ttttt/
: Заменитьt.
на.ttttt
всю оставшуюся программу, повторяя до тех пор, пока неt.
останется ни одного экземпляра . Это заменяетt...
с...
последующим 125t
с./.t/t\........../
: Заменить.t
наt..........
всю оставшуюся программу, повторяя до тех пор, пока не.t
останется ни одного экземпляра . Это берет...
последующие 125t
с и превращает их в 125t
с, за которыми следуют 10 ^ 125 вхождений...
./t//
: Удалить все оставшиесяt
s.t...
: Это заменяется на 3 * 10 ^ 125.
с. Выведите их.Теперь, вывод 10 ^ 100 повторений 3 * 10 ^ 25 повторений чего-то вроде чувства обмана. Эта программа выводит
.
символ ровно 10 ^ 100 раз, используя 45 символов ASCII:Объяснение этого:
/T/tttttttttt/
: ЗаменитьT
наtttttttttt
всю оставшуюся программу. Это заменяетTTTTTTTTTT
100 повторенийt
./.t/t........../
: Заменить.t
наt..........
всю оставшуюся программу. Это берет.
100t
секунд, и превращает его в 100t
секунд, а затем 10 ^ 100.
секунд./t//
: Удалить все оставшиесяt
s..TTTTTTTTTT
: Это заменяется на 10 ^ 100.
с. Выведите их.Наконец, вот компромиссная программа, которая выводит
.
символ 2 * 10 ^ 100 раз, используя 40 символов:источник
Befunge 93, 33 байта
К сожалению, в Befunge нет функции power, поэтому почти весь этот код является моей реализацией функции power. Я все еще работаю над этим.
Объяснение:
1
: Начните с1
левого верхнего угла, чтобы при умножении мы не получали0
каждый раз.01g
: получить символ в позиции (0, 1), то естьd
, чей код ASCII равен 100.0`
: посмотреть, больше ли значение, хранящееся в (0, 1), больше 0; это значение изменится.#@!# _
Логически не!
соответствует значению, которое мы получаем из последнего шага (0 или 1), так что если это было 1, теперь у нас есть 0, и мы отмечаем, что это#
означает, что вы пропускаете следующий символ в коде.01g 1- 01p
: Возьмите значение, сохраненное в (0, 1) снова, вычтите 1 из него и сохраните это новое значение в (0, 1)25**
: умножить верхнее значение стека на 101.
: печатать1
каждый раз, когда этот цикл1
печатается (в теории) времена гугл, но это быстро уходит со страницы, на которой я это проверял.Вы можете запустить код Befunge 93 здесь . По какой-то причине верхнее значение стека -
1.0000000000000006e+100
это когда оно должно быть1.0e+100
. Я не знаю, откуда это6
взялось, но я не думаю, что это должно быть там, и что это может быть какая-то ошибка округления или что-то в этом роде.источник
ABCR , 56 байт
Тарпинги Тьюринга - это весело, особенно когда у них нет простого умножения или показателей. С другой стороны, мне нужно было использовать только две из трех очередей!
Объяснение:
источник
Пакетный,
574242 байтаКаждый цикл проваливается, поэтому выполняется дополнительная итерация. Циклы ограничены ~ 2³² из-за ограничения 32-битного целого числа. Первые четыре цикла каждый насчитывают 2 ⁵, в общей сложности 2 ¹⁰⁰, а остальные десять циклов каждый считают 5 ¹⁰ в общей сложности 5 ¹⁰⁰.
Редактировать: сэкономил невообразимые 58% благодаря @ ConorO'Brien.
источник
TI-Basic, 20 байтов
Непосредственная. Только восемь строк отображаются одновременно, а предыдущие строки не остаются в памяти. Поскольку
ᴇ100
это не поддерживается, мы должны выполнить цикл от-ᴇ99
до9ᴇ99
. Затем, еслиI!=0
, отобразить строку (которая, кстати, 3). Таким образом, мы печатаем это точноᴇ100
раз.источник
Функция машинного кода x86-64, 30 байтов.
Использует ту же логику рекурсии как ответ С помощью @Level River St . (Макс. Глубина рекурсии = 100)
Использует
puts(3)
функцию из libc, с которой все равно связаны обычные исполняемые файлы. Он вызывается с помощью x86-64 System V ABI, то есть из C на Linux или OS X, и не сжимает никакие регистры, к которым он не должен.objdump -drwC -Mintel
вывод, прокомментированный с объяснением0x040035e - 0x0400340 = 30 bytes
Построен с
yasm -felf64 -Worphan-labels -gdwarf2 golf-googol.asm && gcc -nostartfiles -o golf-googol golf-googol.o
. Я могу опубликовать исходный исходный код NASM, но это выглядело как беспорядок, так как инструкции asm прямо в разборке.putchar@plt
на расстоянии менее 128 байт отjl
, поэтому я мог бы использовать 2-байтовый короткий переход вместо 6-байтового ближнего перехода, но это верно только для крошечного исполняемого файла, а не как часть более крупной программы. Так что я не думаю, что смогу оправдать не считая размер реализации пут в libc, если я также воспользуюсь короткой jcc-кодировкой для ее достижения.Каждый уровень рекурсии использует 24B стекового пространства (2 нажатия и адрес возврата, передаваемый CALL). Любая другая глубина будет вызывать
putchar
со стеком, выровненным только на 8, а не на 16, так что это нарушает ABI. Реализация stdio, которая использовала выровненные хранилища для раздачи регистров xmm в стек, может привести к сбою. Но glibcputchar
не делает этого: запись в канал с полной буферизацией или запись в терминал с линейной буферизацией. Проверено на Ubuntu 15.10. Это можно исправить с помощью фиктивного push / pop в.loop
, чтобы сместить стек еще на 8 перед рекурсивным вызовом.Доказательство того, что оно печатает правильное количество строк:
Моя первая версия этого была 43B и использовалась
puts()
в буфере из 9 символов новой строки (и завершающего 0 байт), поэтому путы добавляли бы 10-й. Этот базовый вариант рекурсии был еще ближе к вдохновению Си.Факторизация 10 ^ 100 другим способом могла бы сократить буфер, возможно, до 4 новых строк, сэкономив 5 байтов, но использование putchar намного лучше. Для этого требуется только целочисленный аргумент arg, а не указатель и вообще никакого буфера. Стандарт C допускает реализации, для которых это макрос
putc(val, stdout)
, но в glibc он существует как реальная функция, которую вы можете вызвать из asm.Печать только одной новой строки за вызов вместо 10 означает, что нам нужно увеличить максимальную глубину рекурсии на 1, чтобы получить еще один коэффициент - 10 новых строк. Поскольку 99 и 100 могут быть представлены как расширенные знаком 8-битные значения, они
push 100
по-прежнему составляют только 2 байта.Более того, наличие
10
в регистре работает как символ новой строки и счетчик цикла, сохраняя байт.Идеи для сохранения байтов
32-битная версия может сохранить байт для
dec edi
, но соглашение о вызове стековых аргументов (для библиотечных функций, таких как putchar) упрощает работу хвостового вызова и, вероятно, потребует больше байтов в большем количестве мест. Я мог бы использовать соглашение о регистрации-аргументе для частногоf()
, только вызываемогоg()
, но тогда я не мог выполнить хвостовой вызов putchar (потому что f () и putchar () принимали бы различное количество аргументов стека).Было бы возможно, чтобы f () сохранял состояние вызывающего, вместо того, чтобы делать сохранение / восстановление в вызывающем. Это, вероятно, отстой, потому что, вероятно, нужно было бы получать по отдельности в каждой стороне ветви, и не совместим с вызовами хвоста. Я попробовал, но не нашел сбережений.
Хранение счетчика цикла в стеке (вместо push / popping rcx в цикле) также не помогло. Это было на 1B хуже с версией, которая использовала путы, и, вероятно, еще больше потерь с этой версией, которая устанавливает rcx дешевле.
источник
PHP, 44 байта
Этот фрагмент будет выводить
1
время googol. Это не исчерпает память, но это ужасно медленно. Я использую BCMath, чтобы иметь возможность обрабатывать длинные целые числа.Немного лучше, но не так мало (74 байта):
Будет выводить письмо
a
раз Googol. Он будет занимать почти 4 ГБ памяти, выводя около 4e9 символов за раз.источник
a
, это строка из 4 * 10 ^ 9a
с. Ни в коем случае нельзя переходить через 4 ГБ, если вы собираетесь поместить в 3 раза большеa
s. Ob_flush не имеет к этому никакого отношения. Смысл второго примера состоит в том, чтобы выводить сразу большие строки вместо вывода небольшого количества символов каждый раз, что приводит к тому, что программа работает немного быстрее, за счет большего использования памяти.Haskell,
4543 байтаисточник
Пайк,
65 байтПопробуй это здесь!
Не проверено, как он вылетает из моего браузера. Первые 4 символа генерируют 10 ^ 100 и
V
выводят столько строк перевода. Тест с100V
.источник
Ракетка 36 байтов
Выход:
источник
JAISBaL , 4 байта
Chrome не может прочитать все символы, и я не уверен насчет других браузеров, так что вот картинка:
Объяснение:
Довольно просто .... просто печатает гугл пробелы. Три инструкции, но константа googol составляет два байта.
(Написано в версии 3.0.5)
источник
JavaScript ES6,
8583 байтаСохранено 2 байта благодаря ETHproductions!
Это печатает 1e100 новых строк.
Внутренняя часть генерирует эту программу, которая затем оценивается.
Теперь, для доказательства правильности, мы будем использовать некоторую индукцию. Подставим начальные 100 для других значений, в общем N . Я утверждаю, что вставка N даст 10 N новых строк. Давайте передадим результат этому
wc -l
, который подсчитывает количество новых строк во входных данных. Мы будем использовать этот модифицированный, но эквивалентный скрипт, который принимает ввод N :Теперь вот некоторые результаты:
Мы можем видеть, что это преобразует вход N для небольших значений в 10 N строк.
Вот пример вывода для N = 1:
источник
eval([...Array(i=100)].map(_=>`for($${--i}=0;$${i}++<10;)`).join``+"console.log()")
Mathematica,
483025 байтовВыход:
источник
For[n=0,n++<10^100,Echo[]]
?>>
часть продукции. Они напечатаны, если вы используетеEcho
на консоли.Echo@0&~Array~10^100;
21 байта?Фортран 95, произвольной формы, рекурсивный, 117 байт
Печатает гугол строк, содержащих
Фортран 90, Рекурсивный, 149 байт
Рекурсивный вызов 100 вложенных циклов, каждые 10 итераций, дает ровно один гугол. N, L и счетчики циклов помещаются в целые байтовые числа.
Протестировано заменой 99 на 1, 2, 3, 4, 5 и отмечением, что в каждом случае результирующий счетчик строк из "wc" имеет n + 1 нулей.
Fortran II, IV, 66 или 77, 231 байт:
Печатает гугол новых строк.
Все эти программы будут работать на 32-битных машинах; на самом деле, рекурсивные версии будут отлично работать на 16-битной машине. Можно использовать меньше циклов в версии с перебором, запустив старый Cray с его 60-битными целыми числами. Здесь десять вложенных циклов 2 * 10 ^ 9 внутри одного цикла 5 ^ 10 (9765625) равняется 10 ^ 100 полных итераций.
Ни одна из версий не использует какую-либо память, кроме самого объектного кода, счетчиков, одной копии выходной строки и, в рекурсивной версии, стек возврата на 100 уровней.
Проверьте факторы, сравнивая
источник
Симулятор машины Тьюринга, 1082 байта
Симулятор машины Тьюринга
Я не знаю, считается ли это правильным выводом, поскольку в нем 82 начальных пробела.
Я не знаю, учитывает ли это ограничение в 4 ГБ, поэтому, если это не так, то это неконкурентоспособно и просто для демонстрации. Выход составляет 1e100 байт, поэтому его следует вычесть из числа байтов памяти. Окончательный счетчик байтов составляет 82 байта.
Вот объяснение:
Первые 80 строк кода представляют собой 80 различных состояний, которые генерируют счетчик циклов base-19 1
6EC1BCF4688309GH806H932ADCC44EEG6DE0FE9FAHDE66DGH108C9G3623E045A0H7A95AB594CE99A
.Следующие 19 строк кода представляют собой состояние счетчика, которое уменьшает счетчик каждый раз, когда печатается символ.
Следующие 6 строк - это состояние принтера, к которому добавляется
=
.Наконец, последние 2 строки являются более чистым состоянием, которое необходимо, чтобы убедиться, что единственный выход
=====...=====
. Начальные / конечные пробелы не считаются выходными данными, поскольку они являются неизбежными побочными эффектами.Затем программа останавливается.
1 Я сделал математику для этого.
источник
Pyth, 7 байт
Новый (Конкурирующий)
объяснение
Старый (неконкурентный) 7 байт
объяснение
источник
*TT
он короче равнины100
.Python 3, 32 байта
Альтернативный раствор, 33 байта:
источник
range(10**100)
создается список чисел[1, 2, 3, 4, ...]
, в результате чегоOverflowError: range() result has too many items
. Это будет работать в Python 2 с вызовомxrange()
вместо этого, и работает в Python 3, так какxrange()
был переименованrange()
, а оригинал,range()
который генерировал список, устарел.Ява,
198179155 байтПечатает (
x
==null
?:null
Строку, которая начинается с[La;@
или что-то в этом роде) 10 100 раз за O (навсегда) время.источник
class
, но нетpublic static void main(String[]a)
метода. Что касается советов по игре в гольф: вы можете заменитьnew BigInteger("0")
,new BigInteger("1")
иnew BigInteger("10")
сBigInteger.ZERO
,BigInteger.ONE
иBigInteger.TEN
; Вы можете заменитьimport java.math.BigInteger;
наimport java.math.*;
.java.math.BigInteger b=null;for(b=b.ZERO;!(b=b.add(b.ONE)).equals(b.TEN.pow(100);)System.out.print(x);
b
является нулевым.Java, 153 байта
Выход: 1е100 1с
Я знаю, что есть другой ответ на Java, который также довольно близок. У меня есть основной и все еще короче, хотя.
Это моя первая запись в гольф. Советы приветствуются.
источник
import java.math.*;()->{for(BigInteger i=BigInteger.ZERO;!i.add(i.ONE).equals(i.TEN.pow(100));)System.out.print(1);};
javac
не позволит мне скомпилировать это.Pyth,
87 байтовСсылка
Решение протестировано с небольшим выходом, но оно должно печатать
abcdefghijklmnopqrstuvwxyz
1e100 раз.По какой - то причине
p
был не нужен, а 31343 (Maltysen) сказал .источник
p