Kejuaraan Konflik Penjadwalan Nasional

25

xkcd: Konflik Penjadwalan

(Saya bermaksud memposting ini sementara 1542: Konflik Penjadwalan masih xkcd saat ini, tetapi saya memiliki konflik penjadwalan.)

Memasukkan

Input akan menjadi daftar 3nelemen, yang mewakili nacara. Elemen pertama dalam setiap kelompok 3 akan menjadi nama acara; yang kedua dan ketiga, waktu mulai dan berakhir. Sebagai contoh:

foo 12 34 bar 56 78

mewakili suatu peristiwa fooyang dimulai pada "waktu 12" (waktu diwakili hanya dengan bilangan bulat; Anda dapat menganggapnya sebagai menit lewat tengah malam) dan berakhir pada 34, dan acara kedua baryang dimulai pada 56 dan berakhir pada 78.

Nama-nama peristiwa akan selalu hanya terdiri dari karakter alfanumerik, dan waktu akan selalu menjadi bilangan bulat ≥ 0 dan <1440. Waktu akhir akan selalu setidaknya 1 lebih besar dari waktu mulai. Mereka tidak dijamin untuk disortir dengan cara apa pun.

Jika Anda mau, Anda bisa menganggap ini sebagai string yang dipisahkan oleh spasi; jika tidak, harus diambil sebagai array, daftar, vektor, atau setara bahasa Anda.

Keluaran

Outputnya harus berupa daftar nama acara yang dipisahkan oleh ruang. Aturan yang akan menampilkan nama acara adalah sebagai berikut:

  • Tak satu pun dari peristiwa yang Anda hasilkan dapat saling bertentangan. Misalnya, dengan input a 0 10 b 5 15, Anda mungkin tidak menampilkan keduanya adan bkarena konflik kali (yaitu tumpang tindih sebagian). Jika suatu acara berakhir persis seperti yang lain dimulai, Anda dapat memasukkan keduanya.

  • Anda tidak boleh menampilkan acara yang disebut NSCC("Kompetisi Konflik Penjadwalan Nasional"), yang akan selalu ada persis satu di input. Anda juga harus menampilkan setidaknya satu peristiwa yang bertentangan (sebagian tumpang tindih) dengan NSCC(dan akan selalu ada setidaknya satu di antaranya).

  • Anda harus menampilkan sebanyak mungkin peristiwa sambil mengikuti dua aturan di atas. (Ini agar Anda terlihat sesibuk mungkin, sehingga kehilangan NSCC tampaknya lebih kredibel.)

Ini juga dapat berupa output sebagai string yang dipisahkan oleh spasi atau array, daftar, vektor, dll.

Mungkin ada lebih dari satu kemungkinan hasil.

Uji kasus

Perhatikan bahwa output yang tercantum hanya contoh. Kode Anda dapat menampilkan sesuatu yang berbeda, selama masih mengikuti tiga aturan di atas (terutama, ini berarti harus ada jumlah peristiwa yang sama dengan contoh).

Masuk: UnderwaterBasketWeavingConvention 50 800 NSCC 500 550
Keluar:UnderwaterBasketWeavingConvention

Masuk: SconeEating 0 50 RegexSubbing 45 110 CodeGolfing 95 105 NSCC 100 200
Keluar:SconeEating CodeGolfing

Masuk: VelociraptorHunting 0 300 NerdSniping 200 500 SEChatting 400 700 DoorknobTurning 650 750 NSCC 725 775
Keluar:NerdSniping DoorknobTurning

Masuk: NSCC 110 115 A 100 120 B 120 140 C 105 135 D 100 105 E 135 500
Keluar:C D E

Masuk: A 800 900 NSCC 700 1000 B 650 750 C 950 1050 D 655 660 E 660 665 F 1030 1040 G 1040 1060
Keluar:A D E F G

Masuk: A 10 11 B 11 12 C 12 13 D 13 14 NSCC 15 1090 E 10 16
Keluar:E

Jangan ragu untuk menambahkan lebih banyak kasus uji dalam edit jika ada kasus tepi yang saya lewatkan.

Aturan

  • Kode Anda harus selesai dalam waktu 30 detik untuk semua kasus uji yang disediakan (ini lebih merupakan pemeriksaan kewarasan, karena mungkin harus menyelesaikan lebih cepat untuk semua kasus uji yang digabungkan) pada mesin pribadi yang masuk akal.

  • Ini adalah , jadi kode terpendek dalam byte menang.

Gagang pintu
sumber
Apakah diperbolehkan menggunakan camelCase untuk acara dalam input? misalnya menggunakan underwaterBasketWeavingConvention 50 800 nscc 550bukan contoh Anda?
Fatalkan
4
@Fatalize Tidak yakin apa yang Anda maksud; input diberikan persis seperti yang ditunjukkan. Anda harus dapat mendukung kombinasi karakter alfanumerik apa pun.
Gagang Pintu
4
Saya harus mengerjakan solusi untuk ini nanti; Saya memiliki konflik penjadwalan sekarang.
Alex A.
Dalam contoh kedua ada dua ruang antara "CodeGolfing" dan "95" - apakah ini sebuah kesalahan, atau apakah kita perlu memperhitungkan jumlah spasi yang berubah-ubah dalam input? Untuk saat ini, saya akan berasumsi yang pertama, karena Anda tampaknya sedikit toleran pada format input.
vijrox
@ VijayRamamurthy Ya, benar. Tetap.
Gagang Pintu

Jawaban:

9

Pyth, 45 byte

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

Yang ini cukup sulit untuk bermain golf. Ditemukan beberapa solusi 45 byte, yang ini mungkin yang paling eksotis, karena menggunakan A(pair-assign) dan .g(group-by).

Cobalah secara online: Demonstrasi atau Uji harness

Penjelasan

                            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
Jakube
sumber
13

SWI-Prolog, 537 524 516 502 447 436 byte

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,[]),!.

Penjelasan singkat tentang apa yang masing-masing predikat lakukan:

  • z(A,B) memeriksa bahwa suatu peristiwa A tidak bertentangan dengan acara apa pun dari daftar acara B
  • u(A,B)memeriksa bahwa setiap peristiwa dalam daftar A tidak bertentangan dengan peristiwa apa pun dalam daftar B (digunakan untuk memeriksa bahwa tidak ada konflik dalam daftar A dengan menelepon u(A,A))
  • y(A,B,C) membagi Daftar menjadi daftar kembar tiga (untuk mengubah input menjadi daftar acara)
  • d(A) mencetak nama-nama acara dalam daftar A
  • l(A,R) mengevaluasi daftar acara terlama R yang terdapat dalam daftar daftar A
  • v(A,NSCC,C,R) mengembalikan daftar R yang berisi setiap daftar acara di A yang tidak memiliki konflik internal dan konflik dengan NSCC acara
  • s(A,B) benar jika B adalah himpunan bagian dari A
  • x(A) predikat utama, A adalah input.

Uji kasus : jalankan test.di interpreter setelah memuat kode di atas dengan yang berikut ditambahkan setelah itu:

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

Ini menghabiskan waktu saya lebih lama dari yang saya kira. Ini mungkin bisa bermain golf lebih signifikan. Anda juga mungkin dapat menggunakan berbagai pustaka pemrograman kendala yang ada untuk mendapatkan solusi yang lebih pendek.

Sunting: Terima kasih kepada @Oliphaunt untuk gagasan menggunakan A:B:Calih-alih [A,B,C]untuk kembar tiga. Menghemat 14 byte

Sunting2: Sekali lagi terima kasih kepada @Oliphaunt karena menunjukkan bahwa predikat `` t / 3` tidak berguna. Menghemat 55 byte

Sunting3: Memperoleh 11 byte menggunakan tata bahasa klausa definitif pada predikat ydan d.

Fatalisasi
sumber
Jawaban cinta di Prolog! Bagus
pasang
Saya seorang pencinta Prolog juga. Saran: 1. Saya pikir Anda dapat menggunakan mis. A/B/CBukannya [A,B,C]untuk kembar tiga, menghemat 10 byte; 2. Bisakah Anda menggunakan \+bukan not? 3. Bisakah Anda menjelaskan mengapa Anda membutuhkan potongan terakhir x(A)?
Oliphaunt - mengembalikan Monica
Saya akan kembali kepada Anda besok, dari laptop saya. Sekarang di tempat tidur dengan tablet yang membuat untuk mengetik canggung dan saya mungkin harus tidur. :-)
Oliphaunt - mengembalikan Monica
1
Ini adalah versi yang menyimpan 14 byte. Saya menggunakan :alih-alih /mengambil manfaat dari asosiasi-kanan pembuat, yaitu agar saya dapat menulis A:_sebagai singkatan A:_:_(tetapi A+B/Cberfungsi dengan baik: Anda kemudian dapat menggunakan A+_). Ngomong-ngomong, juga dalam sumber asli Anda yang bisa Anda gunakan [A|_]sebagai ganti [A,_,_]. Catat akhirnya bahwa versi SWI-Prolog saya tidak punya nth0/4, jadi saya gunakan select/3saja.
Oliphaunt - mengembalikan Monica
1
Sebelumnya saya bertanya-tanya tentang perlunya t(S,T)tetapi kemudian lupa. Sekarang teruji: Anda dapat menyimpan 55 byte lebih banyak dengan menjatuhkannya seluruhnya dan langsung menelepon s(E,L)dari setof/3.
Oliphaunt - mengembalikan Monica
6

JavaScript ( ES6 ), 228

Percobaan kedua, saya harap yang ini berhasil.

Target saya adalah urutan kejadian terpanjang yang memiliki konflik waktu, tetapi tidak ada konflik waktu ketika acara NSCC dihapus. Urutan yang dimodifikasi ini dengan NSCC dihapus adalah output yang diminta.

Saya menggunakan Pencarian Pertama Breadth memeriksa antrian solusi kandidat, dimulai dengan terpanjang (yang pertama adalah daftar awal). Dari solusi calon n kejadian saya membangun dan enqueue n solusi calon lebih, menghapus salah satu peristiwa dan menjaga yang lain.

Solusi kandidat valid jika ada konflik waktu 'apa adanya', tetapi ketika acara NSCC disaring tidak ada konflik. Saya menggunakan subfungsi K untuk memeriksa konflik.

Mungkin bisa bermain golf sedikit lebih ...

Tes menjalankan cuplikan di bawah ini (menjadi EcmaScript 6, hanya 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>

edc65
sumber
3
Bolehkah saya menanyakan poin Stack Snippet jika program tidak melakukan apa-apa jika Anda tidak memanggil fungsinya?
Beta Decay
1
@BetaDecay: edc65 biasanya menambahkan test case yang berjalan di snippet. Kedengarannya dia akan segera kembali ke jawaban ini, di mana saya menganggap dia akan menambahkan hal-hal yang bisa dijalankan. :)
Alex A.
1
@BetaDecay terburu-buru. Dan (lebih buruk lagi) gagal salah satu tes.
edc65
1

Java, 828 byte

Mungkin ada implementasi Java yang lebih ringkas di luar sana, tapi inilah tikaman saya:

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"};}
vijrox
sumber
Mendeklarasikan semua variabel di satu tempat akan menghemat byte.
Spikatrix
Anda tidak perlu melakukannya else return.
lirtosiast
0

Python, 373 karakter

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]

Buat semua kombinasi yang mungkin dan periksa masing-masing.

Uji

Memasukkan: ["NSCC",110,115,"A",100,120,"B",120,140,"C",105,135,"D",100,105,"E",135,500]

Keluaran:

D
C
E
sudo rm -rf slash
sumber