Sequências de cruzamento


11

Sequências de cruzamento

Dada uma lista de números inteiros positivos A, chame-a de uma sequência crescente se cada elemento for maior ou igual ao anterior; e chame-a de sequência decrescente se cada elemento for menor ou igual ao anterior.

Algumas sequências crescentes:

[1,2,4,7]
[3,4,4,5]
[2,2,2]
[]

Algumas sequências decrescentes:

[7,4,2,1]
[5,4,4,3]
[2,2,2]
[]

Uma sequência de cruzamento é uma lista que pode ser decomposta em duas subsequências separadas, uma sequência crescente e outra sequência decrescente.

Por exemplo, a lista:

[3,5,2,4,1]

é uma sequência de cruzamento, pois pode ser decomposta em:

[3,    4  ]
[  5,2,  1]

onde [3,4]é a subsequência crescente e [5,2,1]é a subsequência decrescente. Vamos chamar esse par de subsequências (crescentes, decrescentes) de decomposição da sequência de cruzamento.

A lista:

[4,5,2,1,3]

não é uma sequência de cruzamento; não há como decompor em uma subsequência crescente e decrescente.

Sua tarefa é escrever um programa / função, tendo como entrada uma lista de números inteiros positivos; e se for uma sequência cruzada, retorne as duas listas em uma de suas decomposições; ou algum valor consistente de "falsey" se a lista não for uma sequência de cruzamentos.

Isso é ; o programa / função mais curto em cada idioma é o vencedor.

Regras:

  • A entrada é flexível.
  • As brechas usuais são proibidas.
  • Se houver várias maneiras válidas de decompor a entrada, você poderá gerar uma ou todas elas.
  • A formatação de saída para a decomposição é flexível; mas deve ser inequívoco em relação à distinção entre as duas subsequências.
  • Você pode usar qualquer valor de saída consistente para indicar que a entrada não é uma sequência de cruzamento; desde que não seja ambíguo em comparação com a saída de qualquer sequência de cruzamento. Você deve especificar o valor de falsey na sua resposta.

Casos de teste:

Usando Falsepara indicar seqüências sem cruzamento:

[3, 5, 2, 4, 1] => [3, 4], [5, 2, 1]
[3, 5, 2, 4, 4, 1, 1] => [3, 4, 4], [5, 2, 1, 1]

[7, 9, 8, 8, 6, 11] => [7, 8, 8, 11], [9, 6]
[7, 9, 8, 8, 6, 11] => [7, 9, 11], [8, 8, 6] # also valid
[7, 9, 8, 8, 6, 11] => [7, 8, 11], [9, 8, 6] # also valid

[7, 8, 9, 10, 20, 30] => [7, 8, 9, 20, 30], [10]
[7, 8, 9, 10, 20, 30] => [8, 9, 10, 20, 30], [7] # this is also valid

[5, 5, 5] => [5, 5, 5], []

[4, 5, 2, 1, 3] => False
[3, 4, 3, 4, 5, 2, 4] => False

2
Possível duplicado . Apenas duas diferenças que vejo é que o outro desafio deve ser executado em tempo polinomial no comprimento da entrada e permite um valor verdadeiro em vez das duas subsequências (retornar as subsequências em si receberá um bônus de 20%). Ainda me parece uma bobagem, mas não vou martelar.
Kevin Cruijssen 13/08/19

A restrição de tempo do @KevinCruijssen provavelmente é suficiente por si só para não tornar isso um engodo.
Nick Kennedy

11
@NickKennedy Possivelmente, é por isso que me abstive de martelá-lo. :)
Kevin Cruijssen 13/08/19

2
Caso de teste sugerido: [3, 5, 2, 4, 4, 1, 1]. Os casos de teste atuais permitem que você se dê bem com >=/ <, quando realmente deveria ser >=/ <=.
Grimmy

11
@ Arnauld: Sim, pode ser qualquer valor ("falsey" é apenas para dizer: é falso que a entrada seja uma sequência de cruzamento).
Chas Brown

Respostas:


1

05AB1E , 15 14 13 bytes

2.Œ.ΔćRšεü@}W

Experimente online ou valide todos os casos de teste .

Explicação:

2.Œ                    # all partitions of the input in 2 subsequences
   .Δ                  # find the first partition such that the following gives 1
     ćRš               # reverse the first subsequence
        ε  }           # map each subsequence to
         ü@            # pairwise greater-than
            W          # minimum (1 if all 1s, 0 otherwise)


1

JavaScript (ES6),  110 105  104 bytes

[[decreasing], [increasing]]1 1

f=(a,n,b=[[],[]])=>a.some((v,i)=>[...x=b[i=n>>i&1]].pop()*(x.push(v),i-=!i)>v*i)?n>>a.length||f(a,-~n):b

Experimente online!

Como?

n0 02eueu

b[0 0]b[1 1]Eun

1 1Eu=1 1-1 1Eu=0 0

[...x = b[i = n >> i & 1]].pop() * (x.push(v), i -= !i) > v * i

bsome()


1

Haskell, 84 bytes

(([],[])#)
(d,i)#(a:b)=(#b)=<<[(d++[a],i)|all(a<=)d]++[(d,i++[a])|all(a>=)i]
p#_=[p]

Retorna uma lista de todos os (decreasing,increasing)pares válidos ou a lista vazia, se não houver esse par.

Experimente online!


1

Python 3 , 109 107 bytes

def f(l,i=[],d=[]):
 if l:s,*r=l;i and s<i[-1]or f(r,i+[s],d);d and s>d[-1]or f(r,i,d+[s])
 else:print(i,d)

Experimente online!

A função imprime todas as decomposições possíveis na saída padrão. Se não houver decomposições possíveis, nada será impresso.

Obrigado a @Sriotchilism O'Zaic pelas sugestões de melhoria.


Bem vindo ao site. Eu sugiro que você faça s<i[-1]um i[-1]>s e não semelhante d[-1]<s , ambos salve um byte.
Ad Hoc Garf Hunter

Obrigado pela sugestão. Eu atualizei a resposta. Existe algum modelo de cópia colável aqui para publicar respostas?
Joel

Eu não tenho certeza do que você quer dizer? O TIO possui um modelo que você parece já estar usando.
Ad Hoc Garf Hunter

Eu apenas gerei um link no TIO e adicionei o link à minha postagem. Eu não usei nenhum modelo lá. Cadê?
Joel

11
@ Joel - No topo da página do TIO, há um ícone que se parece com alguns elos da cadeia. Clique nele e, em seguida, você obtém uma página de opções. Um deles é o 'Code Golf Submission'. Isso colocará em seu buffer de cópia o conteúdo formatado que você deseja! Bem-vindo também, e boa solução!
Chas Brown


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.