ความขัดแย้งการจัดตารางแห่งชาติ


25

xkcd: ความขัดแย้งของตาราง

(ฉันตั้งใจจะโพสต์สิ่งนี้ในขณะที่1542: ความขัดแย้งของการกำหนดเวลา ยังคงเป็น xkcd ปัจจุบัน แต่ฉันมีความขัดแย้งของการตั้งเวลา)

อินพุต

การป้อนข้อมูลจะเป็นรายการ3nองค์ประกอบซึ่งเป็นตัวแทนของnเหตุการณ์ องค์ประกอบแรกในแต่ละกลุ่มของ 3 จะเป็นชื่อของเหตุการณ์ ครั้งที่สองและสามคือเวลาเริ่มต้นและสิ้นสุดตามลำดับ ตัวอย่างเช่น:

foo 12 34 bar 56 78

แสดงถึงเหตุการณ์fooที่เริ่มต้นที่ "เวลา 12" (เวลาถูกแทนด้วยจำนวนเต็มคุณสามารถคิดว่ามันเป็นนาทีที่ผ่านเที่ยงคืน) และสิ้นสุดที่ 34 และเหตุการณ์ที่สองbarที่เริ่มต้นที่ 56 และสิ้นสุดที่ 78

ชื่อของเหตุการณ์จะประกอบด้วยตัวอักษรและตัวเลขเท่านั้นและเวลาจะเป็นจำนวนเต็มเสมอ≥ 0 และ <1440 เวลาสิ้นสุดจะต้องมากกว่า 1 เวลาเริ่มต้นอย่างน้อย 1 เสมอ พวกเขาจะไม่รับประกันว่าจะเรียงในทางใดทางหนึ่ง

หากคุณต้องการคุณอาจใช้สิ่งนี้เป็นสตริงที่คั่นด้วยช่องว่างเดียว; ไม่เช่นนั้นควรใช้เป็นอาร์เรย์รายการเวกเตอร์หรือภาษาที่เทียบเท่าของคุณ

เอาท์พุต

เอาต์พุตควรเป็นรายการชื่อเหตุการณ์ที่คั่นด้วยช่องว่าง กฎสำหรับชื่อเหตุการณ์ที่จะส่งออกมีดังนี้:

  • ไม่มีเหตุการณ์ที่คุณส่งออกอาจขัดแย้งซึ่งกันและกัน ตัวอย่างเช่นด้วยอินพุตa 0 10 b 5 15คุณไม่สามารถส่งออกทั้งสองaและbเนื่องจากเวลาที่ขัดแย้งกัน (นั่นคือทับซ้อนบางส่วน) หากกิจกรรมสิ้นสุดลงเมื่อเริ่มอีกเหตุการณ์หนึ่งคุณอาจรวมทั้งสองเหตุการณ์

  • คุณอาจจะไม่ได้ผลผลิตเหตุการณ์ที่เรียกว่าNSCC( "การจัดตารางการแข่งขันความขัดแย้งแห่งชาติ") ซึ่งจะมีเสมอจะตรงหนึ่งในการป้อนข้อมูล คุณต้องแสดงผลลัพธ์อย่างน้อยหนึ่งเหตุการณ์ที่ขัดแย้งกัน (ทับซ้อนบางส่วน) กับNSCC(และจะต้องมีอย่างน้อยหนึ่งเหตุการณ์เช่นกัน)

  • คุณต้องส่งออกเหตุการณ์ให้ได้มากที่สุดเท่าที่จะทำได้ในขณะที่ทำตามกฎสองข้อ (นี่คือสิ่งที่ทำให้คุณดูยุ่งที่สุดเท่าที่จะทำได้เพื่อให้ NSCC ที่หายไปดูน่าเชื่อถือยิ่งขึ้น)

สิ่งนี้อาจถูกส่งออกเป็นสตริงที่คั่นด้วยช่องว่างเดียวหรืออาร์เรย์รายการเวกเตอร์ ฯลฯ

สามารถมีเอาต์พุตที่เป็นไปได้มากกว่าหนึ่งรายการ

กรณีทดสอบ

โปรดทราบว่าผลลัพธ์ที่แสดงเป็นตัวอย่างเท่านั้น รหัสของคุณอาจมีอะไรบางอย่างที่แตกต่างออกไปตราบใดที่มันยังคงเป็นไปตามกฎทั้งสามข้อด้านบน (โดยเฉพาะอย่างยิ่งนี่หมายความว่าจะต้องมีจำนวนเหตุการณ์เท่ากับตัวอย่าง)

เข้า: UnderwaterBasketWeavingConvention 50 800 NSCC 500 550
ออก:UnderwaterBasketWeavingConvention

เข้า: SconeEating 0 50 RegexSubbing 45 110 CodeGolfing 95 105 NSCC 100 200
ออก:SconeEating CodeGolfing

เข้า: VelociraptorHunting 0 300 NerdSniping 200 500 SEChatting 400 700 DoorknobTurning 650 750 NSCC 725 775
ออก:NerdSniping DoorknobTurning

เข้า: NSCC 110 115 A 100 120 B 120 140 C 105 135 D 100 105 E 135 500
ออก:C D E

เข้า: A 800 900 NSCC 700 1000 B 650 750 C 950 1050 D 655 660 E 660 665 F 1030 1040 G 1040 1060
ออก:A D E F G

เข้า: A 10 11 B 11 12 C 12 13 D 13 14 NSCC 15 1090 E 10 16
ออก:E

รู้สึกอิสระที่จะเพิ่มกรณีทดสอบเพิ่มเติมในการแก้ไขหากมีกรณีขอบที่ฉันพลาด

กฎระเบียบ

  • รหัสของคุณจะต้องเสร็จสมบูรณ์ภายใน 30 วินาทีสำหรับกรณีทดสอบทั้งหมดที่ให้ไว้ (นี่เป็นการตรวจสุขภาพที่ดีกว่าเพราะมันน่าจะเสร็จเร็วขึ้นมากสำหรับกรณีทดสอบทั้งหมดรวมกัน) ในเครื่องส่วนบุคคลที่สมเหตุสมผล

  • นี่คือดังนั้นโค้ดที่สั้นที่สุดในหน่วยไบต์ชนะ


เป็นที่ยอมรับหรือไม่ที่จะใช้ camelCase สำหรับเหตุการณ์ในอินพุต เช่นใช้underwaterBasketWeavingConvention 50 800 nscc 550แทนตัวอย่างของคุณ?
ทำให้เสียชีวิต

4
@ กระชับไม่แน่ใจว่าคุณหมายถึงอะไร อินพุตจะได้รับตามที่แสดง คุณควรจะสามารถรองรับการรวมกันของตัวอักษรและตัวเลข
Doorknob

4
ฉันจะต้องแก้ปัญหาในภายหลัง; ฉันมีข้อขัดแย้งเกี่ยวกับกำหนดการในตอนนี้
Alex A.

ในตัวอย่างที่สองมีช่องว่างสองช่องระหว่าง "CodeGolfing" และ "95" - นี่เป็นความผิดพลาดหรือเราจำเป็นต้องคำนึงถึงจำนวนช่องว่างโดยพลการในอินพุต สำหรับตอนนี้ฉันจะถือว่าอดีตเนื่องจากคุณดูเหมือนจะผ่อนปรนเล็กน้อยในรูปแบบของอินพุต
vijrox

@VijayRamamurthy ใช่มันเป็น คงที่
Doorknob

คำตอบ:


9

Pyth, 45 ไบต์

AGH.gqhk"NSCC"m,hdrFtdcQ3hMef&.{KseMT@KehHtyG

อันนี้ค่อนข้างยากที่จะเล่นกอล์ฟ พบโซลูชัน 45 ไบต์ไม่กี่ตัวอันนี้น่าจะเป็นโซลูชันที่แปลกใหม่ที่สุดเนื่องจากใช้A(pair-assign) และ.g(group-by)

ลองใช้งานออนไลน์: การสาธิตหรือชุดทดสอบ

คำอธิบาย

                            implicit: Q = input list
                      cQ3   split Q into triples
              m             map each triple d to:
               ,              the pair containing
                hd              - d[0] (name)
                  rFtd          - range from start-time to end-time
   .g                       group these tuples k by:
     qhk"NSCC"                k[0] == "NSCC"
AGH                         pair assign to G,H. This assigns all
                            tuples != NSCC to G, and the NSCC one to H

                  yG        generate all subsets of G
                 t          remove the first one (the empty subset)
   f                        filter for subsets T, which satisfy:
         eMT                  get the last item (the range) for all tuples in T
        s                     and combine them (sum)
       K                      assign to K
     .{                       check for uniqueness of K (no overlapping times)
    &                         and
            @KehH             check the intersection of K and H[0][1]
  e                         take the last element (most events)
hM                          get the first item (name) for each event
                            and implicitly print this list

13

SWI-Prolog, 537 524 516 502 447 436 ไบต์

z(A:B:C,[D:E:F|G]):-(A=D;B>=F;E>=C),(G=[];z(A:B:C,G)).
u([A|B],C):-z(A,C),(B=[];u(B,C)).
y([A,B,C|D])-->[A:B:C],(y(D);{_=_}).
d-->[A:_],{write(A),tab(1)},d;{_=_}.
l([H|T],R):-T=[],R=H;length(H,N),l(T,X),length(X,M),(N>M,R=H;R=X).
v([],_,R,R).
v([A|T],Z,B,R):-u(A,A),\+z(Z,A),v(T,Z,[A|B],R);v(T,Z,B,R).
s([E|T],[F|N]):-E=F,(N=[];s(T,N));s(T,[F|N]).
x(A):-y(A,D,[]),K="NSCC":_,select(K,D,E),setof(L,s(E,L),B),v(B,K,[],R),l(R,S),d(S,[]),!.

คำอธิบายสั้น ๆ เกี่ยวกับสิ่งที่แต่ละภาคแสดง:

  • z(A,B) ตรวจสอบว่าเหตุการณ์ A ไม่ขัดแย้งกับเหตุการณ์ใด ๆ ของรายการเหตุการณ์ B
  • u(A,B)ตรวจสอบว่าทุกเหตุการณ์ของรายการ A ไม่ขัดแย้งกับเหตุการณ์ใด ๆ ของรายการ B (ใช้เพื่อตรวจสอบว่าไม่มีข้อขัดแย้งในรายการ A โดยการโทรu(A,A))
  • y(A,B,C) แยก List เป็นรายการของ triplets (เพื่อแปลงอินพุตเป็นรายการของเหตุการณ์)
  • d(A) พิมพ์ชื่อของเหตุการณ์ในรายการ A
  • l(A,R) ประเมินรายการที่ยาวที่สุดของเหตุการณ์ R ที่อยู่ในรายการของรายการ A
  • v(A,NSCC,C,R) ส่งคืนรายการ R ที่มีทุกรายการของกิจกรรมใน A ที่ไม่มีความขัดแย้งภายในและขัดแย้งกับเหตุการณ์ NSCC
  • s(A,B) จริงถ้า B เป็นชุดย่อยของ A
  • x(A) เพรดิเคตหลัก A คืออินพุต

กรณีทดสอบ : ดำเนินการtest.ในล่ามหลังจากโหลดรหัสด้านบนโดยเพิ่มส่วนต่อไปนี้หลังจากนั้น:

test:-
    x(["UnderwaterBasketWeavingConvention",50,800,"NSCC",500,550]),
    nl,
    x(["SconeEating",0,50,"RegexSubbing",45,110,"CodeGolfing",95,105,"NSCC",100,200]),
    nl,
    x(["VelociraptorHunting",0,300,"NerdSniping",200,500,"SEChatting",400,700,"DoorknobTurning",650,750,"NSCC",725,775]),
    nl,
    x(["NSCC",110,115,"A",100,120,"B",120,140,"C",105,135,"D",100,105,"E",135,500]),
    nl,
    x(["A",800,900,"NSCC",700,1000,"B",650,750,"C",950,1050,"D",655,660,"E",660,665,"F",1030,1040,"G",1040,1060]),
    nl,
    x(["A",10,11,"B",11,12,"C",12,13,"D",13,14,"NSCC",15,1090,"E",10,16]).

สิ่งนี้ใช้เวลาของฉันมากกว่าที่ฉันคิด สิ่งนี้อาจจะสามารถเล่นกอล์ฟได้มากขึ้นอย่างมีนัยสำคัญ นอกจากนี้คุณอาจใช้ไลบรารีการเขียนโปรแกรมข้อ จำกัด ต่างๆที่มีอยู่เพื่อรับโซลูชันที่สั้นลง

แก้ไข:ขอบคุณ @Oliphaunt สำหรับแนวคิดในการใช้A:B:Cแทน[A,B,C]triplets บันทึก 14 ไบต์

แก้ไข 2:ขอขอบคุณอีกครั้งที่ @Oliphaunt สำหรับการชี้ให้เห็นว่าเพรดิเคต `` t / 3` ไม่มีประโยชน์อะไร บันทึก 55 ไบต์

Edit3:ได้รับความ 11 ไบต์โดยใช้ไวยากรณ์ข้อสรุปในภาคและyd


รักคำตอบในภาษาอารัมภบท! ทำได้ดีนี่.
plocks

ฉันเป็นคนรักอารัมภบทเช่นกัน คำแนะนำ: 1.ฉันคิดว่าคุณสามารถใช้เช่นA/B/Cแทนที่จะ[A,B,C]ใช้ triplets ประหยัด 10 ไบต์; 2.คุณสามารถใช้\+แทนได้notหรือไม่? 3.คุณช่วยอธิบายว่าทำไมคุณต้องตัดสุดท้ายในx(A)?
Oliphaunt - คืนสถานะโมนิก้า

พรุ่งนี้ฉันจะกลับมาหาคุณจากแล็ปท็อปของฉัน ตอนนี้อยู่บนเตียงกับแท็บเล็ตซึ่งทำให้การพิมพ์เงอะงะและฉันควรจะนอนต่อไป :-)
Oliphaunt - คืนสถานะโมนิก้า

1
นี่คือรุ่นที่บันทึกได้ 14 ไบต์ ฉันใช้:แทนที่จะ/ได้รับประโยชน์จากการเชื่อมโยงทางขวาของอดีตนั่นคือดังนั้นฉันจึงสามารถเขียนA:_เป็นชวเลขสำหรับA:_:_(แต่ก็A+B/Cใช้ได้ดีเช่นกัน: คุณสามารถใช้A+_) โดยวิธีการที่ยังอยู่ในต้นฉบับของคุณคุณอาจจะเคยใช้แทน[A|_] [A,_,_]ในที่สุดทราบว่า SWI-Prolog รุ่นของฉันไม่มีnth0/4ดังนั้นฉันจึงใช้select/3แทน
Oliphaunt - คืนสถานะโมนิก้า

1
ฉันสงสัยมาก่อนเกี่ยวกับความต้องการt(S,T)แต่แล้วก็ลืม การทดสอบตอนนี้: คุณสามารถบันทึก 55 ไบต์มากขึ้นโดยวางมันทั้งหมดและโดยตรงเรียกจากs(E,L) setof/3
Oliphaunt - คืนสถานะโมนิก้า

6

JavaScript ( ES6 ), 228

ลองครั้งที่สองฉันหวังว่าอันนี้จะได้ผล

เป้าหมายของฉันคือลำดับเหตุการณ์ที่ยาวที่สุดที่มีความขัดแย้งด้านเวลา แต่ไม่มีความขัดแย้งด้านเวลาเมื่อลบกิจกรรม NSCC ลำดับที่แก้ไขแล้วโดยลบ NSCC นี้เป็นเอาต์พุตที่ร้องขอ

ฉันใช้การค้นหาแบบกว้างครั้งแรกตรวจสอบคิวการแก้ปัญหาของผู้สมัครเริ่มต้นด้วยการที่ยาวที่สุด (อันแรกคือรายการเริ่มต้น) จากการแก้ปัญหาผู้สมัครของเหตุการณ์nฉันสร้างและจัดคิวnโซลูชั่นผู้สมัครเพิ่มเติมลบหนึ่งในเหตุการณ์ที่เกิดขึ้นและทำให้คนอื่น ๆ

โซลูชันของผู้สมัครที่ถูกต้องหากมีความขัดแย้งด้านเวลา 'ตามที่เป็น' แต่เมื่อเหตุการณ์ NSCC ถูกกรองออกจะไม่มีความขัดแย้ง ฉันใช้ฟังก์ชันย่อย K เพื่อตรวจสอบข้อขัดแย้ง

น่าจะเป็นสนามกอล์ฟอีกเล็กน้อย ...

ทดสอบการเรียกใช้ตัวอย่างด้านล่าง (เป็น EcmaScript 6, FireFox เท่านั้น)

F=l=>(K=>{
  l.map(v=>l.push(l.splice(0,3)));// I'm particularly proud of this trick for grouping in triplets (in pith it's "cQ3")
  for(S=[l.sort((a,b)=>a[1]-b[1])];!K(l=S.shift())|K(m=l.filter(x=>x[0]!='NSCC'));)
    l.map((v,i)=>(S.push(n=[...l]),n.splice(i,1)));
})(l=>l.some(x=>[p>+x[1],p=+x[2]][0],p=0))||m.map(x=>x[0])

// Less golfed and ES5

function Find(l) {
  var n,m;
  var Check = function(l) {
    // check timing conflict comparing start time and end time of previous event (events must be sorted)
    var p = 0 // previous event end time, init to 0
    return l.some( function(x) {
      var err = p > +x[1]; // unary plus convert string to number
      p = +x[2]; // update end time
      return err;
    });  
  };  
  // group initial array in triplets
  // forEach repeats for the initial number of elements in l, even if l becomes shorter
  // so it loops more times than necesary, but it works anymay
  l.forEach(function() { 
    l.push(l.splice(0,3)); // remove first 3 elements and add to back as a triple
  }) 
  l.sort(function(a,b) { return a[1]-b[1]} ); // sort by start time
  var S=[l]; // S is the main queue, start with complete list 
  
  while (l = S.shift(), // current list
         m = l.filter( function(x) { return x[0]!='NSCC'} ), // current list with NSCC removed
         !Check(l)|Check(m)) // loop while list ha no errors or filtered list do have errors
  {
    // build new candidate to check
    l.forEach ( function(v,i) {
      n = l.slice(); // make a copy of l
      n.splice(i,1); // remove ith element
      S.push(n); // put in S
    });  
  }
  // when exiting while, m has the list with NSCC removed
  return m.map( function(x) { return x[0]; }); // keep the event name only
}

// Test

out=(...x)=>O.innerHTML += x + '\n';

test=[
  ['UnderwaterBasketWeavingConvention 50 800 NSCC 500 550','UnderwaterBasketWeavingConvention']
, ['SconeEating 0 50 RegexSubbing 45 110 CodeGolfing  95 105 NSCC 100 200','SconeEating CodeGolfing']
, ['VelociraptorHunting 0 300 NerdSniping 200 500 SEChatting 400 700 DoorknobTurning 650 750 NSCC 725 775'
  ,'NerdSniping DoorknobTurning']
, ['NSCC 110 115 A 100 120 B 120 140 C 105 135 D 100 105 E 135 500','C D E']
, ['A 800 900 NSCC 700 1000 B 650 750 C 950 1050 D 655 660 E 660 665 F 1030 1040 G 1040 1060','A D E F G']
, ['A 10 11 B 11 12 C 12 13 D 13 14 NSCC 15 1090 E 10 16','E']
]


test.forEach(x=>{
  var l=x[0].split(/\s+/), r=F(l).sort().join(' '), e=x[1].split(/\s+/).sort().join(' ');
  out('Test ' + (r==e ? 'OK':'FAIL')+'\nInput:    '+x[0]+'\nResult:   '+r+'\nExpected: '+e)
} )
<pre id=O></pre>


3
ฉันขอถามจุดของส่วนย่อยของโปรแกรมได้ไหมถ้าโปรแกรมไม่ทำอะไรเลยถ้าคุณไม่เรียกใช้ฟังก์ชั่น?
Beta Decay

1
@BetaDecay: edc65 มักจะเพิ่มกรณีทดสอบที่เรียกใช้ในข้อมูลโค้ด ดูเหมือนว่าเขาจะกลับมาที่คำตอบนี้ในไม่ช้าซึ่งในเวลานั้นฉันคิดว่าเขาจะเพิ่มสิ่งที่รันได้ :)
อเล็กซ์ A.

1
@BetaDecay กำลังรีบ และ (แย่กว่านั้น) มันล้มเหลวในการทดสอบอย่างใดอย่างหนึ่ง
edc65

1

Java, 828 ไบต์

อาจมีการนำ Java มาใช้อย่างกระชับกว่านี้ แต่นี่คือการแทงของฉัน:

String s(String e){String[] a=e.split(" ");String m="";String[] c=g(a.length/3);int l=0;for(int i=0;i<a.length;i+=3)if(a[i].equals("NSCC"))l=i/3;for(String p:c)if(p.indexOf(l+"")==-1&&!h(p,a)&&h(p+l,a)&&p.length()>m.length())m=p;String r="";for(int i=0;i<m.length();i++)r+=a[3*(m.charAt(i)-48)]+((i==m.length()-1)?"":" ");return r;}boolean h(String c, String[] e){for(int i=0;i<c.length()-1;i++){int p=c.charAt(i)-48;for(int j=i+1;j<c.length();j++){int q=c.charAt(j)-48;if((Integer.parseInt(e[3*p+1])-Integer.parseInt(e[3*q+2]))*((Integer.parseInt(e[3*p+2])-Integer.parseInt(e[3*q+1])))<0)return true;}}return false;}String[] g(int n){if(n>1){String[] result=new String[(int)Math.pow(2,n)];String[] l=g(n-1);for(int i=0;i<l.length;i++){result[2*i]=l[i];result[2*i+1]=l[i]+(n-1);}return result;}else return new String[]{"","0"};}

การประกาศตัวแปรทั้งหมดในที่เดียวจะช่วยประหยัดไบต์
Spikatrix

else returnคุณไม่จำเป็นต้อง
lirtosiast

0

Python 373 ตัวอักษร

import itertools as j
a=zip(*[iter(input())]*3)
f,g,r=[],0,"NSCC"
p=f
for q in a:
 p=(p,q)[q[0]==r]
for h in range(1,len(a)+1):
 for i in j.combinations(a,h):
  s,i,l,m=0,sorted(i,key=lambda k:int(k[1])),-1,len(i)
  for n in i:
   s=(s,1)[p[1]<n[2]or p[2]<n[1]]
   if r==n[0]or n[1]<l:
    m=-1
    break
   else:
    l=n[2]
  if s*m>g:
   g,f=m,i
for o in f:
 print o[0]

สร้างชุดค่าผสมที่เป็นไปได้ทั้งหมดและตรวจสอบแต่ละชุด

ทดสอบ

การป้อนข้อมูล: ["NSCC",110,115,"A",100,120,"B",120,140,"C",105,135,"D",100,105,"E",135,500]

เอาท์พุท:

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