Напишите программу с заданным значением n , которая сгенерирует все возможные n-кортежи, используя натуральные числа.
n=1
(1),(2),(3),(4),(5),(6)...
n=2
(1,1),(1,2),(2,1),(2,2),(1,3),(3,1),(2,3),(3,2),(3,3)...
n=6
(1,1,1,1,1,1) (1,1,1,1,2,1) (1,1,1,2,1,1)...
- Вывод может быть в любом порядке, который не нарушает никаких других правил.
- Программа должна быть написана так, чтобы она работала вечно и теоретически перечисляла все соответствующие кортежи ровно один раз.
- В действительности ваша программа достигнет предела целочисленного типа и вылетит. Это приемлемо, если программа будет работать бесконечно долго, если только ваш целочисленный тип будет неограниченным.
- Каждый допустимый кортеж должен быть указан в течение конечного времени, если только программе разрешено запускаться так долго.
- Вывод может, по вашему выбору, включать нули в дополнение к натуральным числам.
- Вы можете выбрать формат вывода вашей программы для вашего удобства, если разделение между кортежами и числами внутри каждого кортежа является четким и последовательным. (Например, один кортеж на строку.)
- Ввод (n) является целым числом от одного до шести. Требуемое поведение не определено для входов за пределами этого диапазона.
- Применяются правила Code-golf, выигрывает самая короткая программа.
Спасибо "Artemis Fowl" за отзывы на этапе песочницы.
Ответы:
Шелуха , 2 байта
Попробуйте онлайн!
объяснение
N
это бесконечный список натуральных чисел[1,2,3,4,..
.π
это декартова сила. Результатом является бесконечный список списков. Каждый список желаемой длины встречается ровно один раз, потому чтоπ
это круто. Ввод и вывод неявные.источник
n
- кортежи получают, беря декартово произведение исходного списка и спискаn-1
кортежей в порядке возрастания суммы индексов.2,2,2
приходит после4,1,2
и5,1,1
.N
. Для 2-х кортежей берется декартово произведение сN
упорядоченным по сумме показателями. В обоих списках каждое числоn
имеет индекс,n
поэтому для длины 2 результат упорядочивается по сумме. Для получения 3-кортежей вы берете декартово произведениеN
и список 2-кортежей, упорядоченный по сумме индексов элементов в этих списках. Он не смотрит на сумму кортежа, он смотрит на свою позицию в списке кортежей.Haskell , 62 байта
Попробуйте онлайн!
n!s
генерирует всеn
кортежи, которые суммируются сs
.Тогда ответ
([1..]>>=).(!)
, то есть\n -> [t | s<-[1..], t<-n!s]
.Это функция, отображающая целое число
n
в бесконечный ленивый список кортежей (списков целых чисел).источник
Haskell , 50 байтов
Попробуйте онлайн!
Списки-
n
кортежи отсортированы по сумме.mapM
выполняет тяжелую работу для генерации всехn
наборов чисел от 0 до k.<$f
Трюк объясняется здесь .Haskell , 51 байт
Попробуйте онлайн!
Рекурсивно растягивает все
n-1
кортежи на всеn
кортежи, разбивая первое числоa
каждогоn-1
кортежа на два числа,a-k,k
которые суммируются с ним всеми возможными способами.источник
Pyth - 9 байт
Спасибо @FryAmTheEggman за гольф
Перебирает все x и принимает [1..x] ^ n. Это делает дубликаты, поэтому сохраняются только те, которые являются новыми для этого x, то есть содержат в них x. Форматирование немного странное, но его можно сделать стандартным с помощью еще одного байта,
.V1j}#b^Sb
Попробуйте онлайн .
источник
f}bT
->}#b
Кроме того, ваш счетчик байтов сейчас кажется неверным?j(b)
. Также спасибо за гольф.Brachylog (v2), 9 байт
Попробуйте онлайн!
Это бесконечный генератор, который генерирует все возможные кортежи. Ссылка TIO имеет заголовок, который использует генератор, чтобы сгенерировать 1000 элементов и распечатать их (но генератор мог бы работать бесконечно, если бы я попросил об этом; целые числа Брахилога не ограничены).
Такое ощущение, что должен быть более краткий путь, но есть много ограничений, и это самое короткое, что я могу вписать их в одну программу.
объяснение
Между прочим, меня удивляет, насколько разные мои объяснения двух
≜
, несмотря на то, что они делают одно и то же с точки зрения Брахилога. Первый≜
- это первый недетерминированный предикат в программе, поэтому он устанавливает порядок результатов; в этом случае он вычисляет все возможные явные значения для суммы списка в порядке 0, 1, 2, 3… и используется для обеспечения вывода списков в порядке их суммы (это гарантирует, что каждое возможное список появляется после конечного количества вывода). Второй≜
используется для вычисления всех явных возможностей для списка (вместо вывода формулы, определяющей, как элементы списка связаны друг с другом).источник
↰₁ẉ⊥
также хороший заголовок, для печати бесконечно.ᶠ
или⊥
в заголовке.Perl 6 , 37 байт
Попробуйте онлайн!
По сути, выполняется
polymod
с таким количеством записей, сколько необходимо, где модуль всегда больше, чем вход, т. Е. 0.polymod (1,1,1), 1.polymod (2,2,2) и т. Д. Таким образом, цифра всегда находится в пределах диапазон. Perl6 не позволит мне по модулю бесконечности ...источник
(0, 1, 0, 0)
не указан).Wolfram Language (Mathematica) , 62 байта
Попробуйте онлайн!
-3 байта с непоследовательным разделением (удалить
@#&
)Попробуйте онлайн!
источник
C # (интерактивный компилятор Visual C #) , 148 байт
Попробуйте онлайн!
-3 байта благодаря @ASCIIOnly!
источник
Write
с eg'<literal tab>'
или|
имеет одинаковую длину и занимает намного меньше строк: PЖеле , 10 (9?) Байтов
9 если мы можем вывести с использованием непоследовательного разделения (о котором я спрашивал) - удаление
€
.Попробуйте онлайн!
Как?
источник
€
требуется, но давайте подождем, что OP должен сказать.05AB1E ,
1511 байт-4 байт путем создания порта @Maltysen Pyth ответа «s .
Попробуйте онлайн.
Объяснение:
источник
MATL , 16 байт
Кортежи упорядочены по возрастанию суммы, и в пределах заданной суммы они упорядочены лексикографически.
Попробуйте онлайн!
источник
Python 2 ,
12611210610110083 байтаПопробуйте онлайн!
5 байтов спасибо mypetlion ; 1 байт от орлиного глаза АрБо ; 17 байт из xnor !
Построить заказанные перегородки
m
вn
бункеры,m = 0,1,2,3,...
выбрав для двоичных чисел сn-1
0
s иm
1
s.источник
if i==p:i=0;p*=2
может статьi%=p;p<<=i<1
экономить 5 байт.print b
не нужно: Di+p
просто подсчитывает 1, 2, 3 ... в запутанном виде и может быть просто одной переменной.C # (.NET Core) ,
608 570567 байтПопробуйте онлайн!
Боже мой, что я сделал (так много петель, это то, что я сделал)
Это должно работать, хотя!
Если вы переместите цикл печати на одну скобку назад, он будет показывать вам список в том виде, в котором он был создан, каждый раз, когда он повторяется. (Я рекомендую добавить новую строку или что-то, чтобы отличить каждый цикл, если вы делаете.)
Честно много я потратил времени на борьбу с языком ... никаких красивых печатных массивов, различного поведения == ...
Надеюсь, эту версию легче читать.
источник
Perl 6 , 50 байт
Попробуйте онлайн!
Блок анонимного кода, который возвращает ленивый бесконечный список. Это использует ту же стратегию, что и ответ Чаза Брауна .
Объяснение:
источник
VDM-SL , 51 байт
Понимание рекурсивных множеств с конкатенацией последовательностей.
Не на TIO, вы можете запустить в программе (если вы включите ограничения для типа nat или он не завершится):
Включает необязательные 0 в ответ, иначе это будет 52 байта привязки на nat1
источник
Wolfram Language (Mathematica) , 131 байт
Попробуйте онлайн!
источник
perl -M5.010 122 байта
Добавлено несколько новых строк для удобства чтения (не учитывается при подсчете байтов)
источник
Python 2 , 120 байт
Попробуйте онлайн!
Чуть дольше, чем большинство других ответов, но мне понравилась идея, стоящая за этим.
источник
Stax , 6 байт
Запустите и отладьте его
Для ввода
n
процедура примерноисточник
JavaScript (V8) , 98 байт
Попробуйте онлайн!
Ура! Наконец получил его под 100 :) В основном это порт моего ответа C # .
источник