สหภาพช่วงเวลา


15

รับรายการช่วงเวลาดำเนินการสหภาพของพวกเขาและลดการทับซ้อน นั่นหมายถึงชิ้นส่วนที่ทับซ้อนกันจะลดลง ( [a, b] U [c, d] = [a, d]ถ้าb > c) สมมติว่าทุก <b [a, b]ในช่วงเวลาทั้งหมด ใช้เป็นฟังก์ชั่นของรายการช่วงเวลาอินพุต -> รายการช่วงเวลาเอาต์พุต รหัสที่สั้นที่สุดชนะ คุณไม่สามารถใช้ห้องสมุดที่มีอยู่ใด ๆ

ชี้แจง:

  • ช่วงเวลาที่เปิดและปิดจะไม่แตกต่าง
  • ช่วงเวลาสำหรับจำนวนจริงไม่ใช่จำนวนเต็ม ( [2, 3], [4, 5] -> [2, 3], [4, 5])
  • ไม่จำเป็นต้องเรียงลำดับช่วงเอาต์พุต
  • ลำดับถ้าอินพุตไม่สำคัญ
  • อินพุตที่ผิดกฎหมายเป็นเพียง[a, b]ที่ซึ่งb >= aไม่มีส่วนเกี่ยวข้องกับลำดับของช่วงเวลาอินพุตและจำนวนของช่วงเวลาอินพุต
  • คุณไม่จำเป็นต้องแสดงข้อความแสดงข้อผิดพลาดเกี่ยวกับพฤติกรรมที่ไม่ได้กำหนด

ตัวอย่าง (พร้อมหมายเลขบรรทัด)

 [2, 4], [7, 9] --> [2, 4], [7, 9]
   234
        789
-> 234  789

 [1, 5], [2, 10] --> [1, 10] (overlapping [2, 5] reduced)

   12345
    234567890
-> 1234567890
 [2, 4], [3, 6], [8, 9] -> [2, 6], [8, 9]
   234
    3456
         89
-> 23456 89

 [4, 2], [2, 2] -> (undefined behavior: against the assumption)

3
ช่วงเวลาจะถูกจัดเรียงตามที่อยู่ในตัวอย่างของคุณหรือไม่
Peter Olson

1
ทำไมไม่ [2, 3], [4, 5] เหลื่อมกันหรือ [2, 4], [4, 5] พวกเขาทั้งคู่ให้ผล 2345
mellamokb

2
ช่วงเวลาเฉพาะในชุดจำนวนเต็มหรือไม่
Lowjacker

2
เราต้องการความกระจ่าง: 1) การป้อนข้อมูลทางกฎหมาย [4,5], [1,2] หรือไม่ 2) ผลลัพธ์ของ [2,3], [4,5] เป็น [2,5] หรือ [2,3], [4,5] 3) ผลลัพธ์ของ [2,3], [3,4] ควรเป็น [2,4] หรือ [2,3], [3,4]
MtnViewMark

1
ขอบคุณสำหรับคำอธิบาย แต่ "ไม่จำเป็นต้องเรียงลำดับ" หมายถึงอะไร เอาท์พุทไม่จำเป็นต้องเรียง? หรือว่าอินพุตถูกเรียงลำดับแล้ว?
MtnViewMark

คำตอบ:


2

GolfScript, 32

[{1$1$*-2%~2->{*$[(\)\;]}{}if}*]
  • เพิ่ม 2 ตัวอักษรหากคุณต้องการบล็อก 4 ถ้าคุณต้องการบล็อกที่มีชื่อ
  • อินพุตและเอาต์พุตเป็นอาร์เรย์ของคู่เช่น [[2 4] [3 5]]
  • สมมติว่าอินพุตถูกเรียงลำดับโดยอิลิเมนต์แรก
  • กระชับช่วง "ที่อยู่ติดกัน" ([2 4] [5 6] -> [2 6])
  • ความพยายามครั้งแรกของ GolfScript คำแนะนำ & ผลไม้เน่าชื่นชม

โปรแกรมทดสอบเต็มรูปแบบ:

[~](;2/[{1$1$*-2%~2->{*$[(\)\;]}{}if}*]`

ตัวอย่างการร้องขอ:

ruby golfscript.rb intervals.gs <<EOF
3
2 4
3 6
8 9
EOF
# Expected output: [[2 6] [8 9]]

4

Haskell (103)

ฉันคิดว่ามันเป็นวิธีที่ verbose เกินไปสำหรับ Haskell ขอบคุณ Hoa Long Tam สำหรับฟังก์ชั่นการเรียงลำดับของเขา

m%(x:y)|x>m=m:x:y|2>1=x:m%y;m%_=[m]
(x:y)?l|x`elem`l=y?l|0<1=x:y?(x:l);a?_=a
a∪b=foldr(%)[](a++b)?[]

ใน Haskell เป็น intervall จากaที่จะมีการแสดงโดยb [a..b]สัญกรณ์ของฉันคล้ายกับสัญกรณ์คณิตศาสตร์ ใช้แบบนี้:

[a..b] ∪ [c..d] ∪ ... ∪ [y..z]

3

ตกลงนี่คือ 250 ตัวละครของฉันแตกที่มัน

void n(int a[]){if(!a[2])return;if(a[2]<=a[1]){if(a[1]<a[3])a[1]=a[3];
int *b=a+2;while(*b=*(b+2))++b;n(a);}n(a+2);}
void m(int a[]){if(!a[2])return;if(a[0]>a[2]){int s=a[0],t=a[1];
a[0]=a[2];a[2]=s;a[1]=a[3];a[3]=t;m(a+2);m(a);n(a);}m(a+2);n(a+2);}

ฟังก์ชั่นใช้อาร์เรย์ int และดำเนินการกับมันในแหล่งกำเนิด อาร์เรย์จะถูกยกเลิกด้วย 0 และช่วงเวลาอาจได้รับในลำดับใด ๆ

ตัวอย่างผลลัพธ์:

input list: (7,9) (5,6) (1,4) (15,18) (13,16) (2,3) (8,11) 
output list: (1,4) (5,6) (7,11) (13,18) 

โปรแกรมตัวอย่าง:

#include <stdio.h>

void n(int a[]){if(!a[2])return;if(a[2]<=a[1]){if(a[1]<a[3])a[1]=a[3];
int *b=a+2;while(*b=*(b+2))++b;n(a);}n(a+2);}
void m(int a[]){if(!a[2])return;if(a[0]>a[2]){int s=a[0],t=a[1];
a[0]=a[2];a[2]=s;a[1]=a[3];a[3]=t;m(a+2);m(a);n(a);}m(a+2);n(a+2);}


/*
void n(int a[])
{
    if(!a[2])return;
    if(a[2]<=a[1]) {
        if(a[1]<a[3])
            a[1]=a[3];
        int *b=a+2;
        while(*b=*(b+2))++b;
        n(a);
    }
    n(a+2);
}

void m(int a[])
{
    if(!a[2])return;
    if(a[0]>a[2]) {
        int s=a[0],t=a[1];
        a[0]=a[2];a[2]=s;
        a[1]=a[3];a[3]=t;
        m(a+2);m(a);n(a);
    }
    m(a+2);n(a+2);
}
*/

void p(int a[]) 
{
    if(!*a) {
        printf("\n");
        return;
    }
    printf("(%d,%d) ",a[0],a[1]);
    p(a+2);
}

int main (int argc, const char * argv[]) 
{
    // Code golf entry
    // Interval Merging

    int a[] = {7,9,5,6,1,4,15,18,13,16,2,3,8,11,0};
    printf( "input list: " ); p(a);
    m(a);
    printf( "output list: " ); p(a);

    return 0;
}

perform the union of themควรจะนำไปสู่(1,11) (13,18)ใช่มั้ย
ผู้ใช้ที่ไม่รู้จัก

@ ผู้ใช้ที่ไม่รู้จัก: ฉันจะคิดอย่างเดียวกัน แต่ฉันเดาว่าคำแนะนำจะรวมกันเฉพาะเมื่อทับซ้อนกันเท่านั้น ดังนั้น (1, 4) (5, 6) ([a, b] U [c, d] = [a, d] if b > c)จะไม่รวมกันตามกฎ และสำหรับเรื่องนั้นแม้ (1, 5) (5, 6) จะไม่ถูกรวมเข้าด้วยกัน
mellamokb

"ให้รายชื่อของช่วงเวลาให้ดำเนินการรวมกันของพวกเขาและลดการทับซ้อน" andลดการทับซ้อน - if they overlapไม่ได้ ตกลง - that means ...จุดต่อไปนี้อีกครั้งในทิศทางตรงกันข้าม
ผู้ใช้ที่ไม่รู้จัก

@ ไม่ทราบชื่อผู้ใช้: ฉันเห็นด้วย นั่นเป็นเหตุผลที่ฉันได้แสดงความคิดเห็นเกี่ยวกับคำถาม หวังว่า OP จะตอบสนอง :)
mellamokb

2

Python 100 ตัวอักษร

def f(L):R=sorted(set(p for p in sum(L,[])if 1-any(x<p<y for x,y in L)));return zip(R[::2],R[1::2])
print f([[2, 4], [7, 9]])
print f([[1, 5], [2, 10]])
print f([[3, 6], [2, 4], [8, 9]])
print f([[1, 5], [3, 5], [4, 5]])

สร้าง

[(2, 4), (7, 9)]
[(1, 10)]
[(2, 6), (8, 9)]
[(1, 5)]

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



2

Haskell, 55 ตัวอักษร

v(q@(a,b):p@(c,d):r)|c>b=q:v(p:r)|1<3=v((a,d):r);v x=x

หากอินพุตไม่ถูกเรียงลำดับดังนั้น 88 ตัวอักษร:

p@(a,b)§(q@(c,d):r)|b<c=p:q§r|a>d=q:p§r|1<3=(min a c,max b d)§r;p§_=[p]
u i=foldr(§)[]i

ทดสอบการทำงาน:

ghci> testAll v
pass: [(2,4),(7,9)] --> [(2,4),(7,9)]
pass: [(1,5),(2,10)] --> [(1,10)]
pass: [(2,4),(3,6),(8,9)] --> [(2,6),(8,9)]
ghci> testAll u
pass: [(2,4),(7,9)] --> [(2,4),(7,9)]
pass: [(1,5),(2,10)] --> [(1,10)]
pass: [(2,4),(3,6),(8,9)] --> [(2,6),(8,9)]

ฉันสมมติว่า "ไม่สามารถใช้ห้องสมุดที่มีอยู่" ติ๊ดนำเข้าและโทรList sortหากถูกกฎหมายกว่าเวอร์ชันที่ไม่ได้เรียงจะมีเพียง 71 ตัวอักษร


การนำเข้าListจากแพคเกจHaskell98จะเพียงพอ IMHO
FUZxxl

2

สกาลา, 272 ตัวอักษร

type p=List[(Int,Int)];def f(l:p):p={var(a,s,c,o)=(new Array[Int]((l map(x=>x._2)max)+1),0,0,List[Int]());l map(x=>(a(x._1)+=1,a(x._2)-=1));while(c<a.size){s+=a(c);if(a(c)==1&&s==1)o=o:+c;if(a(c)== -1&&s==0)o=o:+c;c+=1};return(o.grouped(2).map(x=>(x.head,x.last)).toList)}

การใช้งาน:

object Intervals2 extends Application
{
    type p=List[(Int,Int)];def f(l:p):p={var(a,s,c,o)=(new Array[Int]((l map(x=>x._2)max)+1),0,0,List[Int]());l map(x=>(a(x._1)+=1,a(x._2)-=1));while(c<a.size){s+=a(c);if(a(c)==1&&s==1)o=o:+c;if(a(c)== -1&&s==0)o=o:+c;c+=1};return(o.grouped(2).map(x=>(x.head,x.last)).toList)}

    print(f(List((1,2),(3,7),(4,10))))
}

สร้างอาร์เรย์และแทรก 1 สำหรับทุกช่วงเวลาเริ่มต้นและ -1 สำหรับทุกช่วงเวลาสิ้นสุด จากนั้นทำตามขั้นตอนผ่านอาร์เรย์เพื่อเพิ่มค่าให้กับตัวนับส่งผลให้เริ่มต้นทุกครั้งที่ตัวนับก้าวจาก 0 ถึง 1 และจุดสิ้นสุดเมื่อมันเริ่มจาก 1 ถึง 0 อาจซับซ้อนโดยไม่จำเป็น

เอาท์พุท:

List((1,2), (3,10))

1

Perl (146) (92) (90)

ลงไปถึง 90 ตัวอักษรโดยใช้เครื่องมือ regex อย่างสร้างสรรค์

sub u {map $ h [$ _] = 1, @ $ _ [0] .. @ $ _ [1] สำหรับ @_; $ w. = $ _ + 0 สำหรับ @ h; กด @ r, $ - [0 ], $ + [0] -1while $ W = ~ / 1 + / g;} @r

ตัวอย่างการใช้งาน:

my @ out1 = u ([1, 5], [2, 10]); # (1,10)
my @ out2 = u ([2, 4], [3, 6], [8, 9]); # (2, 6, 8, 9)

อธิบายรหัสนี้หน่อย

รูทีนย่อยนี้ได้รับอาร์เรย์ arrayrefs แต่ละอันจะชี้ไปที่อาร์เรย์ที่มีสององค์ประกอบเริ่มต้นและสิ้นสุดของช่วงเวลา: ([2, 4], [3, 6], [8, 9])

สำหรับทุก Aref ($_->[0] .. $_->[1])เราสร้างอาร์เรย์ขององค์ประกอบจากครั้งแรกที่ผ่านมา จากนั้นเราใช้แผนที่เพื่อตั้งองค์ประกอบของดัชนีดังกล่าวใน @h ถึง 1

สำหรับ (@_) {
    map {$ h [$ _] = 1} ($ _-> [0] .. $ _-> [1]);
}

หลังจากนี้@hจะมีอย่างใดอย่างหนึ่ง (สำหรับช่วงเวลา) หรือ undefs อธิบายด้านล่างเป็นยัติภังค์เพื่อความชัดเจน

ดัชนี: 0 1 2 3 4 5 6 7 8 9
@h: - - 1 1 1 1 1 1 - 1 1

ต่อไปเราจะสร้างสตริงจาก @h เพิ่ม 0 เพื่อแทนที่ undefs ด้วยสิ่งที่มีประโยชน์มากขึ้น (undef + 0 = 0)

$w .= $_+0 for @h;

$ w ประกอบด้วย011111011ตอนนี้

ถึงเวลาที่จะใช้เครื่องมือ regex ในทางที่ผิด

push @r, ($-[0], $+[0]-1) while $w=~/1+/g;

หลังจากการแข่งขันที่ประสบความสำเร็จ @ - และ @ + อาร์เรย์จะมีตำแหน่งเริ่มต้นและจุดสิ้นสุดของการแข่งขันแต่ละรายการตามลำดับ องค์ประกอบที่ 0 ใช้สำหรับการแข่งขันทั้งหมดอันดับแรกราคา $ 1 อันดับที่สองราคา $ 2 และอื่น ๆ

$+[0] จริงๆแล้วมีตำแหน่งของอักขระที่ไม่จับคู่ตัวแรกดังนั้นเราจึงต้องแทนที่มัน

@rมี(2, 6, 8, 9)ตอนนี้

@r

@rที่จะทำให้ผลตอบแทนจากการย่อย


ไม่ทำงานสำหรับตัวเลขจริง[2,3],[4,5]อัตราผลตอบแทน2 5
Xcali

1

Scala 305 279 ตัวอักษรโดยไม่มีการร้องขอ:

type I=(Int,Int)
def l(p:I,q:I)=if(p._1<q._1)true else if(p._1>q._1)false else p._2<q._2
def r(l:List[I]):List[I]=l match{case x::y::z=>{if(y._1<=x._2&&y._2>x._2)(x._1,y._2)::r(z)else
if(y._1<=x._2&&y._2<=x._2)x::r(z)else  
x::r(y::z)}case _=>l}
def c(v:List[I])=r(v.sortWith(l))

ภาวนา:

val i=List((7,9),(5,6),(1,4),(15,18),(13,16),(2,3),(8,11))
c(i)
res0: List[(Int, Int)] = List((1,4), (5,6), (7,11), (13,18))

1

Brachylogขนาด 12 ไบต์

⟦₂ᵐcod~c~⟦₂ᵐ

ลองออนไลน์!

วิธีการแก้ปัญหาสำราญสำราญนำเข้าเป็นรายการของรายการผ่านตัวแปรอินพุตและส่งออกรายการของรายการผ่านตัวแปรเอาท์พุท

        ~⟦₂ᵐ    The output is a list of intervals, where each interval is a range in
      ~c        the smallest partition of
  ᵐ             each element of the input
⟦₂              converted to an inclusive range,
   c            concatenated,
    o           sorted,
     d          and deduplicated
        ~⟦₂ᵐ    for which each element of the partition is a range.

1

Clojure 138 ไบต์

#(let[S(set(apply mapcat range(apply map list %)))Q(sort S)](map list(for[s Q :when(not(S(dec s)))]s)(for[s(map inc Q):when(not(S s))]s)))

สิ่งนี้จะสั้นลงถึง119 ไบต์หากอินพุตมีความยืดหยุ่นมากกว่านั่นคือรายการจุดเริ่มต้นของช่วงเวลาและรายการจุดสิ้นสุดของช่วงเวลา:

#(let[S(set(mapcat range % %2))Q(sort S)](map list(for[s Q :when(not(S(dec s)))]s)(for[s(map inc Q):when(not(S s))]s)))

จะต้องมีวิธีที่ดีกว่า



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