Birleştirilmiş Aralık Notasyonunda 2 Setin Kesişimini Bulun


10

Birleştirilmiş Aralık Notasyonunda 2 Setin Kesişimini Bulun

Aralıkların birleşimi olarak tanımlanan iki gerçek sayı kümesi verildiğinde, bu iki kümenin aynı tipteki aralıkların birleşimi olarak kesişiminin bir açıklamasını çıktı.

Giriş kümeleri her zaman aralık sendikalarından oluşur, öyle ki her aralık farklı bir tamsayıda başlar ve biter (yani hiçbir aralıkta sıfır ölçüsü yoktur). Ancak, aynı kümedeki farklı aralıklar aynı tamsayıda veya çakışmada başlayabilir veya sona erebilir.

Çıkış seti, tamsayılarda başlayan ve biten aralıkların birleşimi olmalıdır, ancak çıkıştaki hiçbir aralık, tek bir tamsayıda bile diğerlerinin üzerine gelemez.

Giriş, iki tamsayı çifti listesinden oluştuğu sürece, dilinize uygun herhangi bir biçimde olabilir.

Örneğin, seti şu şekilde temsil edebilirsiniz denklem:

[-10,-4]u[1,5]u[19,20]

Veya:

[[-10,-4],[1,5],[19,20]]

Veya:

[-10,-4;1,5;19,20]

Çıktı sunumunuz giriş sunumunuzla aynı olmalıdır (iki yerine yalnızca bir aralık listesi olması hariç).

Örnekler / Test örnekleri:

Giriş:

[[[-90,-4],[4,90]],[[-50,50]]]

Çıktı:

[[-50,-4],[4,50]]

Başka bir deyişle, -90 ile -4 arasındaki tüm gerçek sayıları ve 4 ile 90 arasındaki tüm gerçek sayıları içeren kümeyi -50 ile 50 arasındaki tüm gerçek sayıları içeren kümeyle kesişiyoruz. Kavşak, tümünü içeren kümedir -50 ile -4 arasındaki gerçek sayılar ve 4 ile 50 arasındaki tüm gerçek sayılar. Daha görsel bir açıklama:

-90~~~~~-4  4~~~~~90   intersected with
    -50~~~~~~~~50        yields:
    -50~-4  4~~50

Giriş:

"[-2,0]u[2,4]u[6,8]
[-1,1]u[3,5]u[5,9]"

Çıktı:

"[-1,0]u[3,4]u[6,8]"

Giriş:

[-9,-8;-8,0;-7,-6;-5,-4]
[-7,-5;-1,0;-8,-1]

Çıktı:

[-8,0]

Geçersiz Çıktı (aynı seti temsil etmesine rağmen):

[-8,0;-7,-5;-5,0]

puanlama:

Bu , aşağıdaki bonus tarafından potansiyel olarak değiştirildiği gibi, bayt kazanmalarındaki en kısa kaynaktır.

Bonus:

Ayrıca aralıkların sınırı olarak pozitif ve negatif sonsuzluğu destekliyorsanız% -15. Bu numaraları hangi belirteçlerin temsil edeceğini seçebilirsiniz. (Ve evet, sonsuzluk hiperreallerin bir numarasıdır; P)


Her kavşak toplamındaki çeşitli birleşmiş kümelerin artan sırada yazıldığını varsayabilir miyiz? Başka bir deyişle (ancak tersine), aşağıdaki girdi geçerli midir? [[[4,90],[-90,-4]],[[-50,50]]]
msh210

2
@ msh210 üçüncü örnek bu soruya cevap vermelidir. (Hayır. Onları kendiniz sıralayın.)
quintopia

@nimi haklısın. giderildi
quintopia

Yanıtlar:


3

Mathematica, 41 bayt -% 15 = 34,85

Mathematica, aralıklı kavşak için yerleşik bir işleve sahiptir.

List@@IntervalIntersection@@Interval@@@#&

Misal:

In[1]:= List@@IntervalIntersection@@Interval@@@#&[{{{-90, -4}, {4, Infinity}}, {{-50,Infinity}}}]

Out[1]= {{-50, -4}, {4, Infinity}}

2
Vay be ... Bunu okumadan tam olarak aynı çözümü buldum. +1
LegionMammal978

Mathematica'nın otomatik birleşmesini sevmeliyim Interval.
mbomb007

3

Haskell, 145 bayt

import Data.List
q(a,b)=[a,a+0.5..b]
p@(a,b)%(h:t)|h==b+0.5=(a,h)%t|1<2=p:(h,h)%t
p%_=[p]
a#b|h:t<-nub$sort$intersect(q=<<a)$q=<<b=(h,h)%t|1<2=[]

Kullanım örneği: [(-2.0,0.0),(2.0,4.0),(5.0,6.0),(6.0,8.0)] # [(-1.0,1.0),(3.0,5.0),(5.0,9.0)]-> [(-1.0,0.0),(3.0,4.0),(5.0,8.0)].

Nasıl çalışır:

                 q=<<a            -- turn each pair in the 1st input list into
                                  -- lists with halves in between (e.g. (1,4) ->
                                  -- [1,1.5,2,2.5,3,3.5,4]) and concatenate them
                                  -- to a single list
                      q=<<b       -- same for the second input list
    nub$sort$intersect            -- sort the intersection of those lists
                                  -- and remove duplicates
h:t<-                             -- call the first element h and the rest t
                       (h,h)%t    -- start rebuilding the intervals
                          |1<2=[] -- if there's no first element h, one of the
                                  -- input lists is empty, so the output is also
                                  -- empty


p@(a,b)%(h:t)                     -- an interval p = (a,b), build from a list (h:t)
             =(a,h)%t             -- becomes (a,h)
      |h==b+1                     --   if h equals b+0.5
                    p:(h,h)%t     -- or is put in the output list, followed by
                                  --       a new interval starting with (h,h)
      |1<2                        --   otherwise
p%_=[p]                           -- base case of the interval rebuilding function 

Ben "yarı"-değerlerine atıyorum x.5ben ayırt etmek gerekir, çünkü listede (1,2),(3,4)dan (1,4). Olmasaydı x.5, her ikisi de olur [1,2,3,4], ama x.51. ile [1,1.5,2,3,3.5,4](ki eksik 2.5) ve ikincisi olur [1,1.5,2,2.5,3,3.5,4].


Çıktı, giriş ile aynı olmalıdır. ... yani girişinizin her tamsayıdan sonra .0'a ihtiyacı olduğunu söyleyin;)
quintopia

@quintopia: evet, teşekkürler.
nimi

2

Ruby, 90 bayt

İki kümenin her birini düz bir diziye eşler, bu dizilerin küme kesişimini alır, ardından sonucu sürekli parçalar halinde dilimler ve her parçayı ilk ve son öğeye eşler. Çantada keklik.

->s{a,b=s.map{|y|y.flat_map{|f,l|[*f..l]}.sort}
(a&b).slice_when{|a,b|b-a>1}.map &:minmax}

Kullanımı:

f=->s{a,b=s.map{|y|y.flat_map{|f,l|[*f..l]}.sort}
(a&b).slice_when{|a,b|b-a>1}.map &:minmax}

s = [[[-90,-4],[4,90]], [[-50,50]]]
p f[s] # => [[-50, -4], [4, 50]]

s = [[[-2,0],[2,4],[6,8]], [[-1,1],[3,5],[5,9]]]
p f[s] # => [[-1, 0], [3, 4], [6, 8]]

s = [[[-9,-8],[-8,0],[-7,-6],[-5,-4]],[[-7,-5],[-1,0],[-8,-1]]]
p f[s] # => [[-8, 0]]

Programınız ne için çıktı s = [[[1,2],[3,4]], [[1,2],[3,4]]]? (Ruby slice_when
sürümüm

@mimi verir [[1, 4]]. slice_whenYöntem bence Ruby 2.2 civarında bir yerlerde eklenmiştir.
daniero

... ama bu [[1,2], [3,4]]
olmalı

Kümeler gerçek sayıların üzerindedir, yalnızca aralık sınırları tamsayıdır, bu nedenle 2.2girdide s = [[[1,2],[3,4]], [[1,2],[3,4]]]değil, çıktınızdadır [[1, 4]].
nimi

Hmm, haklısın. Bu kendim gibi matematiksel olarak meydan okumak için biraz temizlenmiş / emilmiş olabilir ..
daniero
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.