Sequenze incrociate


11

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 è ; 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 Falseper 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

2
Possibile duplicato . Solo due differenze che vedo è che l'altra sfida dovrebbe essere lanciata in un tempo polinomiale nella lunghezza dell'input, e consente un valore veritiero invece delle due sottosequenze (la restituzione delle sottosequenze stesse riceverà comunque un bonus del 20%). Mi sembra ancora un imbecille, ma non lo martello.
— Kevin Cruijssen,

La limitazione temporale di @KevinCruijssen è probabilmente sufficiente da sola per non renderla un inganno.
— Nick Kennedy,

1
@NickKennedy Forse sì, motivo per cui mi sono trattenuto dal martellare. :)
— Kevin Cruijssen,

2
Banco di prova consigliato: [3, 5, 2, 4, 4, 1, 1]. Gli attuali casi di test ti consentono di cavartela con >=/ <, quando dovrebbe essere >=/ <=.
— Grimmy,

1
@Arnauld: Sì, può essere qualsiasi valore ("falsey" è solo per dire: è falso che l'input è una sequenza incrociata).
— Chas Brown,

Risposte:


1

05AB1E , 15 14 13 byte

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

Provalo online o convalida tutti i casi di test .

Spiegazione:

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 byte

[[decreasing], [increasing]]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

Provalo online!

Come?

n02LL

b[0]b[1]in

1i=1−1i=0

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

bsome()


1

Haskell, 84 byte

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

Restituisce un elenco di tutte le (decreasing,increasing)coppie valide o l'elenco vuoto se non esiste tale coppia.

Provalo online!


1

Python 3 , 109 107 byte

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)

Provalo online!

La funzione stampa tutte le possibili decomposizioni sull'output standard. Se non ci sono possibili decomposizioni, non viene stampato nulla.

Grazie a @Sriotchilism O'Zaic per suggerimenti di miglioramento.


Benvenuti nel sito. Suggerisco di fare s<i[-1]piuttosto che i[-1]>s e simili con d[-1]<s entrambi, salvare un byte.
— Ad Hoc Garf Hunter il

Grazie per il suggerimento Ho aggiornato la risposta. Esiste un modello copia-pastable qui per pubblicare le risposte?
— Gioele il

Non sono sicuro di cosa intendi? TIO ha un modello che sembra stia già utilizzando.
— Ad Hoc Garf Hunter il

Ho generato solo un link su TIO e aggiunto il link al mio post. Non ho usato alcun modello lì. Dov'è?
— Gioele il

1
@Joel - Nella parte superiore della pagina TIO c'è un'icona che assomiglia ad alcuni collegamenti a catena. Fai clic su di esso e otterrai una pagina di opzioni. Uno di questi è "Invio golf code". Ciò inserirà nel tuo buffer di copia le cose formattate che desideri! Benvenuto anche, e bella soluzione!
— Chas Brown,


0

Python 2 , 147 byte

def f(a):
 for i in range(2**len(a)):
	x=[];y=[]
	for c in a:[x,y][i&1]+=[c];i/=2
	if x==sorted(x)and y[::-1]==sorted(y[::-1]):return x,y
 return 0

Provalo online!

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.