Sequenze di attraversamento
Dato un elenco di numeri interi positivi A
, chiamalo una sequenza crescente se ogni elemento è maggiore o uguale a quello precedente; e chiamalo una sequenza decrescente se ogni elemento è minore o uguale a quello precedente.
Alcune sequenze crescenti:
[1,2,4,7]
[3,4,4,5]
[2,2,2]
[]
Alcune sequenze decrescenti:
[7,4,2,1]
[5,4,4,3]
[2,2,2]
[]
Una sequenza di attraversamento è un elenco che può essere scomposto in due sottosequenze disgiunte, una in sequenza crescente e l'altra in sequenza decrescente.
Ad esempio, l'elenco:
[3,5,2,4,1]
è una sequenza incrociata, poiché può essere scomposta in:
[3, 4 ]
[ 5,2, 1]
dov'è [3,4]
la sottosequenza crescente ed [5,2,1]
è la sottosequenza decrescente. Chiameremo una tale coppia di sottosequenze (crescente, decrescente) una decomposizione della sequenza di attraversamento.
La lista:
[4,5,2,1,3]
non è una sequenza di attraversamento; non c'è modo di scomporlo in una sottosequenza crescente e decrescente.
Il tuo compito è scrivere un programma / funzione prendendo come input un elenco di numeri interi positivi; e se si tratta di una sequenza incrociata, restituisce le due liste in una delle sue scomposizioni; o un valore "falsey" coerente se l'elenco non è una sequenza incrociata.
Questo è code-golf ; il programma / funzione più breve in ciascuna lingua è il vincitore.
Regole:
- L'input è flessibile.
- Le solite scappatoie sono vietate.
- Se esistono diversi modi validi per decomporre l'input, è possibile emetterne uno o tutti.
- La formattazione dell'output per la decomposizione è flessibile; ma deve essere inequivocabile la distinzione tra le due sottosequenze.
- È possibile utilizzare qualsiasi valore di output coerente per indicare che l'input non è una sequenza di attraversamento; purché sia inequivocabile rispetto all'output per qualsiasi sequenza di attraversamento. È necessario specificare il valore di falso nella risposta.
Casi test:
Utilizzo False
per indicare sequenze non incrociate:
[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
[3, 5, 2, 4, 4, 1, 1]
. Gli attuali casi di test ti consentono di cavartela con >=
/ <
, quando dovrebbe essere >=
/ <=
.