Вызов
Ваша цель - написать программу, которая печатает другую программу. Эта напечатанная программа должна напечатать другую программу, а новая программа должна напечатать другую программу до конца.
правила
- Каждая программа должна содержать не более 256 байт. (Если это необходимо изменить, оставьте комментарий)
- Последняя программа должна быть пустой программой.
- Должно быть конечное количество программ, поэтому программа не может быть квинной.
- Все программы должны работать на одном языке.
- Вход не разрешен.
- Программа-победитель - это программа, которая печатает столько программ, сколько возможно, считая себя.
Удачи!
code-challenge
code-generation
Черепаха
источник
источник
2^2048
или3.2317e616
.a*10^b
где1<=a<10
иb
является натуральным числом.1.2673e614
.Ответы:
CJam, 4,56 × 10 526 программ
Точный счет: 254 219 + 254 192 + 254 166 + 254 140 + 254 114 + 254 88 + 254 63 + 254 38 + 254 13 + 3
Все программы должны быть сохранены с использованием кодировки ISO-8859-1, чтобы соответствовать ограничению размера файла.
Спасибо @ChrisDrost, который указал на ошибку и предложил подход к вложению .
Попробуйте онлайн в интерпретаторе CJam .
254 219 + 2 ≈ 4,56 × 10 526 программ
Доля строки в балле может быть достигнута с помощью следующей, гораздо более простой программы 1 .
Запуск этой программы производит программу
и после 254 219 - еще 1 итераций, программа
Последняя непустая программа завершается с ошибкой 2 и ничего не печатает (пустая программа).
Как это устроено
Предположим, что строка уже находится в стеке.
254 192 ≈ 5.35 × 10 461 больше программ
Здесь все становится немного сумасшедшим.
Первая программа очень сжимаема. Написав аналогичную программу, которая вместо пустой программы в конечном итоге создает первую программу из приведенного выше раздела, мы можем улучшить оценку на 254 192 программы 3 .
Программа
аналогична первой программе предыдущего раздела, и запуск первого и его вывод за 254 192 итерации приводит к последнему.
Предположим, что строка уже находится в стеке:
Моар программы
Первая программа из предыдущего раздела по-прежнему обладает высокой степенью сжатия, поэтому мы можем применить аналогичный метод и написать программу, которая после 254 166 итераций создает вышеупомянутую программу.
Повторяя эту технику снова и снова, пока мы не достигнем предела 255 байт, мы можем добавить в общей сложности 254 166 + 254 140 + 254 114 + 254 88 + 254 63 + 254 38 + 254 13 + 1 ≈ 1,59 × 10 399 программ те из предыдущих разделов.
1 Новая строка добавлена для ясности.
2 По согласованию на Meta , это разрешено по умолчанию.
3 или 0,0000000000000000000000000000000000000000000000000000000000000000000000000012%
источник
JavaScript, 1000 программ
Справедливо ли это, зависит от того, как именно понять третье правило.
источник
Ruby, 1.628 × 10 ^ 237 программ
Тот же подход, что и в моем Perl-ответе, но поскольку Ruby уже обрабатывает большие целые числа, его проще хранить в виде шестнадцатеричного кода.
Ruby, 9,277 × 10 ^ 90 программ
Так что эта попытка немного отличается от предыдущей квиноподобной, но из-за всех дополнительных функций я не получаю число, столь же близкое к предыдущему ... Хотя было интересно попробовать другой подход!
источник
Программы на Python 2, 9.7 * 10 ^ 229
источник
C, 2,2 * 10 ^ 177 программ
Это не идеально, но довольно хорошо. Я имею в виду, что он ровно в
255
байтах и генерирует программы одинаковой длины. Вы могли бы, вероятно, еще немного поиграть, чтобы получить еще несколько программ, но я оставлю все как есть.Программа основана на простой C-квине. Кроме того, существует довольно простой алгоритм подсчета, который рассчитывает все возможные значения массива char
n
. У нас столько программ, сколько перестановок строкиn
.Диапазон символов ограничен диапазоном от
#
(= 35) до[
= (91). Это потому, что я не хочу ничего"
или\
в строке, потому что они должны быть экранированы.Генерация программы заканчивается, когда все значения в массиве char
n
равны[
. Затем он выводит простую фиктивную программуmain(){}
, которая сама ничего не выводит.В качестве демонстрации того, что это должно работать, я просто изменил пределы, поэтому только символы между ASCII-кодом
35
и36
используются , и только 4 элементов массива.В результате программы
Это выводы
2^4 + 1 = 17
разные программы.Таким образом, вышеприведенная программа выводит
((91-35)+1)^101 + 1 = 57^101 + 1 ~= 2.2 * 10^177
разные программы. Я не совсем уверен, если это имеет значение, или если мой расчет даже правильныйисточник
2.2 * 10^177
(для тех, кто хочет сравнить)?Perl, 1 × 10 ^ 163
В противном случае это довольно простая квинна, сокращенная до минимально возможного числа символов, которая работает только тогда, когда счетчик не работает
0
.источник
Common Lisp, 10 113 -1
Количество девяток ограничено максимальным размером кода 256 с учетом пробелов, введенных принтером.
источник
Perl, 1,4 * 10 ^ 225
Аналогичный подход к питону; тот же результат!
источник
> <> , 65534 (?) Программы
Я добавил знак вопроса рядом с 65533, так как мне еще предстоит проверить, что он может печатать 65533 (хотя у меня есть основания полагать, что это должно). Как только у меня будет немного больше времени, я собираюсь найти способ проверить это.
Вы можете попробовать это онлайн здесь .
Суть этой программы в том, что она изменяет вывод символа в самом конце, а затем уменьшает его числовое значение перед печатью. Я получил 65534 программы, потому что значение ascii символа в конце кода равно 65533, поэтому, считая первую программу, мы имеем 65534 (если вы считаете пустую программу 65535, я думаю). Последняя программа «вернулась» - ничто; оно просто заканчивается, когда значение символа равно 0.
Я вполне уверен, что он сможет печатать символ для всех итераций: я не смог найти точный источник для того, сколько символов> <> может печатать, но есть символы непосредственно ниже 65533, численно.
Дайте мне знать, если есть какие-либо проблемы с этой реализацией; Я немного не уверен в правильности моей записи.
объяснение
Я бесстыдно украл идею использования одиночной кавычки для создания псевдохинэ из вики> <> и комментария, который я видел здесь однажды.
То, что он делает, это анализирует все после кавычки как символы, а затем уменьшает последний. Оттуда он просто переворачивает стопку (чтобы печатать в правильном порядке), помещает кавычку в стопку и затем печатает, пока стопка не станет пустой.
источник
Python, 1 × 10 ^ 194 программ
Это должно быть запущено из файла, а не из интерактивного репла. Это не Куайн.
Спасибо @The Turtle за помощь в экономии 3 байтов, что больше места для девяток!
Спасибо @poke за помощь в экономии 2 байтов, что больше места для девяток!
источник
if n!=0
избыточно. Вы можете просто написатьif n
.if n:
и междуreplace
аргументами.Баш, 52 программы
Совершенно скучный, и (надеюсь) твердо на последнем месте.
источник