Esta construção é uma maneira de representar os números naturais.
Nesta representação, 0 é definido como o conjunto vazio e, para todos os outros números, n é a união de {0} e {n-1}.
Por exemplo, para construir 3, podemos seguir o algoritmo:
3 =
{ø, 2} =
{ø, {ø, 1}} =
{ø, {ø, {ø}}}
Tarefa
Como você deve ter adivinhado, sua tarefa é coletar um número natural (incluindo zero) e produzir sua construção.
Você pode imprimir como uma sequência de caracteres ou como um objeto definido, se o seu idioma de escolha suportar esses objetos.
Se você escolher a saída como uma string, deverá representar um conjunto com chaves ( {}
). Opcionalmente, você pode representar o conjunto vazio como ø
(caso contrário, deve ser um conjunto sem entradas {}
). Você também pode optar por adicionar vírgulas e espaços em branco entre e depois das entradas no conjunto.
A ordem não é importante, porém você pode não ter nenhum elemento repetido nos conjuntos que você produz (por exemplo {ø,ø}
)
Isso é código-golfe, então o objetivo é ter o menor número de bytes
Casos de teste
Aqui estão alguns casos de teste com alguns exemplos de saídas.
0 -> {}
1 -> {{}}
2 -> {{}{{}}}
3 -> {{}{{}{{}}}}
4 -> {{}{{}{{}{{}}}}}
fonte
Respostas:
Python , 28 bytes
Experimente online!
Esta é uma solução bastante branda para o problema. Para números maiores que zero, você pode obter a representação com a fórmula da string
"{{}"*x+"}"*x
. No entanto, isso não funciona para zero, onde esta é a string vazia. Podemos usar esse fato para causar um curto-circuito em umor
e retornar o conjunto vazio.Eu queria usar os objetos do conjunto interno do python para resolver esse problema, mas infelizmente:
Você não pode colocar conjuntos dentro de conjuntos em python.
fonte
x
para"{{}"*x+x*"}"or
salvar um bytef=
pode ser removido.frozenset
mas ninguém tem bytes para isso ...Haskell , 37 bytes
Experimente online!
Até 10 minutos atrás, uma resposta como essa não faria sentido para mim. Todos os créditos vão para esta resposta de dicas .
Basicamente, usamos
>>
comoconcat $ replicate
(mas passando uma lista de n elementos em vez de simplesmente n) e=<<
comoconcatMap
, replicando n vezes cada uma das cadeias da lista e concatenando o resultado em uma única cadeia.O
0
caso é tratado separadamente, pois retornaria uma string vazia.fonte
f 1
demais para fazê-lo funcionar corretamenteJavaScript, 28 bytes
Representa conjuntos usando matrizes. Solução não recursiva de 38 bytes:
Retorna as seqüências de saída de exemplo.
fonte
Mathematica, 27 bytes
Eu tenho duas soluções nessa contagem de bytes:
fonte
#//.{1->{{}},x_/;x>1->{{},x-1}}&
. Embora eu acho que ele mexe-se de entrada 0Perl 6 , 37 bytes
Tente
Expandido:
fonte
:
ou isso é algo novo para o Perl 6?05AB1E ,
65 bytesCódigo
Usa a codificação CP-1252 . Experimente online! ou Verifique todos os casos de teste!.
Explicação
fonte
F¯)
, isso não funciona?n=0
, pois a saída está vazia (não é um conjunto vazio).Retina , 22 bytes
Experimente online!
Explicação
Converta a entrada para unário.
Substitua cada dígito unário por
{{}
e imprima o resultado sem avanço de linha à direita (\
).Remova as aberturas
{
, para que as restantes}
sejam exatamente as que ainda precisamos imprimir para fechar todos os conjuntos. No entanto, o procedimento acima falha na entrada0
, onde não imprimimos nada. Então...Se a sequência estiver vazia, substitua-a pelo conjunto vazio.
fonte
n
vezes em Retina ...Brain-Flak , 135 bytes
Inclui +1 para
-A
Experimente online!
fonte
Röda , 37 bytes
fonte
CJam , 11 bytes
Imprime um objeto semelhante a um conjunto que consiste em listas de listas. O CJam imprime listas vazias como cadeias vazias, pois listas e cadeias são quase intercambiáveis.
Experimente online!
Explicação
Resposta antiga,
2118 bytesIsso foi antes de se confirmar que não havia problema em imprimir uma estrutura de lista aninhada. Usa o algoritmo de repetição de string.
Economizou 3 bytes graças a Martin Ender!
Explicação
fonte
Gelatina , 6 bytes
Este é um link niládico que lê um número inteiro de STDIN e retorna uma matriz irregular.
Experimente online!
Como funciona
fonte
Python 3 , 32 bytes
Não é o caminho mais curto, mas eu apenas tive que fazer isso com recursão.
Experimente online!
fonte
Cardinal ,
5150 bytesExperimente online!
Explicação
Receba entrada e envie para baixo e para a esquerda a partir do #
Imprima "{" uma vez e depois imprima "{} {" n-1 vezes se n> 1 e imprima "{}" se n> 0
Mantenha o valor de entrada até que o primeiro loop seja concluído
Imprima "}" uma vez e repita n-1 vezes se n> 1
fonte
AHK, 55 bytes
Não é a resposta mais curta, mas gostei disso porque as idiossincrasias do AutoHotkey fazem esse método de recursão parecer super errado.
If
AsLoop
instruções e assumem que a próxima linha é a única coisa incluída se colchetes não forem usados. Parênteses curvos são caracteres de escape, portanto, você deve escapá-los com outros parênteses para usá-los como texto. Além disso, a variável1
é o primeiro argumento passado. Quando leio o código sem conhecer esses detalhes, a lógica fica assim:s
igual à resposta erradaSem todos os caracteres de escape do colchete, ficaria assim:
fonte
JavaScript 50 bytes
fonte
tinylisp , 52 bytes
Experimente online! (equipamento de teste).
Explicação
Observe que
(cons x (cons y nil))
é assim que você cria uma lista que contémx
ey
no Lisp.fonte
C (gcc) , 52 bytes
Aproveitando algumas avaliações e recursões de curto-circuito.
Experimente online!
fonte
Pure Bash ,
494841 bytesExperimente online!
fonte
dc , 46 bytes
Experimente online!
Entrada em stdin, saída em stdout.
Isso funciona calculando uma fórmula para a saída desejada como um número de base 256. O comando P em dc é usado para imprimir o número da base 256 como uma sequência.
Mais explicações:
Seja n a entrada n. O programa dc calcula a soma de
A = piso (256 ^ n / 255) * 125 (BF é interpretado por dc como 11 * 10 + 15 = 125)
e
B = piso ((256 ^ n) ^ 3 / (8 ^ 8-1)) * 8092541 * (256 ^ n).
Para:
Observe que 1 + 256 + 256 ^ 2 + ... + 256 ^ (n-1) é igual a (256 ^ n-1) / 255, pela fórmula de uma progressão geométrica, e isso é igual a piso (256 ^ n / 255 ) Portanto, este é o número que consiste em n 1 na base 256.
Quando você o multiplica por 125 para obter A, o resultado é o número que consiste em n 125 na base 256 (é claro que 125 é um dígito na base 256). Provavelmente é melhor escrever os dígitos na base 256 como números hexadecimais; 125 é hexadecimal 7D, então A é o número da base 256 que consiste em n 7Ds seguidos.
B é semelhante:
Desta vez, observe que 1 + 16777216 + 16777216 ^ 2 + ... + 16777216 ^ (n-1) é igual a (16777216 ^ n - 1) / 16777215, e isso é igual a piso (16777216 ^ n / 16777215).
Agora, 256 ^ 3 = 16777216 e 8 ^ 8-1 = 16777215, então é isso que estamos computando como piso ((256 ^ n) ^ 3 / (8 ^ 8-1)).
A partir da representação geométrica em série, esse número na base 256 é 100100100 ... 1001 com n dos dígitos sendo 1 e o restante dos dígitos sendo 0.
Isso é multiplicado por 8092541, que é 7B7B7D em hexadecimal. Na base 256, este é um número de três dígitos que consiste nos dígitos 7B, 7B e 7D (escrevendo esses dígitos em hexadecimal por conveniência).
Daqui resulta que o produto escrito na base 256 é um número de 3n dígitos que consiste nos 3 dígitos 7B 7B 7D repetidos n vezes.
Isso é multiplicado por 256 ^ n, resultando em um número base-256 de 4n dígitos, consistindo nos 3 dígitos 7B 7B 7D repetidos n vezes, seguidos por n 0's. Isso é B.
A adição de A + B agora gera o número base-256 de 4n dígitos, consistindo nos 3 dígitos 7B 7B 7D repetidos n vezes, seguidos por n 7D's. Como 7B e 7D são os códigos ASCII para
{
e}
, respectivamente, essa é a sequência que consiste em n cópias de{{}
seguidas por n cópias de}
, que é exatamente o que queremos para n> 0. O comando P em dc imprime um número base-256 como uma corda, exatamente como precisamos.Infelizmente, n = 0 deve ser tratado como um caso especial. O cálculo acima produz um resultado de 0 para n = 0; nesse caso, eu apenas codifiquei a impressão da string
{}
.fonte
Java 7, 61 bytes
Experimente online!
fonte
Lote, 88 bytes
fonte
Brainf *** , 99 bytes
(nova linha para a estética) Como é brainf ***, recebe a entrada como códigos de caracteres ascii (a entrada "a" corresponde a 96)
Braineasy, 60 bytes
Além disso, na minha linguagem personalizada (baseada em brainf **, intérprete aqui ):
Você precisa codificar a entrada do programa no intérprete porque sou preguiçoso.
fonte
[]
? Parece que ele poderia ser removido05AB1E ,
53 bytesExperimente online!
Esta versão é depois que ele esclareceu que os conjuntos estão bem.
Versão antiga (que faz uso do ø):
05AB1E ,
54 bytesExperimente online!
Onde
1
é equivalente aø
.fonte