Escreva um programa, com uma entrada n , gerará todas as n-tuplas possíveis usando números naturais.
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)...
- A saída pode estar em qualquer ordem que não quebre outras regras.
- O programa deve ser escrito para ser executado para sempre e listar todas as tuplas aplicáveis exatamente uma vez, em teoria.
- Na realidade, seu programa alcançará o limite e a falha do seu número inteiro. Isso é aceitável desde que o programa seja executado infinitamente, se apenas o seu tipo inteiro for ilimitado.
- Cada tupla válida deve ser listada dentro de um tempo finito, se apenas o programa tiver permissão para executar esse período.
- A saída pode, a seu critério, incluir zeros além dos números naturais.
- Você pode escolher o formato de saída do seu programa para sua conveniência, desde que a separação entre tuplas e números dentro de cada tupla seja clara e consistente. (Por exemplo, uma tupla por linha.)
- A entrada (n) é um número inteiro de um a seis. O comportamento necessário é indefinido para entradas fora desse intervalo.
- Aplicam-se as regras do código-golfe, as vitórias mais curtas do programa.
Obrigado a "Artemis Fowl" pelo feedback durante a fase do sandbox.
Respostas:
Casca , 2 bytes
Experimente online!
Explicação
N
é a lista infinita de números naturais[1,2,3,4,..
.π
é o poder cartesiano. Resultado é uma lista infinita de listas. Cada lista do comprimento desejado ocorre exatamente uma vez porqueπ
é legal assim. Entrada e saída estão implícitas.fonte
n
- as tuplas são obtidas pegando o produto cartesiano da lista original e da lista den-1
-tuples, em ordem crescente da soma dos índices.2,2,2
vem depois4,1,2
e5,1,1
.N
. Para duas tuplas, você toma o produto cartesiano com aN
ordem da soma dos índices. Nas duas listas, cada númeron
está no índice;n
portanto, para o comprimento 2, o resultado é ordenado pela soma. Para obter três tuplas, você pega o produto cartesianoN
e a lista de duas tuplas, ordenadas pela soma dos índices dos elementos nessas listas. Ele não olha para a soma da tupla, mas para sua posição na lista de tuplas.Haskell , 62 bytes
Experimente online!
n!s
gera todos osn
-tuplos que somams
.Então a resposta é
([1..]>>=).(!)
, ie\n -> [t | s<-[1..], t<-n!s]
.Esta é uma função que mapeia um número inteiro
n
para uma lista lenta infinita de tuplas (listas de números inteiros).fonte
Haskell , 50 bytes
Experimente online!
Lista
n
-tuplos classificados por soma.mapM
faz o trabalho pesado para gerar todos osn
pares de números de 0 a k. O<$f
truque é explicado aqui .Haskell , 51 bytes
Experimente online!
Recursivamente estende todos os
n-1
-tuplos em todosn
-tuplos, dividindo o primeiro númeroa
de cadan-1
-tuplo em dois númerosa-k,k
que somam a ele, de todas as maneiras possíveis.fonte
Pitão - 9 bytes
Obrigado a @FryAmTheEggman pelo golfe
Passa por todo x, e leva [1..x] ^ n. Isso cria duplicatas, portanto, apenas mantém as que são novas no x, também conhecidas como x. A formatação é um pouco estranha, mas pode ser padronizada com mais um byte,
.V1j}#b^Sb
Experimente online .
fonte
f}bT
->}#b
Além disso, sua contagem de bytes parece estar incorreta no momento?j(b)
. Além disso, obrigado pelo golfe.Brachylog (v2), 9 bytes
Experimente online!
Este é um gerador infinito que gera todas as tuplas possíveis. O link TIO possui um cabeçalho que usa o gerador para gerar 1000 elementos e os imprime (mas o gerador poderia continuar indefinidamente se eu pedisse isso; os números inteiros de Brachylog são ilimitados).
Parece que deve haver uma maneira mais tersa, mas há muitas restrições e esse é o melhor que posso ajustá-las em um único programa.
Explicação
Aliás, me parece interessante o quão diferentes são minhas explicações sobre os dois
≜
, apesar de fazerem exatamente a mesma coisa do ponto de vista de Brachylog. O primeiro≜
é o primeiro predicado não determinístico do programa, portanto define a ordem dos resultados; nesse caso, calcula todos os valores explícitos possíveis para a soma da lista na ordem 0, 1, 2, 3… e está sendo usado para garantir que as listas sejam exibidas na ordem da sua soma (isso garante que cada possível lista aparece após uma quantidade finita de saída). O segundo≜
é usado para calcular todas as possibilidades explícitas da lista (em vez de gerar uma fórmula especificando como os elementos da lista se relacionam).fonte
↰₁ẉ⊥
também é um bom cabeçalho, para impressão infinita.ᶠ
ou⊥
no cabeçalho.Perl 6 , 37 bytes
Experimente online!
É executado essencialmente
polymod
com o número de entradas necessárias, onde o módulo é sempre maior que a entrada, ou seja, 0.polymod (1,1,1), 1.polymod (2,2,2) etc. Dessa forma, o dígito está sempre dentro o intervalo. Perl6 não vai me deixar módulo infinito ...fonte
(0, 1, 0, 0)
não está listado).Wolfram Language (Mathematica) , 62 bytes
Experimente online!
-3 bytes com separação inconsistente (excluir
@#&
)Experimente online!
fonte
C # (compilador interativo do Visual C #) , 148 bytes
Experimente online!
-3 bytes graças a @ASCIIOnly!
fonte
Write
com, por exemplo,'<literal tab>'
ou|
tem o mesmo comprimento e ocupa muito menos linhas: PGelatina , 10 (9?) Bytes
9, se pudermos produzir usando separação não consistente (sobre a qual perguntei) - remoção do
€
.Experimente online!
Quão?
fonte
€
é necessário, mas vamos aguardar o que o OP deve fazer dizer.05AB1E ,
1511 bytes-4 bytes através da criação de uma porta de @Maltysen resposta Pyth 's .
Experimente online.
Explicação:
fonte
MATL , 16 bytes
As tuplas são ordenadas por soma crescente e, dentro de uma determinada soma, são ordenadas lexicograficamente.
Experimente online!
fonte
Python 2 ,
12611210610110083 bytesExperimente online!
5 bytes thx para mypetlion ; 1 byte do olho de águia do ArBo ; 17 bytes do xnor !
Construa as partições ordenadas de
m
emn
compartimentos param = 0,1,2,3,...
, selecionando números binários comn-1
0
s em
1
s.fonte
if i==p:i=0;p*=2
pode tornari%=p;p<<=i<1
- se para salvar 5 bytes.print b
não é necessário: Di+p
está apenas contando 1, 2, 3 ... de uma maneira complicada e, portanto, pode ser apenas uma variável única.C # (.NET Core) ,
608 570567 bytesExperimente online!
meu deus, o que eu fiz (tantas voltas, foi o que eu fiz)
Deve funcionar, no entanto!
Se você mover o loop de impressão de volta para um suporte, ele mostrará a lista conforme ela é criada, toda vez que ele faz um loop. (Eu recomendo adicionar uma nova linha ou algo para distinguir cada loop, se você o fizer.)
Sinceramente, passei muito do meu tempo lutando com a linguagem ... nenhuma matriz bonita de impressão, comportamentos variados de == ...
Espero que esta versão seja mais fácil de ler.
fonte
Perl 6 , 50 bytes
Experimente online!
Bloco de código anônimo que retorna uma lista infinita lenta. Isso usa a mesma estratégia da resposta de Chas Brown .
Explicação:
fonte
VDM-SL , 51 bytes
Compreensão recursiva de conjuntos com concatenação de sequências.
Não no TIO, você pode executar um programa (se você ativar limites para o tipo nat ou ele não será finalizado):
Inclui os 0s opcionais na resposta, caso contrário, seriam 52 bytes de ligação em nat1
fonte
Wolfram Language (Mathematica) , 131 bytes
Experimente online!
fonte
perl -M5.010 122 bytes
Adicionadas algumas novas linhas para facilitar a leitura (não contadas na contagem de bytes)
fonte
Python 2 , 120 bytes
Experimente online!
Um pouco mais do que a maioria das outras respostas, mas gostei da ideia por trás disso.
fonte
Stax , 6 bytes
Execute e depure
Para entrada,
n
o procedimento é aproximadamentefonte
JavaScript (V8) , 98 bytes
Experimente online!
Viva! Finalmente consegui menos de 100 :) Basicamente, uma porta da minha resposta em C # .
fonte