জাতীয় সময়সূচী বিবাদ চ্যাম্পিয়নশিপ


25

xkcd: নির্ধারিত বিরোধ

(আমি 1542 এর সময় এই পোস্টটি বোঝাতে চাইছিলাম: তফসিলের বিরোধটি এখনও বর্তমান এক্সকেসিডি ছিল, তবে আমার একটি সময়সূচী বিরোধ ছিল))

ইনপুট

ইনপুটটি 3nউপাদানগুলির একটি তালিকা হবে , যা nইভেন্টগুলি উপস্থাপন করে। 3 এর প্রতিটি গ্রুপের প্রথম উপাদানটি একটি ইভেন্টের নাম হবে; দ্বিতীয় এবং তৃতীয়, যথাক্রমে শুরু এবং শেষ সময়। উদাহরণ স্বরূপ:

foo 12 34 bar 56 78

foo"সময় 12" থেকে শুরু হওয়া একটি ইভেন্ট প্রতিনিধিত্ব করে (সময়গুলি কেবলমাত্র পূর্ণসংখ্যার দ্বারা উপস্থাপিত হয়; আপনি এগুলি মধ্যরাতের কয়েক মিনিট হিসাবে ভাবতে পারেন) এবং 34 এ শেষ হয় এবং একটি দ্বিতীয় ইভেন্ট barযা 56 at থেকে শুরু হয়ে at 78 এ শেষ হবে।

ইভেন্টের নামগুলি সর্বদা কেবলমাত্র বর্ণানুক্রমিক অক্ষরের সমন্বয়ে থাকে এবং সময়গুলি সর্বদা পূর্ণসংখ্যার হয় 0 এবং <1440। শেষ সময় সর্বদা শুরুর সময়ের চেয়ে কমপক্ষে 1 টি বেশি হবে greater এগুলি কোনওভাবেই বাছাইয়ের গ্যারান্টিযুক্ত নয়।

আপনি যদি চান, আপনি এটি একক স্থান দ্বারা পৃথক স্ট্রিং হিসাবে নিতে পারেন; অন্যথায় এটি একটি অ্যারে, তালিকা, ভেক্টর বা আপনার ভাষার সমতুল্য হিসাবে নেওয়া উচিত।

আউটপুট

আউটপুটটি ইভেন্টের নামের একটি স্থান-বিভাজিত তালিকা হওয়া উচিত। আউটপুট থেকে ইভেন্টের নামগুলির জন্য নীচের মত নিয়ম রয়েছে:

  • আপনার আউটপুট যে কোনও ইভেন্টই একে অপরের সাথে বিরোধিত হতে পারে না। উদাহরণস্বরূপ, ইনপুট সহ a 0 10 b 5 15, আপনি উভয়ই আউটপুট নাও পেতে পারেন aএবং bকারণ সময়গুলির বিরোধ (যা আংশিকভাবে ওভারল্যাপ হয়)। অন্য কোনও ইভেন্ট শুরু হওয়ার সাথে সাথে যদি কোনও ইভেন্ট ঠিক শেষ হয় তবে আপনি উভয়ই অন্তর্ভুক্ত করতে পারেন।

  • আপনি NSCC("জাতীয় সময়সূচী দ্বন্দ্ব প্রতিযোগিতা") নামক ইভেন্টটি আউটপুট নাও করতে পারেন , যার মধ্যে সর্বদা ইনপুটটিতে হুবহু একটি উপস্থিত থাকবে । আপনাকে অন্ততপক্ষে একটি ইভেন্টও আউটপুট করতে হবে যা দ্বন্দ্ব (আংশিকভাবে ওভারল্যাপ করে) এর সাথে NSCC(এবং সর্বদা সেগুলির মধ্যে কমপক্ষে একটিও থাকবে)।

  • উপরোক্ত দুটি নিয়ম অনুসরণ করার সময় আপনাকে অবশ্যই যথাসম্ভব ইভেন্টগুলি আউটপুট করতে হবে। (এটি যাতে আপনি যথাসম্ভব ব্যস্ত দেখায়, যাতে এনএসসিসি হারিয়ে যাওয়া আরও বিশ্বাসযোগ্য বলে মনে হয়))

এটি একক স্পেস-বিচ্ছিন্ন স্ট্রিং বা একটি অ্যারে, তালিকা, ভেক্টর ইত্যাদি হিসাবে আউটপুটও হতে পারে either

একাধিক সম্ভাব্য আউটপুট থাকতে পারে।

পরীক্ষার মামলা

উল্লেখ্য যে তালিকাভুক্ত ফলাফলগুলি কেবল উদাহরণ। আপনার কোডটি পৃথকভাবে কিছু আলাদা আউটপুট দিতে পারে, যতক্ষণ না এটি উপরের তিনটি বিধি অনুসরণ করে (উল্লেখযোগ্যভাবে, এর অর্থ উদাহরণ হিসাবে একই পরিমাণের ইভেন্টের অবশ্যই থাকতে হবে )।

ইন: 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 সেকেন্ডের মধ্যে শেষ করতে হবে (এটি স্যানিটি চেক বেশি, কারণ এটি সংযুক্ত সমস্ত পরীক্ষার ক্ষেত্রে খুব দ্রুত সম্পন্ন করা উচিত)।

  • এটি , তাই বাইটের মধ্যে সংক্ষিপ্ততম কোডটি জয়ী।


ইনপুটগুলিতে ইভেন্টের জন্য উট কেস ব্যবহার করা কি গ্রহণযোগ্য? উদাহরণস্বরূপ underwaterBasketWeavingConvention 50 800 nscc 550আপনার উদাহরণের পরিবর্তে ব্যবহার করছেন ?
ফ্যাটালাইজ করুন

4
@ ফ্যাটালাইজ আপনার নিশ্চিত অর্থ কী তা নিশ্চিত নয়; ইনপুটটি ঠিক যেমন প্রদর্শিত হবে তেমনভাবে দেওয়া হয়। আপনি আলফানম্বারিক অক্ষরের কোনও সংমিশ্রণকে সমর্থন করতে সক্ষম হওয়া উচিত।
ডুরকনব

4
আমাকে এর সমাধানের পরে কাজ করতে হবে; আমার এখনই শিডিংয়ের বিরোধ রয়েছে conflict
অ্যালেক্স এ

দ্বিতীয় উদাহরণে "কোডগল্ফিং" এবং "95" এর মধ্যে দুটি স্পেস রয়েছে - এটি কি ভুল, না কি আমাদের ইনপুটটিতে স্বেচ্ছাসেবী সংখ্যার জন্য অ্যাকাউন্ট করতে হবে? এই মুহূর্তে, আমি প্রাক্তনটি ধরে নিচ্ছি, যেহেতু আপনি ইনপুটটির ফর্ম্যাটটিতে কিছুটা হালকা মনে করছেন।
ভাইজরক্স

@ বিজয়রামমূর্তি হ্যাঁ, এটি। সংশোধন করা হয়েছে।
ডোরকনবব

উত্তর:


9

পাইথ, 45 বাইট

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

এই এক গল্ফ বেশ শক্ত ছিল। বেশ কয়েকটি 45 বাইট সমাধান পাওয়া গেছে, এটি সম্ভবত সবচেয়ে বহিরাগত একটি, যেহেতু এটি A(জোড়-বরাদ্দ) এবং .g(গ্রুপ-বাই) ব্যবহার করে।

এটি অনলাইনে ব্যবহার করে দেখুন: বিক্ষোভ বা পরীক্ষার জোতা

ব্যাখ্যা

                            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

এসডাব্লুআই-প্রোলগ, 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) একটি ইভেন্ট এ ইভেন্টগুলির তালিকার কোনও ইভেন্টের সাথে বিরোধী নয় তা পরীক্ষা করে
  • u(A,B)তালিকার এ-এর প্রতিটি ইভেন্টের তালিকা বিয়ের কোনও ঘটনার সাথে বিরোধী নয় তা যাচাই করে থাকে (কল করে এ তালিকায় কোনও বিরোধ নেই কিনা তা ব্যবহার করতেন u(A,A))
  • y(A,B,C) ট্রিপল্টের তালিকায় একটি তালিকা বিভক্ত করে (ইনপুটগুলিকে ইভেন্টের তালিকায় রূপান্তর করতে)
  • d(A) একটি তালিকায় ইভেন্টের নাম মুদ্রণ করে
  • l(A,R) তালিকাগুলির তালিকার অন্তর্ভুক্ত থাকা ইভেন্টগুলির দীর্ঘতম তালিকাটি মূল্যায়ন করে
  • v(A,NSCC,C,R) এ এর ইভেন্টগুলির প্রতিটি তালিকা সম্বলিত একটি তালিকা আর প্রদান করে যার কোনও অভ্যন্তরীণ বিরোধ নেই এবং ইভেন্ট এনএসসিসির সাথে এই বিরোধ রয়েছে
  • s(A,B) সত্য যদি বি এর উপসেট হয়
  • x(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]).

এটি আমার যা মনে হয়েছিল তার চেয়ে বেশি সময় নিয়েছে। এটি সম্ভবত উল্লেখযোগ্যভাবে আরও গল্ফ করা যেতে পারে। সংক্ষিপ্ত সমাধান পেতে আপনি সম্ভবত বিভিন্ন বাধা প্রোগ্রামিং লাইব্রেরি ব্যবহার করতে পারেন।

সম্পাদনা করুন: ট্রিপল্টের A:B:Cপরিবর্তে ব্যবহারের ধারণার জন্য @ অলিফন্টকে ধন্যবাদ [A,B,C]। 14 বাইট সাশ্রয় করে।

সম্পাদনা 2 : ভবিষ্যদ্বাণীটি use `t / 3` অব্যর্থহীন দেখানোর জন্য @ অলিফন্টকে আবার ধন্যবাদ। 55 বাইট সাশ্রয় করে

Edit3: 11 predicates উপর নির্ধারক দফা ব্যাকরণ ব্যবহার বাইট অর্জন yএবং d


প্রলগে প্রেমের উত্তর! সুন্দর.
প্লট করে

আমিও প্রোলোগ প্রেমিকা। পরামর্শসমূহ: ১. আমার মনে হয় আপনি ট্রিপলটির A/B/Cপরিবর্তে [A,B,C]10 টি বাইট সঞ্চয় করে ব্যবহার করতে পারেন ; 2. আপনি কি \+পরিবর্তে ব্যবহার করতে পারেন not? ৩. আপনি কেন চূড়ান্ত কাটতে হবে তা ব্যাখ্যা করতে পারেন x(A)?
অলিফন্ট - মনিকা

আমি আগামীকাল আমার ল্যাপটপ থেকে আপনার কাছে ফিরে আসব। ট্যাবলেটটি এখনই বিছানায় যা আনাড়ি টাইপিংয়ের জন্য করে তোলে এবং আমার সম্ভবত ঘুমানো উচিত। :-)
অলিফন্ট - মনিকা

1
এখানে একটি সংস্করণ যা 14 বাইট সংরক্ষণ করে। আমি আগেরটির ডান-অ্যাসোসিয়েটিভিটি থেকে উপকৃত হওয়ার :পরিবর্তে ব্যবহার করেছি /, যাতে আমি A:_শর্টহ্যান্ড লিখতে পারি A:_:_(তবে A+B/Cঠিক তেমন কাজ করে: আপনি তারপরে ব্যবহার করতে পারেন A+_)। যাইহোক, আপনার আসলটিতে আপনি [A|_]পরিবর্তে ব্যবহার করতে পারেন [A,_,_]। অবশেষে নোট করুন যে আমার এসডাব্লুআই-প্রোলগের সংস্করণটি নেই nth0/4, তাই আমি select/3পরিবর্তে ব্যবহার করেছি ।
অলিফন্ট - মনিকা

1
আমি আগে প্রয়োজন সম্পর্কে ভেবেছিলাম t(S,T)কিন্তু তারপর ভুলে গেছি। এখন পরীক্ষিত: আপনি কি এটিকে সম্পূর্ণরূপে ড্রপ এবং সরাসরি কল করে 55 আরো বাইট সংরক্ষণ করতে পারবেন s(E,L)থেকে setof/3
অলিফন্ট - মনিকা

6

জাভাস্ক্রিপ্ট ( ES6 ), 228

দ্বিতীয়বার চেষ্টা করুন, আমি আশা করি এটি কাজ করে।

আমার লক্ষ্য হ'ল ইভেন্টগুলির দীর্ঘতম ক্রম যা একটি সময় বিবাদযুক্ত, তবে ইভেন্ট এনএসসিসি সরানো হলে সময় সংঘর্ষ হয় না। সরানো এনএসসিসির সাথে এই পরিবর্তিত ক্রমটি আউটপুট অনুরোধ করা হয়েছে।

আমি দীর্ঘতম দিয়ে শুরু করে পরীক্ষার্থী সমাধানগুলির সারি পরীক্ষা করে একটি প্রস্থের প্রথম অনুসন্ধান ব্যবহার করি (প্রথমটি প্রাথমিক তালিকা)) একটি প্রার্থী সমাধান থেকে এন ঘটনা আমি গড়ে তোলা এবং সারিবদ্ধ এন একাধিক প্রার্থীর সমাধান, ঘটনা সরানোর এবং অন্যদের রাখা।

'যেমন আছে' সময় মত বিরোধ থাকলে প্রার্থীর সমাধান বৈধ। তবে এনএসসিসির ইভেন্ট ফিল্টার করা হলে কোনও বিরোধ নেই। দ্বন্দ্বগুলি পরীক্ষা করার জন্য আমি একটি উপ-ফাংশন কে ব্যবহার করি।

সম্ভবত আরও কিছু গল্ফ করা যেতে পারে ...

নীচে স্নিপেট চলমান পরীক্ষা করুন (শুধুমাত্র এক্সমা স্ক্রিপ্ট 6, কেবল ফায়ারফক্স)

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
আপনি যদি ফাংশনটি কল না করেন তবে প্রোগ্রামটি যদি কিছু না করে তবে আমি স্ট্যাক স্নিপেটের বিন্দুটি জানতে পারি?
বিটা ক্ষয়

1
@ বেটাডে: এডসি 65 সাধারণত স্নিপেটে চালিত পরীক্ষার কেস যুক্ত করে। মনে হচ্ছে তিনি শীঘ্রই এই উত্তরে ফিরে আসবেন, এমন সময় আমি অনুমান করি যে সে রান্নেবল জিনিস যুক্ত করবে। :)
অ্যালেক্স এ।

1
@ বেটাডেকে তাড়াহুড়া ছিল। এবং (আরও খারাপ এখনও) এটি পরীক্ষার একটিতে ব্যর্থ।
edc65

1

জাভা, 828 বাইট

সম্ভবত এখানে আরও সংক্ষিপ্ত জাভা বাস্তবায়ন রয়েছে, তবে এখানে আমার ছুরিকা:

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

সমস্ত ভেরিয়েবল এক জায়গায় ঘোষণা করা বাইট সংরক্ষণ করবে।
স্পিক্যাট্রিক্স

আপনার দরকার নেই else return
lirtosiast

0

পাইথন, 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]

আউটপুট:

ডি
সি
ই
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.