Descrição do Desafio
Uma subsequência monotônica é uma sequência de números [a1, a2, ..., an]
tal que
a1 <= a2 <= ... <= an
ou a1 >= a2 >= ... >= an
. [1, 3, 3, 7, 9, 13, 13, 100]
é uma subsequência monotônica (não decrescente), bem como [9, 4, 4, 3, 0, -10, -12]
(esta não é crescente), mas [1, 3, 6, 9, 8]
não é. Dada uma lista de números inteiros (em qualquer formato razoável), imprima o menor número, de N
modo que a sequência desses números inteiros possa ser dividida em N
sequências monotônicas.
Exemplos
[1, 3, 7, 5, 4, 2] -> [[1, 3, 7], [5, 4, 2]] -> 2
[1, 2, 3, 4, 5, 6] -> [1, 2, 3, 4, 5, 6] -> 1
[3, 1, 5, 5, 6] -> [[3, 1], [5, 5, 6]] -> 2
[4, 6, 8, 9, 1, 6] -> [[4, 6, 8, 9], [1, 6]] -> 2
[3, 3, 3, 3] -> [[3, 3, 3, 3]] -> 1
[7] -> [[7]] -> 1
[] -> [] -> anything (you don't actually have to handle an empty list case)
[1, 3, 2, -1, 6, 9, 10, 2, 1, -12] -> [[1, 3], [2, -1], [6, 9, 10], [2, 1, -12]] -> 4
[4,4,8,8,1,4,5] -> 2
0 / undefined
que parece que deve ser 0 ou a representação deundefined
nossa língua, mas, a partir do seu comentário na resposta de Jonathan Allan Jelly, parece queundefined
significaanything
... Qual é essa? ? No segundo caso, eu sugeriria escrever emanything
vez deundefined
Respostas:
Braquilog , 12 bytes
Experimente online!
Isso retorna
false.
para a lista vazia[]
.Explicação
Isso retornará o menor porque
~c
gerará pontos de escolha do menor número de sublistas para o maior.fonte
Z
porqueZ
é um nome de variável; então estamos dizendo "chame esse programa com a saída como uma variável". Você pode mudarZ
para qualquer outra letra maiúscula ; é apenas um nome de variável. A razão pela qual esse argumento existe é permitir a possibilidade de realmente definir a saída para algo, em vez de uma variável.4
nesse exemplo, ele informará se isso está correto ou não ) #3
porque não encontrará nenhuma lista de sublistas onde todas são monotônicas e de comprimento3
. Leva apenas um longo tempo, porque tentará todas as listas possíveis de sublistas, mesmo aquelas com mais de três elementos, porque o comprimento é verificado depois de encontrar a lista. Pois5
diztrue
porque de fato há pelo menos uma lista de comprimento5
com sublistas monotônicas que funciona. Portanto, este programa retorna o menor comprimento quando a saída é uma variável e se existe alguma lista desse comprimento que funcione se a saída for um número inteiro.Perl, 65 bytes
62 bytes de código + 3 bytes para
-n
sinalizador.monot_seq.pl:
Forneça a entrada sem nova linha final, com os números separados por espaços:
-5 bytes graças a @Gabriel Benamy.
fonte
($&<=>$1)*($1<=>$2)||$1==$2
em($&<=>$1)*($1<=>$2)>=0
Mathematica, 111 bytes
Função nomeada
f
que obtém uma lista não vazia de números (números inteiros ou mesmo reais). Funciona de frente para trás, descartando o primeiro elemento repetidamente e acompanhando quantas subseqüências são necessárias. Mais detalhado:fonte
d=#2-#&@@#&;
Além disso, definir umf
oug
como operador unário±
provavelmente salvará alguns bytes.Geléia , 19 bytes
TryItOnline! ou executar todos os testes (a lista vazia resulta em
1
)Quão?
No entanto, não estou convencido de que este seja o método mais adequado para minimizar a contagem de bytes.
fonte
1
(o que realmente acho que faz mais sentido do que0
).undefined
significa - o resultado é irrelevante.Perl,
98979679 bytesA entrada é fornecida como uma lista de números, separados por espaços, fornecidos em tempo de execução, por exemplo
(o 4 é a saída)
Legível:
O 'operador de nave espacial'
<=>
retorna -1 se LHS <RHS, 0 se LHS = RHS e +1 se LHS> RHS. Ao comparar três elementos sequenciais$a,$b,$c
para determinar se são monotônicos, é necessário apenas determinar que esse não é exatamente um de$a<=>$b
,$b<=>$c
é 1 e o outro é -1 - o que só acontece quando o produto é -1. Se um$a==$b
ou$b==$c
, então, a sequência é monotônica e o produto é 0. Se$a < $b < $c
, então ambos resultam em -1 e -1 * -1 = 1. Se$a > $b > $c
, então ambos resultam em 1 e 1 * 1 = 1. Nos dois casos, a sequência é monotônica e queremos continuar.Se o produto for menor que 0, sabemos que a sequência não é monotônica, descartamos os valores
$a,$b
que estamos mantendo no momento e aumentamos nosso contador de subsequências. Caso contrário, avançamos um número.Não retorna nada se a entrada estiver vazia; caso contrário, retorna o menor número de subsequências monotônicas contíguas
fonte
1
eif
(ou talvez precise de perls antigos, mas nos mais recentes não precisa ). Além disso, você pode (provavelmente) substituirshift
porpop
. No entanto, existem alguns casos de teste nos quais seu código não funciona:6 3 6 3
(você imprime 3 em vez de 2),4 3 2 1
(você imprime 2 em vez de 1). Usandopop
vez deshift
resolver aqueles, mas criar novas (1 2 3 4
imprime 3 em vez de 1) ...C # 6,
297209 bytesUngolfed com explicações
fonte
JavaScript (ES6), 69 bytes
Recebe entrada como vários parâmetros. Funciona comparando recursivamente os três primeiros elementos para verificar se são monotônicos; nesse caso, remove o elemento do meio, pois é inútil; caso contrário, remove os dois primeiros elementos e inicia uma nova sequência.
fonte
Clojure, 97 bytes
reduce
controla a subsequência atual e calcula quantas vezes<=
e as>=
condições falham. Last1
pega o segundo elemento do resultado (sendo o contadori
).fonte