Você deve escrever um programa ou função que receba uma lista de números inteiros distintos como entrada e saída ou retorne o número de ocorrências dos números de entrada na seguinte pirâmide de número invertida.
A partir da lista original em cada etapa, criamos uma nova com os valores máximos de cada par de números adjacentes (por exemplo, 5 1 2 6
torna-se 5 2 6
). Paramos quando há apenas um número na lista.
A pirâmide completa para 5 1 2 6
é
5 1 2 6
5 2 6
5 6
6
O número resultante de ocorrências é 3 1 2 4
(para 5 1 2 6
respectivamente).
Entrada
- Uma lista de um ou mais números inteiros sem repetição. (por exemplo,
1 5 1 6
é inválido.)
Resultado
- Uma lista de números inteiros positivos. O
i
elemento th da lista é o número de ocorrências doi
número th de entrada na pirâmide.
Exemplos
Entrada => Saída
-5 => 1
8 4 => 2 1
5 9 7 => 1 4 1
1 2 3 9 8 6 7 => 1 2 3 16 3 1 2
6 4 2 1 3 5 => 6 4 2 1 3 5
5 2 9 1 6 0 => 2 1 12 1 4 1
120 5 -60 9 12 1 3 0 1200 => 8 2 1 3 16 1 4 1 9
68 61 92 58 19 84 75 71 46 69 25 56 78 10 89 => 2 1 39 2 1 27 6 5 1 6 1 2 14 1 12
Isso é código-golfe, portanto a entrada mais curta vence.
Quebra-cabeça bônus: você pode resolver o problema a O(n*log n)
tempo?
Respostas:
Pitão,
1917 bytesConfira a demonstração on - line ou o conjunto de testes completo (os primeiros 4 bytes repetem os exemplos).
Este é um pouco mais inteligente que a abordagem ingênua. Cada número do triângulo pode ser representado como o valor máximo de um subconjunto conectado de
Q
. Na primeira linha, ele usa os subconjuntos de comprimento 1, a segunda linha do triângulo usa os subconjuntos de comprimento 2, ...Explicação
Para visualizar isso um pouco.
m.:QhdUQ
e a entrada[5, 1, 2, 6]
me fornece todos os subconjuntos possíveis:E
mmeSk.:QhdUQ
me dá cada um dos seus máximos (que corresponde exatamente às linhas da pirâmide):Pitão,
2322 bytesEssa é apenas a abordagem simples "faça o que você mandou".
Confira a demonstração on - line ou um conjunto de testes completo (os primeiros 4 bytes repetem os exemplos).
Explicação
meSd.:G2
mapeia cada par de[(G[0], G[1]), (G[1], G[2]), ...]
para o elemento máximo.Y
é uma lista vazia, portanto,aYG
anexaG
aoY
.u...QQ
aplica repetidamente essas duas funções (len(Q)
horas) iniciandoG = Q
e atualizandoG
após cada execução.m/sYdQ
mapeia cada elemento da lista de entrada para sua contagem naY
lista nivelada .fonte
Python, 81
Uma solução de dividir e conquistar. O elemento máximo
M
escoa até a pirâmide, dividindo-o em um retângulo deM
's e duas sub-pirâmides.Portanto, o resultado geral é a saída da sublist esquerda, seguida pela área do retângulo, seguida pela saída da sublist direita.
A variável de entrada
L
é reutilizada para armazenar o resultado, para que a lista vazia seja mapeada para a lista vazia.As construções na solução são variadas em Python. Talvez alguma linguagem com correspondência de padrões possa implementar o seguinte pseudocódigo?
fonte
f@{}=##&@@{};f@{a___,l_,b___}/;l>a~Max~b:={f@{a},Length@{a,0}Length@{b,0},f@{b}}
CJam,
2322 bytesAinda à procura de opções de golfe.
Esta é uma função CJam (mais ou menos). Isso espera os números de entrada na pilha e retorna as contagens de saída correspondentes na pilha também. Um exemplo:
folhas
na pilha.
Certeza de que isso não está dentro
O(n log n)
hora.Expansão do código :
Vamos dar uma olhada em como funciona, elaborando um exemplo de
5 1 2 6
Na segunda linha,
5 1 2 6
torna-se5 2 6
porque5, 2 and 6
são os máximos[5 1], [1 2] and [2 6]
respectivamente. Na terceira linha, torna-se5 6
porque5 and 6
são máximos,[5 2] and [2 6]
respectivamente. Isso também pode ser escrito no máximo,[5 1 2] and [1 2 6]
respectivamente. Da mesma forma, para a última linha,6
é o máximo de[5 1 2 6]
.Então, basicamente criamos as fatias de comprimento adequadas, começando pela fatia de comprimento
1
, que é basicamente os números originais, cada um envolvido em uma matriz, para finalmente uma fatia de comprimentoN
para a última linha, ondeN
é o número de números inteiros de entrada.Experimente online aqui
fonte
Mathematica, 72 bytes
fonte
Python, 81
Cada entrada da pirâmide é o máximo da sub-lista no topo de seu cone para cima. Então, geramos todas essas sublistas, indexadas por intervalos
[i,j]
com0 < i < j <= len(L)
, e contamos quantas vezes cada elemento aparece no máximo.Uma maneira mais curta de enumerar os subintervalos provavelmente salvaria caracteres. Uma parametrização de um único índice dos pares
[i,j]
seria uma abordagem plausível.fonte
Pip , 56 + 1 = 57 bytes
Receio que não esteja competindo muito com o vodu CJam. Parece que preciso de um algoritmo melhor. Execute com o
-s
sinalizador para obter saída delimitada por espaço.Ungolfed, com comentários:
A redefinição de
r
cada vez funciona da seguinte maneira:fonte
APL (24)
Esta é uma função que leva uma lista, assim;
Explicação:
{
...}⍵
: aplique a seguinte função a ⍵:⍵≡⍬:⍵
: se ⍵ estiver vazio, retorne ⍵2⌈/⍵
: gerar a próxima lista⍵,∇
: return ⍵, seguido pelo resultado da aplicação desta função na próxima lista⍵∘.=
: compare cada elemento em ⍵ com cada elemento no resultado da função+/
: soma as linhas (representando elementos em ⍵)fonte
Haskell, 78 bytes
Uso:
f [68,61,92,58,19,84,75,71,46,69,25,56,78,10,89]
->[2,1,39,2,1,27,6,5,1,6,1,2,14,1,12]
.Como funciona
fonte
JavaScript, 109 bytes
Acho que encontrei uma maneira interessante de fazer isso, mas somente depois que terminei percebi que o código era muito longo para competir. Bem, publicando isso de qualquer maneira, caso alguém veja mais potencial de golfe.
Estou usando a seguinte fórmula aqui:
Dessa forma, não é necessário gerar a pirâmide inteira ou seus subconjuntos. (Foi por isso que inicialmente pensei que seria executado em O (n), mas, por sorte, ainda precisamos de loops internos.)
fonte
MATLAB: (266 b)
ENTRADA
um vetor deve estar no formato [abcd ...]
exemplo:
[2 4 7 11 3]
RESULTADO
ocorrências padrão.
EXPLICAÇÃO:
se [abcd] for uma entrada, o programa calcula o resultado ghij como
g = (a> b) + (a> b) (a> c) + (a> b) (a> c) * (a> d) = (a> b) (1+ (a> c)) ( 1+ (a> c))))
h = (b> a) + (b> c) + (b> a) (b> c) + (b> c) (b> d) + (b> a) (b> c) (b> d ) = ... 'simplificado'
i = (c> b) + (c> d) + (c> b) (c> d) + (c> b) (c> a) + (c> d) (c> b) (c> a ) = ..
j = (d> c) + (d> c) (d> b) + (d> c) (d> b) * (d> a) = ...
fonte
J (49)
Suponho que há espaço para melhorias ...
fonte