Inspirado em Encontre o "tamanho desembrulhado" de uma lista .
Defina o Tamanho Recursivo RS
, de uma lista que não contém listas como seu comprimento (número de itens contidos) e o Tamanho Recursivo de uma lista que contém quaisquer listas como a soma de seu comprimento e o Tamanho Recursivo dessas listas.
Desafio
Escreva um programa ou função que produza o Tamanho Recursivo de qualquer lista em tão poucos bytes quanto possível.
A entrada é uma lista e pode conter números, seqüências de caracteres (se o seu idioma os possuir) e listas semelhantes.
Por exemplo:
RS([]) = 0
RS([[]]) = 1
RS([4, 5, 6]) = 3
RS(["four", "five", "six"]) = 3
RS(["[[[[]]]]", "[][][][][]", "][][[[]]][]["]) = 3
RS([[4, 5, 6]]) = 4
RS([["four", "five", "six"]]) = 4
RS([["[[[[]]]]", "[][][][][]", "][][[[]]][]["]]) = 4
RS([[4], [5], [6]]) = 6
RS([["four"], ["five"], ["six"]]) = 6
RS([["[[[[]]]]"], ["[][][][][]"], ["][][[[]]][]["]]) = 6
RS([[[[[[[[[]]]]]]]]]) = 8
RS([[],[],[],[],[],[],[],[]]) = 8
RS([[],[],[[]],[[[[]]]]]) = 8
RS([0,[-1],[2.3,-4.3],[5,[6]],[7,[8,9,[10,11,[12,13,14]]]]]) = 22
Observe que, se o seu idioma não tiver strings, mas possuir listas de caracteres, os exemplos que contêm "strings"
acima podem realmente ser listas de caracteres e ter resultados maiores. Como um exemplo:
RS([['f','o','u','r'], ['f','i','v','e'], ['s','i','x']]) = 14
Isso é código-golfe , então a resposta mais curta em bytes vence; nenhum negócio engraçado, como sempre.
Uma entrada que não seja da lista pode produzir qualquer saída.
A E / S é tão flexível como de costume .
fonte
Respostas:
Gelatina , 8 bytes
Experimente online!
Como funciona
fonte
Python, 42 bytes
Para uma não lista, saída 0. Para uma lista, imprima seu comprimento mais a soma das saídas recursivas para seus elementos.
As listas ficam acima dos números e das strings abaixo na ordem do Python 2, exigindo
[]<=x<''
. Em vez disso, verificamosx*0==[]
, enquanto o resultado de0
para um número ou''
para uma string.fonte
JavaScript (ES6),
3937 bytesGuardado 2 bytes graças a @ edc65
fonte
f=a=>a.map?a.reduce((s,x)=>s+f(x),0):0
1
lá em algum lugar.f=a=>a.map&&a.map(x=>a-=~f(x),a=0)&&a
.-=~
é 1 caractere menor que+=1+
e, convertendo um booleano em inteiro, ele corta outro caractere. Reutilizara
para evitar a variável globalt
Mathematica, 20 bytes
Função anônima. Pega uma expressão como entrada e retorna um número como saída. O caractere Unicode é U + 221E INFINITY para
\[Infinity]
.Level[#,∞]
fornece uma lista das subexpressões da entrada e asLength@
conta.fonte
Mathematica, 14 bytes
Modificação menor da minha resposta anterior . Como expliquei lá,
LeafCount
já cuida de valores atômicos aninhados, mas também conta a lista mais externa, que precisamos subtrair do resultado.fonte
Perl, 34 bytes
Uma função recursiva! Sim, o Perl não apenas possui regex, mas também possui funções!
Se você quiser testá-lo, pode executar algo como:
fonte
Mathematica, 32 bytes
Função recursiva sem nome. O trecho
#0/@#~Select~ListQ
chama a função novamente em cada elemento da entrada que é uma lista eTr
resume esses valores. Felizmente, o Mathematica não se preocupa em pegar o comprimento da lista vazia e procurar elementos qualificados da lista vazia, portanto, nenhum caso básico é necessário.fonte
Haskell, 52 bytes
Exemplo de uso:
Haskell não suporta listas mistas (por exemplo, Int e lista de Int), então eu vou com um tipo de lista personalizado
L
que é um elemento de algum tipo a (->E a
) ou uma lista de outros Ls (->N[L a]
). O cálculo do RS é uma recursão simples em que umE
conta1
eN
um mais a soma dos tamanhos recursivos de seus elementos. A soma total é reduzida em 1, então eu a subtraio viapred
.Nota lateral: os tipos e valores exatos dos elementos não são importantes para o algoritmo, portanto, podemos remover o polimorfismo e lidar apenas com elementos abstratos e prosseguir
data L=E|N[L]
.fonte
Fator, 105 bytes
Função recursiva g.
Ungolfed (tipo):
Você encontrará que não há chamadas para,
length
porque, em vez de usar o comprimento interno, ele é implementado atravésdrop 1
de strings e não-sequências.fonte
Mathematica, 18 bytes
Mais uma abordagem do Mathematica. Não é tão curto quanto usar o built-in,
LeafCount
mas ainda bastante conciso. Isso faz uso doMapAll
operador//@
que chama uma função em todos os nós de uma expressão e usamos essa função para incrementar um contadorc
. Como noLeafCount
caso, isso fornece mais um do que precisamos, porque conta também a cabeça da lista externa e, portanto, iniciamos o contador-1
.fonte
C # (compilador interativo do Visual C #) , 50 bytes
Experimente online!
Utiliza a mesma técnica que a enviada anteriormente resposta Java , mas utiliza o LINQ para reduzir o tamanho da resposta.
Explicação:
fonte
05AB1E (legado),
2217 bytesExperimente online ou verifique todos os casos de teste .
Explicação:
Esse desafio apresenta vários desafios a serem superados no 05AB1E:
λ
), é útil apenas para seqüências inteiras.Aqui está uma resposta minha como exemplo da função recursiva 05AB1E. Por causa disso, tive que encontrar uma alternativa para fazer chamadas recursivas, o que fiz colocando parte do código em uma sequência e execute essa sequência como código 05AB1E recursivamente.isList
comando no 05AB1E, então tive que usar algumas soluções alternativas para verificar isso utilizando quebra automática em uma lista, achatamento profundo e verificação de igualdade.˜
é um nivelamento profundo que remove todas as camadas e transforma uma lista multidimensional em uma única lista com todos os valores mais internos. (ou seja,[[1,2],[[[3]],4]]
torna-se[1,2,3,4]
).Acabei com o código na parte superior para superar todos os três problemas acima. Está dividido em três partes principais. Primeiro, temos o seguinte:
A sequência contém o seguinte código:
Um mapa é usado em vez de um loop foreach, porque o mapa está implícito
y
e um loop foreach precisa de um explícitoy
. Nós nos preocupamos apenas com ocounter_variable
.E finalmente, depois que todos os mapas e mapas internos estiverem prontos, nós:
fonte
R , 65 bytes
Experimente online!
Implementação recursiva óbvia das especificações.
fonte
C,
174167152 bytesFunção recursiva
f
, que vaza memória ( 152 ):Recursiva
f
que não vaza, usando referências, em 167 :Ungolfed:
"Mas como, você pergunta," isso pode ser respondido em C? Certamente, não há matrizes gerenciadas em C e você não pode realmente ter matrizes heterogêneas ...? "
"Aha", respondo, "pois tenho trabalhado em um sistema simples de" objetos "para (GNU-ish) C11 e ISO C ++ 11".
O programa de demonstração completo para esta função é:
No momento, ele mora aqui e você precisará desse repositório para usar isso.
Você também precisará da biblioteca de hash Fowler-Noll-Vo
libfnv
, compilada para sua plataforma. Está nesse repositório e você também pode acessá-lo aqui .Então você pode fazer
cc -DNODEBUG size.c path/to/libfnv.a -o size
.A implementação não é necessariamente eficiente:
Mas funciona! O último commit no master (no qual este programa foi compilado) foi 2 dias atrás, o que significa que esse envio é válido.
fonte
Axioma 118 bytes
destroçado
resultados
fonte
APL (NARS), 24 caracteres, 48 bytes
Esta seria a tradução literal da resposta 'my' Axiom aqui ... Na APL, a lista de nulos seria 'Zilde, que você indica com' [], '' é '' ['],' 1 2 3´ é ´ [1,2,3] ´ ecc Alguns testes:
para imprimir o outro tipo de resultado, o exercício propõe que precisamos de outra função (ambas as funções RS e Rs devem estar ok para o exercício)
para ver como aparecem algumas entradas, usamos a função o:
imprima Zilde e uma lista de 8 Zilde:
fonte
Java, 96 bytes
Experimente online.
Explicação:
fonte
Anexo , 21 bytes
Experimente online!
Acontece que a abordagem C # é bastante curta no Attache.
Alternativas
25 bytes
f[x]:=#x+Sum!f=>IsArray\x
26 bytes
f[x]:=#x+Sum[f=>IsArray\x]
35 bytes
f:=Sum##{If[IsArray@_,1+f@_,1]}=>Id
35 bytes
f:=Sum@Map[{If[IsArray@_,1+f@_,1]}]
37 bytes
f[x]:=Sum[{If[IsArray@_,1+f@_,1]}=>x]
fonte
Clojure,
797751 bytesA entrada deve ser uma lista, não um vetor. Ambos seriam suportados usando
sequential?
.Anterior:
fonte
Python, 72 bytes
fonte
0
eif
,0
eelse
, e)
efor
.