ค้นหาจุดตัดของ 2 ชุดในสัญลักษณ์ช่วงเวลาแบบรวม


10

ค้นหาจุดตัดของ 2 ชุดในสัญลักษณ์ช่วงเวลาแบบรวม

เมื่อกำหนดจำนวนจริงสองชุดที่อธิบายว่าเป็นการรวมกันของช่วงเวลาเอาท์พุทคำอธิบายของจุดตัดของทั้งสองชุดเป็นสหภาพที่มีช่วงเวลาชนิดเดียวกัน

ชุดข้อมูลเข้าจะประกอบด้วยสหภาพต่างๆของช่วงเวลาเช่นว่าแต่ละช่วงเวลาเริ่มต้นและสิ้นสุดที่จำนวนเต็มที่แตกต่างกัน (เช่นไม่มีช่วงเวลาที่มีการวัดศูนย์) อย่างไรก็ตามช่วงเวลาที่แตกต่างกันในชุดเดียวกันอาจเริ่มต้นหรือสิ้นสุดที่จำนวนเต็มหรือทับซ้อนกัน

ชุดเอาท์พุทต้องเป็นยูเนี่ยนของช่วงเวลาซึ่งเริ่มต้นและสิ้นสุดที่จำนวนเต็ม แต่ไม่มีช่วงเวลาในเอาต์พุตอาจทับซ้อนกันแม้แต่ในจำนวนเต็มเดียว

อินพุตอาจอยู่ในรูปแบบใด ๆ ที่เหมาะสมกับภาษาที่คุณเลือกตราบใดที่มันประกอบด้วยรายการจำนวนเต็มสองคู่

ตัวอย่างเช่นคุณอาจแสดงชุดสมการเป็น:

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

หรือเป็น:

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

หรือเป็น:

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

การแทนค่าเอาต์พุตของคุณจะต้องเหมือนกับการแทนค่าอินพุตของคุณ (ยกเว้นว่าจะเป็นเพียงช่วงเวลาเดียวเท่านั้นแทนที่จะเป็นสองช่วง)

ตัวอย่าง / กรณีทดสอบ:

การป้อนข้อมูล:

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

เอาท์พุท:

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

กล่าวอีกนัยหนึ่งเรากำลังตัดกันชุดที่มีจำนวนจริงทั้งหมดระหว่าง -90 ถึง -4 และจำนวนจริงทั้งหมดระหว่าง 4 ถึง 90 กับเซตที่มีจำนวนจริงทั้งหมดระหว่าง -50 ถึง 50 จุดตัดคือชุดที่มีทั้งหมด จำนวนจริงระหว่าง -50 ถึง -4 และจำนวนจริงทั้งหมดระหว่าง 4 ถึง 50 คำอธิบายที่ชัดเจนยิ่งขึ้น:

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

การป้อนข้อมูล:

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

เอาท์พุท:

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

การป้อนข้อมูล:

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

เอาท์พุท:

[-8,0]

เอาต์พุตไม่ถูกต้อง (แม้ว่าจะเป็นชุดเดียวกัน):

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

เกณฑ์การให้คะแนน:

นี่คือแหล่งที่สั้นที่สุดในหน่วยไบต์ชนะตามที่อาจแก้ไขโดยโบนัสต่อไปนี้

โบนัส:

-15% ถ้าคุณยังสนับสนุนอินฟินิตี้บวกและลบเป็นขอบเขตของช่วงเวลา คุณสามารถเลือกสิ่งที่โทเค็นแสดงถึงตัวเลขเหล่านี้ (และใช่อินฟินิตี้คือตัวเลขในไฮเปอร์เรียม; P)


เราสามารถสันนิษฐานว่าชุดสหภาพต่างๆในแต่ละการสรุปการประชุมจะถูกเขียนขึ้นเพื่อเพิ่มหรือไม่? กล่าวอีกนัยหนึ่ง (แต่ตรงกันข้าม) อินพุตต่อไปนี้ใช้ได้หรือไม่ [[[4,90],[-90,-4]],[[-50,50]]]
msh210

2
@ msh210 ตัวอย่างที่สามควรตอบคำถามนี้ (ไม่จัดเรียงตัวเอง)
quintopia

@nimi คุณพูดถูก คงที่
quintopia

คำตอบ:


3

Mathematica, 41 ไบต์ - 15% = 34.85

Mathematica มีฟังก์ชันในตัวสำหรับการตัดช่วงเวลา

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

ตัวอย่าง:

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

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

2
ว้าว ... ฉันเพิ่งได้คำตอบเดียวกับที่ไม่ต้องอ่าน +1
LegionMammal978

ต้องรัก Mathematica Intervalของอัตโนมัติ
mbomb007

3

Haskell, 145 ไบต์

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=[]

ตัวอย่างการใช้งาน: ->[(-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)]

มันทำงานอย่างไร:

                 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 

ฉันวาง "ครึ่ง" -values x.5ในรายการเพราะฉันต้องการที่จะเห็นความแตกต่างจาก(1,2),(3,4) (1,4)โดยไม่ต้องx.5ทั้งสองจะกลายเป็น[1,2,3,4]แต่มีx.51 กลายเป็น[1,1.5,2,3,3.5,4](ซึ่งขาด2.5) [1,1.5,2,2.5,3,3.5,4]และครั้งที่สอง


เอาต์พุตควรเหมือนกับอินพุต ... ดังนั้นเพียงแค่บอกว่าข้อมูลที่คุณป้อนต้องการ 0.0 หลังจากแต่ละจำนวนเต็มด้วยเช่นกัน)
quintopia

@quintopia: ใช่ขอบคุณ
nimi

2

Ruby, 90 ไบต์

แมปแต่ละชุดสองชุดเป็นอาเรย์แบนรับจุดตัดเซตของอาร์เรย์เหล่านั้นจากนั้นแบ่งผลลัพธ์เป็นชิ้นต่อเนื่องและแมปแต่ละอันเป็นองค์ประกอบแรกและสุดท้าย peasy ง่าย ๆ

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

การใช้งาน:

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]]

โปรแกรมของคุณมีผลs = [[[1,2],[3,4]], [[1,2],[3,4]]]อะไร (รุ่นทับทิมของฉันไม่มีslice_whenดังนั้นฉันไม่สามารถทดสอบตัวเองได้)
nimi

@mimi [[1, 4]]มันจะช่วยให้ slice_whenวิธีถูกเพิ่มเข้ามาบางรอบทับทิม 2.2 ผมคิดว่า
daniero

... แต่ควรเป็น [[1,2], [3,4]]
nimi

ชุดมากกว่าตัวเลขจริงเพียงขอบเขตช่วงเป็นจำนวนเต็มจึง2.2ไม่ได้อยู่ในการป้อนข้อมูลแต่ในการส่งออกของคุณs = [[[1,2],[3,4]], [[1,2],[3,4]]] [[1, 4]]
nimi

อืมคุณพูดถูก ที่อาจได้รับการ clearified / emphized บิตสำหรับผู้พิการทางคณิตศาสตร์เช่นตัวเอง ..
daniero
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.