整数間隔を最大限に拡張


14

整数の非交差区間のセットが与えられたと仮定します[a1,b1],[a2,b2],[a3,b3],...,[aN,bN]。([a,b]整数以上のセットはa、以下ですb。)

インデックスの間隔XbX - aX + 1値をカバーします。この番号を呼び出しますcX

それぞれの間隔が...

  • 変更なし(そのまま[aX,bX])、
  • +番号の側に向かって右に伸びるcX(になる[aX,bX + cX])、
  • または-、番号の側に向かって左に拡張しますcX(になります[aX - cX,bX])、

すべての更新された間隔がまだ交差していない場合、すべての更新された間隔の和集合でカバーできる値の最大数はいくつですか?

フォームの文字列を取り、[a1,b1],[a2,b2],[a3,b3],...,[aN,bN]この最大値を計算する関数またはプログラムを作成します。関数を記述する場合、値を返します。完全なプログラムを作成する場合は、入力にstdinを使用し、値をstdoutに出力します(または最も近い代替を使用します)。

すべての値は、通常の符号付き32ビット整数の制限内であり、すべてのインデックスaX以下であると仮定できます。間隔は任意の順序でかまいませんが、必ずしも常に増加しているわけではありません。上記の形式の文字列として指定する必要があります。文字列は空の場合があります。その場合、答えは0になります。bXX

バイト単位の最短提出勝ちです。

入力が[-3,0],[1,2],[4,9]出力の場合、22になります。中央の間隔にはどちらの方法でも拡張する余地がないため、変更しないでおく必要があります。左右の間隔は[-7,0][4,15]それぞれに拡張することができます。[-7,0]and [1,2]とunionの結合には、[4,15]-7から15までのすべての値が含まれます(3を除く)。22の値です。


3
入力に言語の配列のネイティブ文字列表現を使用できますか、それとも正確にこの形式である必要がありますか?
マーティンエンダー

@MartinBüttnerいいえ。この正確な形式を使用する必要があります。(私はそれが両刃の剣のようなものであることを知っていますが、それはその通りです。)
カルビンの趣味

両側で特定の間隔を広げることはできますか?たとえば、することができます[5,6]になる[3,8](6の答えのため)、またはそれだけで可能[5,8][3,6](4の答えのため)?
MtnViewMark

@MtnViewMarkいいえ。片側からしか拡張できない(またはまったく拡張できない)
カルビンの趣味

回答:


4

Haskell、145バイト

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.('[':).(++"]")

サンプルの実行:

λ: x ""
0

λ: x "[5,6]"
4

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

1

R、 282 278 269 247

これは、文字列入力をすばやく処理するのに非常に大きくなりました。私はこれでもっとゴルフができると思うが、現時点では時間が足りない。

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)}

基本的に考えは

  • 文字列を取り、2行の行列に変換します
  • 正しい順序であることを確認してください
  • 各列の違いを解決する
  • 最初と最後の違いを2倍にする
  • 前または次との間に十分なギャップがある場合は、中間の差を2倍にします
  • 差の合計を返します

編集:私は元々文字を誤って数えていましたが、いくつかのことを整理していくつかを剃るようにしました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.