Esse desafio é simplesmente retornar uma lista de listas de números inteiros, semelhante à função de intervalo do Python, exceto que cada número sucessivo deve ser tão profundo nas listas.
Regras :
- Crie um programa ou uma função não anônima
- Deve retornar ou imprimir o resultado
- O resultado deve ser retornado em uma lista (de listas) ou matriz (de matrizes)
- Se o parâmetro for zero, retorne uma lista vazia
- Isso deve poder manipular um parâmetro inteiro 0 <= n <70.
- (soluções recursivas explodem bem rápido)
- A função deve ser chamada apenas com um parâmetro.
- Outro comportamento é indefinido.
- Isso é código de golfe, então o código mais curto vence.
Exemplo de chamada:
rangeList(6)
> [0, [1, [2, [3, [4, [5]]]]]]
Casos de teste:
0 => []
1 => [0]
2 => [0, [1]]
6 => [0, [1, [2, [3, [4, [5]]]]]]
26 => [0, [1, [2, [3, [4, [5, [6, [7, [8, [9, [10, [11, [12, [13, [14, [15, [16, [17, [18, [19, [20, [21, [22, [23, [24, [25]]]]]]]]]]]]]]]]]]]]]]]]]]
69 => [0, [1, [2, [3, [4, [5, [6, [7, [8, [9, [10, [11, [12, [13, [14, [15, [16, [17, [18, [19, [20, [21, [22, [23, [24, [25, [26, [27, [28, [29, [30, [31, [32, [33, [34, [35, [36, [37, [38, [39, [40, [41, [42, [43, [44, [45, [46, [47, [48, [49, [50, [51, [52, [53, [54, [55, [56, [57, [58, [59, [60, [61, [62, [63, [64, [65, [66, [67, [68]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]]
EDIT: a resposta de isaacg é a mais curta até agora. Atualizarei a resposta aceita se alguém encontrar uma resposta mais curta em um idioma que existia no lançamento do desafio. Obrigado por jogar!
code-golf
array-manipulation
mbomb007
fonte
fonte
import math
em Python, por exemplo, não acho que isso poderia ocorrer dentro de uma função.Respostas:
Pitão, 13 bytes
Experimente aqui.
fonte
APL (
1318)Assumindo
⎕IO=0
:Explicação:
×⍵:
se⍵
é positivo,,∘⊂∘,
: junte o operando esquerdo ao delimitar o operando direito (ou sejax ,∘⊂∘, y = [x, [y]]
)/
: reduzir⍳⍵
: os números0..⍵-1
⊃
: divulgar o resultado⋄
: de outra forma⍬
: retorna a lista vazia/
falha⍬
e⍳0
fornece a lista vazia.)Termo aditivo:
Esta função retorna uma matriz aninhada. No entanto, é um pouco difícil diferenciar isso da saída padrão da APL. Ele separa os itens da matriz por espaços, para que você possa diferenciar o aninhamento por espaços duplos. Aqui está uma função que pega uma matriz aninhada e retorna uma string, formatando a matriz aninhada no estilo Python (ou seja
[a,[b,[c,...]]]
).fonte
f←
ao início do seu programa, a menos que o modifique para aceitar a entrada do usuário.Haskell, 67 bytes
No Haskell, todos os elementos de uma lista devem ser do mesmo tipo; portanto, não posso misturar números inteiros com a lista de números inteiros e preciso definir um tipo de lista personalizado
L
. A função auxiliar#
constrói recursivamente a lista necessária. A função principalp
verifica a lista vazia e chama o#
contrário.Como novos tipos de dados não podem ser impressos por padrão (as regras permitem apenas retornar a lista), adiciono mais código para fins de demonstração:
Agora:
fonte
Python, 48 bytes
Usando a multiplicação de lista para lidar com o caso especial.
fonte
*(i<n-1)
pode ser feito como[:n+~i]
, uma vez que é uma lista única.Mathematica, 33
fonte
CJam, 16 bytes
Este é um programa completo. Ele recebe entrada via STDIN e imprime a matriz final em STDOUT.
Assim como na outra entrada CJam, a
0
entrada será impressa""
como essa é a representação de uma matriz vazia no CJam.Como funciona :
Experimente online aqui
fonte
JavaScript (ES6) 40
Solução recursiva, bastante robusta, sem golpes. A atualização falha perto de 6500 com 'muita recursão'
Solução iterativa (45) Sem limites, exceto o uso de memória
Tente F (1000): o console do FireBug não mostrará mais de 190 matrizes aninhadas, mas elas estão lá
fonte
Java,
88107105104102 bytesBastante longo em comparação com os outros, embora você não possa fazer muito melhor com Java. Uma verificação para determinar se é necessário continuar a recursão.
fonte
import java.util.*;
isso seja auto-suficiente (ou totalmente qualificadojava.util.List
ejava.util.Stack
, mas isso é muito mais longo). +19 para torná-lo 107, ainda 7 melhor do que a resposta Java Eu estava trabalhando em: Do!=n
pode sero<n
e você pode trocar o ternárioo<n?o++:""
.final
onint n
possa ser removido.Python 2, 56 bytes
Eu suspeito que isso poderia ser jogado mais.
Testes:
fonte
CJam, 17 bytes
Sei que o Optimizer encontrou 16, mas aqui está o melhor que posso fazer:
Este é um bloco, a coisa mais próxima de uma função no CJam, que pega um número inteiro na pilha e deixa a matriz aninhada desejada.
Use este programa para testá-lo , que coloca a entrada na pilha, depois chama a função e inspeciona a pilha. Observe que
0
, para , a saída da pilha conterá""
- esta é a representação nativa do CJam de uma matriz vazia.fonte
Ruby 46
Teste on-line: http://ideone.com/uYRVTa
fonte
C # - 100
Recursão simples. Verifique o caso especial zero e marque com uma variável, abaixo com a outra
C ++ 87
(Visual C ++ 2012)
Este é ótimo, com o que quero dizer bizantino, mas é a mesma idéia básica que o c # one.
É uma implementação de matriz no estilo C, por isso não fornece uma matriz, fornece um ponteiro int, no qual eu estava armazenando ints e outros ponteiros. Assim:
[0,*] *->[1,#] #-> [2,&] &-> etc
onde os símbolos são pseudocódigo para o valor int de um ponteiro e o -> é para onde ele aponta na memória.Que excelente implementação fácil de usar de matrizes irregulares no estilo c que eu criei (tosse), mas mantenho que é plausível o suficiente para estar dentro das regras da pergunta.
Há muitos operadores ternários abusando aqui, e também muitos abusando da conversão implícita de int para bool.
Exemplo: Se deixarmos
int *bar = (int*)A(3);
, podemos ver:Qual é o ponteiro para [0, [1, [2]]].
Certo, tudo bem. Na verdade, não precisa ser terrível. Aqui está um código de teste para executar este código c ++:
}
fonte
C++
.Array g(params object[]a)=>a;Array f(int y,int x=0)=>y<1?g():y<2?g(x):g(x,f(y-1,x+1));
Pitão, 15 bytes
O que realmente está dizendo, em Python:
fonte
qJ_1
é o mesmo que!Q
. EJtQ
realmente desperdiça 1 byte.?Y!Qu[HG)_UtQ[tQ
[tQ
para]tQ
, o que é equivalente, você trocará para a ordem das operações de?
, para poder substituir!Q
porQ
. Isso resulta em?u[HG)_UtQ]tQQY
- mais 1 byte salvo.Haskell ,
65 59 4541 bytesEssas listas aninhadas são da mesma estrutura de dados que
Tree
s com raiz , exceto que elas também podem estar vazias. Portanto, podemos usar uma lista deles - também chamada de aForest
para representá-los.Experimente online!
Explicação
Primeiro de tudo, precisamos implementar o
Tree
tipo de dados:A partir daí, é apenas a recursão usando dois parâmetros
m
(contagem) en
para acompanhar quando terminar:Alternativa, 61 bytes
Experimente online!
Explicação
A função
unfoldForest
pega uma lista de valores iniciais e uma funçãox -> (y,[x])
. Para cada valor inicial,x
ela desdobra uma árvore usando a função, produzindo uma tupla(y,xs)
ondey
se tornará a raiz exs
são usadas para repetir o procedimento:fonte
Perl - 44
Adicionará explicação mediante solicitação. Você pode tentar aqui .
fonte
nil
ou qualquer outro equivalente? Eu pergunto porque na página que você conectar-se aos olhares de matriz mais íntimos como(3,)
undef
é o equilvalente denil
ounull
em Perl e não há um elemento extra. O Perl nivela matrizes, portanto, isso cria referências de matriz aninhadas.JavaScript, 93 bytes
Isso não é o ideal, mas é melhor tentar. Vou tentar jogar isso ainda mais tarde, embora por enquanto não veja uma maneira óbvia.
fonte
Python, 75 bytes
Isto é apenas para mostrar. É o programa que escrevi ao criar / projetar esse desafio.
fonte
Python, 44
Cria recursivamente a árvore. O
[:n]
final é um caso especialn==0
para dar a lista vazia.fonte
and
eor
posso ter espaços omitidos próximos a números inteiros, maselse
não posso.else
começa come
, e coisas como1e6
são literais numéricos válidos.else
, por exemplo,x = 1 if y==2else 5
funciona.Joe , 8 bytes
Nota: Esta é uma resposta não concorrente. A primeira versão do Joe foi lançada após esta pergunta.
O que temos aqui?
F:
define uma função F que é uma cadeia de/+,
,M]
eR
. Quando você ligaFn
, primeiroRn
é avaliado, retornando um intervalo de 0 a n, exclusivo.M]
agrupa cada elemento em uma lista. Em seguida, a lista é aplicada/+,
.x +, y
retornax + [y]
./
é uma dobra direita. Assim,/+,a b c d...
retorna[a, [b, [c, [d...]]]
.Invocações de exemplo (o código é recuado por 3, produzido por 0):
fonte
Ruby - Versão Recursiva - 52
Versão não recursiva:
666257Saída de amostra (o mesmo para as duas versões)
A versão não recursiva pode manipular entradas arbitrariamente grandes.
Ambas as versões também aceitam graciosamente números negativos
fonte
stack level too deep (SystemStackError)
)PHP 5.4 (67 bytes):
Eu sei eu sei.
Está longe de ser a resposta mais curta.
Mas funciona!
Aqui está:
Você pode testá-lo aqui: https://ideone.com/42L35E (ignore o erro)
Javascript (57 bytes):
Este é o mesmo código exato , exceto que o Javascript é exigente quanto ao retorno e reduzi os nomes das variáveis:
Vejo? O mesmo código!
ES6 (49 bytes):
Basicamente, o mesmo código exato, mas reduzido para o ES6:
fonte
f=lambda
...But it's pretty standard codegolf for functions that they have to be callable by name (aka, more than once and without typing the entire function again.)
-> nunca ouvi falar disso, e eu uso este site há quase um ano. Além disso, este é um argumento inválido, pois você pode atribuir as funções a uma variável.Javascript (114 bytes):
Todo mundo estava fazendo recursividade, então eu queria tentar uma solução iterativa. Eu tenho muitos casos especiais, no entanto.
Possuo uma lista principal e, em seguida, faço um loop e anexo novas listas com novos números.
fonte
Lisp comum (95 bytes):
fonte
JavaScript,
3537 bytesSolução recursiva
Experimente online!
fonte
05AB1E , 11 bytes
Experimente online ou verifique todos os casos de teste .
Alternativa de 11 bytes:
Experimente online ou verifique todos os casos de teste .
Explicação:
05AB1E não possui loops que vão para baixo, portanto, fazem um loop no intervalo
(input, 0]
eu tenho que:ݨR
; crie um intervalo[0, input]
, remova o último item, inverta) e depois faça um loop sobre ele (vy
);[0, input)
(F
) e faça a diferença absoluta entre o índice de loop e a entrada 1 (NI<α
).fonte