O desafio é simples: escreva um programa ou função que, quando recebe um número inteiro finito não negativo, gera uma matriz aninhada.
As regras
- Seu código deve produzir uma matriz aninhada válida e exclusiva para cada número inteiro 0 ≤ n <2 31 .
- Cada matriz aninhada possível com até 16 colchetes abertos deve ser gerada dentro desse intervalo. (Isso não significa que seu código nunca pode gerar uma matriz aninhada com mais de 16 colchetes abertos.)
- Seu código pode gerar uma representação de seqüência de caracteres da matriz aninhada em vez de uma matriz real (com ou sem vírgulas).
Um mapeamento possível:
0 -> []
1 -> [[]]
2 -> [[[]]]
3 -> [[], []]
4 -> [[[[]]]]
5 -> [[[], []]]
6 -> [[[]], []]
7 -> [[], [[]]]
8 -> [[], [], []]
9 -> [[[[[]]]]]
etc.
Pontuação
Isso é código-golfe , então o código mais curto em bytes vence.
code-golf
array-manipulation
balanced-string
ETHproductions
fonte
fonte
Respostas:
Python 2.7,
172 149 124118 bytesExplicação:
Defina uma bijeção por
[
↔1
e]
↔0
. Qualquer arranjo de suportes pode, então, ser representado por um número binário e vice-versa, por exemplo[][]
↔1010
(10) e[[][]]
↔110100
(52). Todas as disposições válidas de até 15 colchetes abertos (30 colchetes no total) são cobertas por números com até 30 bits (ignorando zeros à esquerda), que são precisamente os números menores que 2 31 .O primeiro loop for fornece o inverso dessa bijeção, convertendo um número em um arranjo de colchetes, enquanto verifica se o arranjo é válido.
Arranjos inválidos são substituídos na declaração de impressão por longas sequências de colchetes para evitar colisões. Por exemplo
11
(3) ↔[[
não é válido, portanto concatenamos 3 + 16 colchetes. Isso garante que todos os arranjos sejam únicos.O arranjo resultante é colocado dentro de um par de colchetes para formar uma matriz aninhada, de modo que
1010
(10) se torne[[][]]
e110100
(52) se torne[[[][]]]
. O suporte extra aberto significa que agora cobrimos todas as matrizes com 16 colchetes abertos.O programa a seguir pode ser usado para descobrir o número de um determinado array com até 16 colchetes.
fonte
Python,
153128 bytesMapeamos um número n para uma lista aninhada, observando seus dígitos binários da esquerda para a direita. Esse algoritmo funciona para qualquer número, não para menos de 2 32 .
[
.][
.][
.]
.Finalmente, fechamos todos os colchetes abertos.
fonte
Colher , 63 bytes (501 bits)
Este é o seguinte programa de conversão cerebral convertido em colher:
Lê um número inteiro em binário no stdin e gera a lista aninhada no stdin. Requer que 0 seja inserido como uma sequência vazia (sem dígitos) e requer um intérprete de cérebro com células de 8 bits. Mesmo algoritmo que minha resposta em Python.
Versão legível:
fonte
Gelatina , 28 bytes
Este itera sobre todas as cadeias de caracteres
[
e]
que começam com um[
e terminam com um]
, verifica se os suportes de corresponder, e imprime o n º jogo.Experimente online!
fonte
Perl,
8079 bytesNovamente usa orlp o algoritmo do , mas desta vez verifiquei primeiro se ele funciona ...
Inclui +1 para
-p
Forneça o número de entrada no STDIN
nest.pl
:A solução de Linus é de 64 bytes em perl:
A solução de Dennis é de 59 bytes em perl (cada vez mais lenta para grandes números):
fonte
-p
is counted as 1 extra bytePython 3,
120114 bytesTest it on Ideone.
How it works
The defined function f takes input n and initializes k to 0. We'll keep incrementing k until n + 1 values of k result in a valid output. Every time we find such a value of k, n is decremented once it reaches -1,
~n
yields 0, and the list r that corresponds to the last value of k is printed.The partial mapping from the positive integers to nested lists (i.e., k ↦ r) has to be bijective, but there are no other constraints. The one used in this answer operates as follows.
Convert k to a binary string representation, staring with 0b.
For example, 44 ↦ "0b101100".
Replace all 0's (code point 48) in the string representation with the string "]," and all 1's (code point 49) with [.
For example, "0b101100" ↦ "],b[],[[],],".
Remove the first three characters (they correspond to "0b") and the trailing character (hopefully a comma).
For example, "],b[],[[],]," ↦ "[],[[],]".
Try evaluating the generated code. If this results in an error, k isn't mapped to any list.
For example, "[],[[],]" ↦ ([], [[]]).
Concatenate the result (if any) with the empty list. If this results in an error, k isn't mapped to any list.
For example, ([], [[]]) + [] errors since + cannot concatenate lists and tuples.
fonte
Haskell, 71 bytes
The main function on the last line indexes into a list of all nested arrays, sorted by size (number of open brackets). So, all the arrays of size at most 16 are listed first.
Let's first look at code that's nicer and shorter, but Haskell's typechecker refuses to accept.
The function
p
on inputn
gives a list of all nested arrays of sizen
(open brackets). This is done recursively. Each such array consists of some headh
(first member) of sizek
and some tailt
(other members) of sizen-k
, both sizes nonzero. Or, it's the empty array for sizen==1
.The expression
p=<<[1..]
then flattensp(1), p(2), ...
into a single infinite list of all arrays sorted by sizeand the main function indexes into it.
... Or, it would, if Haskell didn't whine about "construct[ing] the infinite type: t ~ [t]". Haskell cannot represent the infinite list above whose elements are arbitrarily nested arrays. All its elements must have the same type, but a type t cannot be the same as a list of t's. In fact, the function
p
itself cannot be assigned a consistent type without dependent typing, which Haskell lacks.So, instead we work on strings of brackets, simulating the cons operation by acting on
[
and]
characters. This takes an extra 9 bytes. The perils of golfing in a type-safe language.fonte
Haskell,
8782 bytesOutputs the array elements. Usage example:
(([0..]>>= \y->y#y)!!) 3
->"[][]"
.Function
#
builds all nested arrays as strings forn
open andm
close brackets, by keeping track of how many of each are left over. Always starts withn == m
. The main function callsy # y
for everyy <- [0,1,...]
and picks the element at the index given by the input.fonte
MATL, 31 bytes
Try it online! Or verify the first few test cases (takes a few seconds).
The produced mapping is:
Explanation
The code keeps testing increasing binary numbers, with digit
0
replaced by-1
; that is, using1
and-1
as digits. Digit1
will represent'['
and-1
will represent']'
.The program counts until n+1 valid numbers have been obtained. A number is valid if the following two conditions hold:
1
and-1
)1
digits always exceeds that of-1
) except at the end (where it is zero by condition 1).Once n+1 valid numbers have been obtained, the last one is transliterated by changing
1
into[
and-1
into]
, and then it is displayed.Code:
fonte