Из всей математики всегда будет несколько теорем, которые выходят за рамки всего здравого смысла. Одним из них является тот факт, что существуют разные размеры бесконечности. Другим интересным фактом является идея о том, что многие бесконечности, которые кажутся разными, на самом деле имеют одинаковый размер. Четных чисел столько же, сколько и целых, и рациональных чисел.
Общая концепция этого вопроса - противостоять странной реальности бесконечности. В этой задаче ваша программа выведет список, который будет:
- В любой конкретный момент времени всегда есть целое количество записей
- В конце концов, содержать (если оставить достаточно долго) любое конкретное (ненулевое) рациональное число точно один раз во всем списке
- Содержат неограниченное количество пустых слотов (записи в списке, которые излишне установлены в 0)
- Есть доля пустых слотов, которая приближается к пределу 100%
- Для каждого положительного целого числа N, иметь бесконечное количество мест с N последовательных пустых слотов
Соревнование
Ваша задача - написать ту самую короткую из возможных программ, которая выведет специальный список со следующими правилами:
- Все записи с индексом, который не является квадратным числом, должны быть установлены в ноль. Итак, первая запись будет отлична от нуля, вторая и третья будут равны нулю, четвертая будет отлична от нуля и т. Д.
- Все рациональные числа будут в форме неправильной дроби (такой как 4/5 или 144/13), которая была упрощена. Исключение составляют нули, которые будут просто
0
. - Все (положительные и отрицательные) рациональные числа должны в конечном итоге появиться в списке, если ваша программа работает достаточно долго и с достаточным объемом памяти. Для любого конкретного рационального числа требуемое время может быть произвольно большим, но всегда конечным количеством времени.
- Если запустить в течение бесконечного количества времени, никакое ненулевое рациональное число никогда не должно появляться дважды.
Правило 3 допускает некоторые вариации, поскольку существует бесконечное количество различных возможных юридических результатов.
На выходе будет поток строк. Каждая строка будет иметь общий вид, 5: 2/3
где первое число является номером записи, затем следует рациональное число. Обратите внимание, что 1: 0
всегда будет первая строка вывода.
Пример фрагмента вывода:
1: 1/1
2: 0
3: 0
4: 2/1
5: 0
6: 0
7: 0
8: 0
9: -2/1
10: 0
etc...
Правила, положения и примечания
Это код гольф. Применяются стандартные правила игры в гольф. Кроме того, из-за различий, разрешенных в выходных данных, вам необходимо хотя бы показать, почему вы считаете, что ваш список будет содержать все возможные рациональные числа ровно один раз и что ваше решение является правильным.
РЕДАКТИРОВАТЬ: Поскольку простые числа отвлекают от задачи, я изменяю его на квадратные числа. Это выполняет ту же цель, а также сокращает решения.
источник
1: 0
всегда будет первая строка вывода. - Это противоречит вашему примеру и также не имеет смысла для меня.Ответы:
Хаскель, 184 персонажа
Это делает обход дерева Калкин-Уилф в ширину , приводя все положительные рациональные числа в приведенной форме ровно один раз. Затем он чередуется между положительным и отрицательным, чтобы покрыть все ненулевые рациональные числа и площадки нулями между квадратными записями.
Вывод (исключая ноль строк для краткости):
источник
Шалфей, 103
113128Мудрец может с лёгкостью перечислить рациональное! Форматирование в соответствии с требованиями программы, как всегда, все разрушает.
Мудрец перечисляет в
QQ
соответствии с их высотой : максимальное абсолютное значение числителя и знаменателя после сокращения GCD.источник
x.next()
и использоватьprint
только один раз, а именно, доведя счет до 124:x=enumerate(QQ) for i,q in x: for j in[(i-1)^2+1..i*i]: print'%d: '%j,'%d/%d'%(q.numer(),q.denom())if j.is_square()else 0
. Это не отображается должным образом в комментарии, но я думаю, вы можете понять, что я имею в виду.Питон, 162
Для этого используется рекурсия, приведенная в « Пересчете рационалов » Calkin & Wilf.
источник
Haskell, 55 байт
выходы
1% 1 является корнем дерева Калкина-Уилфа; итерация добавляет обоих потомков каждого узла; объединение сворачивает уровни в один список.
120 символов, если вы добавите правильный импорт, 0 и негативы:
выходы
выводить пустые слоты? это дурной вкус :( Вы были со мной в "списке всех положительных доводов"
источник
mapM_ print$fix((1%1:).(>>= \x->[x+1,1/(x+1)]))
47 символов. из haskellwiki . работает как есть, без какого-либо импорта, на REPL "попробуй" на haskell.org (ну, безmapM_ print
части ...)PHP 105 байт
Примечание: этот код должен быть сохранен как iso-8859-1 (ansi) для правильной работы. Онлайн-интерпретаторы, которые по умолчанию кодируют весь ввод в utf8 (например, ideone), будут генерировать неправильный вывод.
Использование перечисления Георга Кантора (немного изменено для значений +/-).
Если у вас возникли проблемы с запуском приведенного выше кода (вероятно, из-за чрезмерного количества сообщений NOTICE), используйте вместо этого (107 байт):
источник
Октава, 168 байт
Решение не очень сложное, это просто диагональный обход «ковра» рациональных чисел, отбрасывая все дроби, которые можно упростить. После положительного числа всегда печатается
a/b
противоположное-a/b
, прежде чем идет следующий из последовательности.Поскольку все положительные простые дроби будут напечатаны, а противоположные подписанные дроби будут напечатаны, и две разные простые дроби никогда не смогут иметь одинаковое значение, каждое ненулевое рациональное число будет напечатано ровно один раз.
Degolfed:
источник