Estendi al massimo gli intervalli di numeri interi


14

Supponiamo che ti venga fornito un insieme di intervalli non intersecanti di numeri interi [a1,b1],[a2,b2],[a3,b3],...,[aN,bN]. (Dov'è [a,b]l'insieme di numeri interi maggiori o uguali a ae minori di o uguali a b.)

L'intervallo all'indice Xcopre i bX - aX + 1valori. Chiameremo questo numero cX.

Dato che ogni intervallo può essere ...

  • invariato (rimane come [aX,bX]),
  • esteso a destra verso il +lato del numero della linea cX(diventando [aX,bX + cX]),
  • o esteso a sinistra verso il -lato del numero della linea cX(diventando [aX - cX,bX]),

qual è il numero massimo di valori che possono essere coperti dall'unione di tutti gli intervalli aggiornati, dato che sono ancora tutti non intersecanti?

Scrivi una funzione o un programma che accetta una stringa del modulo [a1,b1],[a2,b2],[a3,b3],...,[aN,bN]e calcola questo massimo. Se si scrive una funzione, restituire il valore. Se si scrive un programma completo, utilizzare stdin per l'input e stampare il valore su stdout (o utilizzare le alternative più vicine).

Si può presumere che tutti i valori rientrino nei normali limiti di numero intero a 32 bit con segno e che aXsia inferiore o uguale a bXper tutti gli indici X. Gli intervalli possono essere in qualsiasi ordine, non sono necessariamente sempre in aumento. Devono essere indicati come una stringa nel formato sopra. La stringa può essere vuota, nel qual caso la risposta sarà 0.

Vince l' invio più breve in byte .

Esempio

Se l'ingresso fosse [-3,0],[1,2],[4,9]l'output sarebbe 22. L'intervallo intermedio non ha spazio per espandersi in entrambi i modi, quindi deve rimanere invariato. Gli intervalli sinistro e destro possono essere entrambi estesi a [-7,0]e [4,15]rispettivamente. L'unione di [-7,0]e [1,2]e [4,15]contiene tutti i valori da -7 a 15, ad eccezione di 3. Questo è di 22 valori.


3
Possiamo usare la rappresentazione della stringa nativa delle matrici del nostro linguaggio per l'input o deve essere esattamente in questo formato?
Martin Ender,

@ MartinBüttner No. È necessario utilizzare questo formato esatto. (So ​​che è una specie di spada a doppio taglio, ma è così che va.)
Calvin's Hobbies

Puoi espandere un determinato intervallo su entrambi i lati? Ad esempio, può [5,6]diventare [3,8](per una risposta di 6) o può essere solo [5,8]o [3,6](per una risposta di 4)?
MtnViewMark

@MtnViewMark No. Possono essere estesi solo da un lato (o per niente)
Calvin's Hobbies

Risposte:


4

Haskell, 145 byte

import Data.List
x=maximum.map length.filter(nub>>=(==)).map concat.sequence.map(\[a,b]->[[2*a-b-1..b],[a..b],[a..2*b-a+1]]).read.('[':).(++"]")

Esecuzioni campione:

λ: x ""
0

λ: x "[5,6]"
4

λ: x "[-3,0],[1,2],[4,9]"
22

1

R, 282 278 269 247

Questo è diventato molto veloce occupandosi dell'input della stringa. Ho il sospetto di poter giocare a golf meglio, ma al momento sono a corto di tempo.

f=function(s){i=matrix(strtoi(strsplit(gsub('[^0-9,-]','',s),',')[[1]]),nrow=2);l=0;if((a<-length(b<-order(i[1,])))>0){if(a>1)i=i[,b];l=diff(i[,1:a])+1;x=c(t(i));for(n in 1:a)if(n==1|n==a|x[n]-l[n]>x[n+a-1]|x[n+a]+l[n]<x[n+1])l[n]=l[n]*2;};sum(l)}

Essenzialmente l'idea è

  • Prendi la stringa e trasformala in una matrice di 2 righe
  • Assicurati che sia nell'ordine giusto
  • Risolvi le differenze per ogni colonna
  • Raddoppia la prima e l'ultima differenza
  • Raddoppia le differenze intermedie se hanno un divario rispetto al precedente o al successivo sufficientemente grande
  • Restituisce la somma delle differenze

Modifica: mi sono reso conto di aver contato male i caratteri inizialmente, quindi ho riorganizzato alcune cose per raderne alcune.

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.