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=11i=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.