Um desafio simples para sua segunda-feira à noite (ou terça-feira de manhã na outra metade do mundo ...)
Você recebe como entrada uma matriz aninhada e potencialmente irregular de números inteiros positivos:
[1, [[2, 3, [[4], 5], 6, [7, 8]], 9, [10, [[[11]]]], 12, 13], 14]
Sua tarefa é determinar sua profundidade, que é a maior profundidade de aninhamento de qualquer número inteiro na lista. Nesse caso, a profundidade de 11
é 6
, qual é a maior.
Você pode assumir que nenhuma das matrizes estará vazia.
Você pode escrever um programa ou função, recebendo entrada via STDIN (ou alternativa mais próxima), argumento da linha de comando ou argumento da função e emitindo o resultado via STDOUT (ou alternativa mais próxima), valor de retorno da função ou parâmetro da função (saída).
A entrada pode ser obtida em qualquer formato conveniente de lista ou sequência que suporte matrizes não retangulares (com matrizes aninhadas de diferentes profundidades), desde que as informações reais não sejam pré-processadas.
Você não deve usar nenhum componente interno relacionado à forma das matrizes (incluindo os internos que resolvem esse desafio, que fornecem as dimensões de uma matriz aninhada). A única exceção é obter o comprimento de uma matriz.
Aplicam-se as regras padrão de código de golfe .
Casos de teste
[1] -> 1
[1, 2, 3] -> 1
[[1, 2, 3]] -> 2
[3, [3, [3], 3], 3] -> 3
[[[[1], 2], [3, [4]]]] -> 4
[1, [[3]], [5, 6], [[[[8]]]], 1] -> 5
[1, [[2, 3, [[4], 5], 6, [7, 8]], 9, [10, [[[11]]]], 12, 13], 14] -> 6
[[[[[[[3]]]]]]] -> 7
fonte
≡
é o primitivo embutido da APL exatamente para isso .\
nas entradas? EDIT: deixa pra lá apenas tentei assim. Isso também nem funciona. Porra, não posso usar argumentos de CMD?Respostas:
K, 4 bytes
Em K,
,/
juntará todos os elementos de uma lista. O idioma comum,//
itera para um ponto fixo, nivelando completamente uma lista arbitrariamente aninhada.,/\
iterará para um ponto fixo de maneira semelhante, mas reunirá uma lista de resultados intermediários. Contando quantos resultados intermediários visitamos antes de atingir o ponto fixo (#
), obtemos a resposta que queremos: a profundidade máxima de aninhamento."Contagem de junção sobre verificação de ponto fixo".
Em ação:
fonte
Retina , 10
Aqui, o formato da entrada é um pouco artificial - os
_
caracteres são usados para separadores de lista, portanto, uma entrada se pareceria com esta{1_{{2_3_{{4}_5}_6_{7_8}}_9_{10_{{{11}}}}_12_13}_14}
}{
e todos os outros\w
caracteres. Isso tem o efeito de: a) tornar todas as listas em todos os níveis consistidas em apenas um elemento eb) remover todos os caracteres não estruturais da lista.{
. Isso fornece o nível mais profundo de aninhamento.Experimente online.
Se isso for muito exagerado, a resposta anterior foi:
Retina , 13
Assume que as listas estão contidas em chaves
{}
.Experimente online .
fonte
_
vez de,,
mas isso pode ser um pouco exagerado._
separadores podem ser muito artificiais. Então estou deixando ambas as versões na respostaPython 2, 33 bytes
Define recursivamente a profundidade dizendo que a profundidade de um número é 0 e a profundidade de uma lista é uma a mais que a profundidade máxima de seus elementos. A lista de números versus é verificada comparando-se com o dicionário vazio
{}
, que fica acima dos números, mas abaixo das listas na ordenação arbitrária de tipos internos do Python 2.fonte
Pitão -
11107 bytes1 bytes salvos graças a @Dennis
4 bytes salvos graças a @Thomas Kwa
Experimente online aqui .
Continua somando a matriz até que ela pare de mudar, o que significa que é apenas um número, faz isso cumulativamente para salvar todos os resultados intermediários e obtém comprimento criando um intervalo com o mesmo comprimento da lista e obtendo o último elemento.
fonte
m!!d
pode se tornar&R1
.l
não é permitido no OP.Haskell, 43 bytes
Exemplo de uso:
maximum.scanr(#)0 $ "[1, [[3]], [5, 6], [[[[8]]]], 1]"
->5
.Haskell não tem listas mistas (
Integer
misturadas comList of Integer
), portanto, não posso explorar algumas funções de detecção de lista e preciso analisar a string.Estou começando à direita com
0
e adicione 1 para cada]
, subtraia 1 para cada[
e mantenha o valor caso contrário.scanr
mantém todos os resultados intermediários, para quemaximum
possa fazer seu trabalho.fonte
JavaScript (ES6), 35 bytes
Explicação
Função recursiva que retorna a profundidade máxima de uma matriz ou
0
se passou um número.fonte
MATL , 11
14 15bytesChaves entre dentes são usadas no MATL para esse tipo de matrizes. De qualquer forma, a entrada é obtida e processada como uma sequência, de modo que colchetes podem ser usados igualmente, modificando os dois caracteres no código.
Experimente online!
fonte
Oitava, 29 bytes
Mapeia
[
para 1 e]
para -1 e, em seguida, obtém o máximo da soma acumulada.Entrada é uma sequência do formulário
Amostra executada em ideone .
fonte
{
,}
? O Octave equivalente às matrizes no OP são matrizes de células, eu achoJulia,
5526 bytesEsta é uma função recursiva que aceita uma matriz unidimensional com conteúdo do tipo
Any
e retorna um número inteiro. Ao passar um array para a função, prefixe todos os colchetes comAny
, ief(Any[1,Any[2,3]])
.A abordagem é bastante simples. Para uma entrada a , multiplicamos a por 0 e verificamos se o resultado é o escalar 0. Caso contrário, sabemos que a é uma matriz, portanto aplicamos a função a cada elemento de a , aproveite o máximo e adicione 1.
Economizou 29 bytes graças a Dennis!
fonte
Ruby, 53 bytes
Entrada de STDIN, saída para STDOUT.
fonte
Geléia,
107 bytesExperimente online! ou verifique todos os casos de teste .
Como funciona
Atualizar
Ao escrever esta resposta, notei que Jelly se comporta de maneira estranha para listas irregulares, porque calculei a profundidade de uma lista como o mínimo incrementado de profundidade de seus itens.
Isso foi resolvido na versão mais recente; portanto, o código a seguir ( 6 bytes ) funcionaria agora.
Isso soma as linhas da matriz em vez de concatená-las.
fonte
ŒḊ
é mais novo que o desafio?Mathematica, 18 bytes
fonte
Mathematica,
2720 bytesFunção recursiva simples.
fonte
If
, economizando 7 bytes. (Deixe-me saber se você quer uma dica.)Replace
solução baseada em A é pelo menos enquanto essa ...Map
pingue sobre um inteiro é um não-op:Max[#0/@#]+1&[0#]-1&
. O-1
também pode ir para dentro da chamada interna como...&[0#-1]&
.PHP, 61 bytes
função recursiva que se usa como uma função de mapeamento para substituir cada elemento por sua profundidade.
fonte
PHP,
8472646360 bytesNota: requer PHP 7 para o operador de comparação combinada. Também usa a codificação IBM-850
Execute assim:
[
e]
$i
para um int. Os deslocamentos de sequência são convertidos para um int implicitamentefonte
C,
9869 bytes29 bytes de desconto, graças @DigitalTrauma !!
Pega uma string como entrada e retorna o resultado como inteiro.
Exemplo ao vivo em: http://ideone.com/IC23Bc
fonte
Python 3,
4239 bytes-3 bytes graças ao Sp3000
Esta é essencialmente uma porta da solução Python 2 do xnor :
Infelizmente,
[] > {}
retorna umunorderable types
erro, de modo que um truque específico do xnor não pode ser usado. Em seu lugar,-0123456789
são mais baixos no valor ASCII queA
, que é menor que[]
, portanto, a comparação de cadeias funciona.fonte
CJam (15 bytes)
Demonstração online
Dissecação
Pelo mesmo comprimento, mas um pouco mais em território feio,
fonte
s/ugly/beautiful/
'[,-
para remover a corda[]
, o que depende do conteúdo ser limitado. A abordagem que nivela funciona independentemente do conteúdo da matriz.Sed, 40 caracteres
(Código de 39 caracteres + opção de linha de comando de 1 caractere.)
Entrada: sequência, saída: número unário.
Exemplo de execução:
Sed, 33 caracteres
(Código de 32 caracteres + opção de linha de comando de 1 caractere.)
Se espaços à direita forem permitidos na saída.
Entrada: sequência, saída: número unário.
Exemplo de execução:
fonte
Hexagonia , 61 bytes
Edit : Obrigado @Martin Ender ♦ por me salvar 1 byte do maravilhoso truque -1!
Experimente online para verificar os casos de teste!
As imagens abaixo não são modificadas, mas o fluxo é basicamente o mesmo. Observe também que isso retornará
-1
se a entrada não for uma matriz (ou seja, sem[]
).Tenho muitas no-ops dentro do Hexagon ... acho que definitivamente pode ser mais jogado.
Explicação
Em resumo, ele adiciona
-1
quando encontra um[
e adiciona1
quando encontra um]
. Finalmente, imprime o máximo que conseguiu.Vamos executar o Caso de Teste 5 para ver seu comportamento ao executar a String
[1, [[3]], [5, 6], [[[[8]]]], 1]
:Começa no início e leva sua entrada no canto W:
Como ainda existe entrada (não o caractere nulo
\0
ou EOL), ela é colocada no topo e inicia o caminho carmesim.Aqui está o que acontece quando de lá até fofo
><
:,
lê[
em Buffer{
eZ
define a constante Z como 90.'
move-se para Dif e-
calcula a diferença. Para[
e]
a diferença será1
e3
respectivamente. Para números, espaços e vírgulas, será negativo.Em seguida, corremos
(
duas vezes (uma vez no final do caminho carmesim, um no início após o empacotamento no caminho verde) para obter-1
e1
resp[
e e]
. Aqui, alteramos o nome deDiff
paraValue
. Adicione este valor à profundidade. (Eu costumavaZ&
garantir que ele copiasse o vizinho certo). Então calculamoslastMin - Depth
e obtivemos um número na borda da memóriaminLR
.Em seguida, aplicamos
&
(no final do caminho verde) aminLR
: Se o número for <= 0, ele copia o valor esquerdo (ou seja,lastMin - Depth <= 0 => lastMin <= Depth
), caso contrário, recebe o valor correto.Nós envolvemos o caminho azul horizontal e vemos
Z&
novamente o que copia o arquivominLR
. Então nós"&
e fizemos uma cópia do min calculado. Os colchetes são assumidos como balanceados, portanto, o mínimo deve ser <= 0. Após o empacotamento, o caminho azul vai para a esquerda e pressiona(
, tornando a cópia1
menor que o mínimo real. Reutilizando-
, criamos mais uma cópia única como um vizinho do Buffer:Nota:
copy
é renomeado como1-off
Quando o caminho azul atinge
\
e tem uma boa"
e<
pega de volta para o loop principal.Quando o loop atinge
1
,,
ouou outros números como entrada:
O Diff ficará negativo e será refletido de volta ao loop principal para a próxima entrada.
Quando tudo passa pelo loop principal, chegamos ao EOL, que faz o Buffer,
-1
e finalmente chega ao limite inferior:'
move o MP para1-off copy
e o)
incrementa, e com~
negação, obtém o valor correto de Profundidade máxima, impresso com!
E a história termina com um
@
.Acho que devo ter complicado um pouco as coisas. Se eu tivesse que apenas "retroceder" e "imprimir" sem aumentar e negar, teria economizado 2 bytes sem usar o Hexagon completo.
Muito obrigado a Timwi por Esoteric IDE e Hexagony Colorer !
fonte
-1
de,
alterando a última linha para:@!-".
(embora eu concorde que provavelmente seja possível economizar muito mais ou até encaixar isso no comprimento lateral 4 com alguma reestruturação).Z
do usoZ&
. E deve haver maneiras melhores de iniciar o programa com o implícito if.brainfuck, 48 bytes
Formatado:
Pega entrada formatada como
(1, ((3)), (5, 6), ((((8)))), 1)
e gera um valor de byte .Experimente online.
Isso armazena a profundidade por localização da memória, movendo o ponteiro para a direita
(
e para a esquerda)
e ignorando outros caracteres. As células visitadas são marcadas com um1
sinalizador, portanto, no final do loop principal, haverádepth + 1
sinalizadores à direita da célula atual. Estes são adicionados para imprimir o resultado final.Uma solução anterior de 69 bytes usando uma abordagem diferente:
Nesta versão, a profundidade e a profundidade máxima são armazenadas explicitamente nas células.
fonte
Pitão,
1513 bytes-2 bytes por @Maltysen
Conta a diferença entre as contagens cumulativas de
[
e]
, e leva o máximo.Y
é a matriz vazia e sua representação de string (`
) é convenientemente[]
.Experimente aqui .
fonte
CJam, 19
22 23bytesIdéia semelhante à minha resposta MATL.
Agradecimentos a Peter Taylor por remover 3 bytes
Experimente aqui
fonte
Perl 5, 34 bytes
32, mais dois para
-p
Roubado do Trauma Digital 's resposta Retina ... o que é 26% menor do que isso.
:-)
Ou, igualmente:
fonte
]
não precisa escapar, exceto entre colchetes.s&...&...&g
é o operador de substituição. Veja perldoc.perl.org/perlop.htmlRuby, 51 caracteres
(Começou como sugestão de melhoria para a resposta Ruby da maçaneta da porta , mas terminou de forma diferente. Então, eu a publiquei como resposta separada. Voto a favor da idéia de contagem de profundidade ( , descendente de
?\\<=>$&
'] ['.index(c)
) devem ir para a resposta original.)Entrada: string, saída: número.
Exemplo de execução:
fonte
Perl 6, 53 bytes
O encerramento:
Precisa de um argumento, por exemplo:
Explicação:
fonte
Minkolang 0,15 ,
312924 bytesRevisou meu algoritmo inspirado na resposta CJam de Luis Mendo e salvou 5 bytes!
Experimente aqui!
Explicação
Essencialmente, o que esse código faz é manter um total contínuo com +1 para cada um
[
e -1 para cada]
, mantendo o controle do valor máximo atingido, produzindo esse valor máximo no final. O loop é tratado pela natureza toroidal do codebox de Minkolang.fonte
Ruby, 41 caracteres
Parâmetro: matriz, retorno: número.
Exemplo de execução:
fonte
Oracle SQL 11.2, 133 bytes
Sem golfe
O CONNECT BY cria uma linha por caractere na cadeia de entrada.
O SUBSTR isola o caractere correspondente ao número da linha.
O DECODE traduz cada '[' para 1, cada ']' para -1 e todos os outros caracteres para 0.
O SUM analítico soma cada 1, -1 e 0 das linhas anteriores, incluindo a linha atual;
A soma MAX é a profundidade.
fonte
Java 8, 95
Esta é uma expressão lambda para a
ToIntFunction<String>
. A entrada é tomada como aString
no formato de exemplos do OP.bastante direto. Divida a sequência usando
[
como delimitador. Para cada um deles, aumente o contadore
e compare-o com o contadord
, mantendo o maior dentrod
. Em seguida, divida a sequência da iteração atual usando]
como delimitador dessa vez e subtraia o número de divisões extrase
.fonte