প্রত্যাখ্যান করার একটি ভাল সময়


16

সেটআপ

ধরুন আপনাকে 1 ≤ n ≤ 5 দিয়ে এন ফিউজ দেওয়া হয়েছে যার প্রতিটি মিটার লম্বা এবং যেখানে প্রতিটি ফিউজের সাথে প্রতি ঘন্টার ডি মিটার এন মিটারের বার্ন রেট রয়েছে ।

একটি ফিউজ এক বা উভয় প্রান্তে জ্বালানো যেতে পারে, পরবর্তীতে এক বা উভয় প্রান্তে নিভে যাওয়া, রিলিট, পুনরায় নির্বাচিত করা ইত্যাদি ইত্যাদি ফিউজ সম্পূর্ণরূপে গ্রাস না হওয়া পর্যন্ত যতবার প্রয়োজন হয় ততবার প্রয়োজন। আপনি তাত্ক্ষণিকভাবে ফিউজগুলি আলোকিত করতে এবং নিঃসরণ করতে সক্ষম হন এবং কোনও ফিউজ পুরোপুরি গ্রাস হয়ে যায় (জ্বলিয়ে যায়) আপনি ঠিক তাত্ক্ষণিকভাবে পর্যবেক্ষণ করতে পারেন।

একটি ফিউজ কাটা যাবে না এবং এটি এর প্রান্ত ছাড়া অন্য কোথাও জ্বালানো যাবে না।

এই জাতীয় সেটআপ কোনও দুটি ফিউজ আলো / গ্রাহক ইভেন্টের মধ্যে সময় পরিমাপ করে একটি অসীম নির্ভুল টাইমিং সিস্টেমের অনুমতি দেয়। উদাহরণস্বরূপ, প্রতি ঘন্টা 1 মিটার বার্ন হার সহ দুটি ফিউজ দেওয়া, আপনি ঠিক 45 মিনিট (3/4 ঘন্টা) দ্বারা পরিমাপ করতে পারেন

  1. একই সাথে: উভয় প্রান্তে প্রথম ফিউজটি আলোকিত করা, এক প্রান্তে দ্বিতীয় ফিউজ আলোকিত করা এবং আপনার সময়ের ব্যবধানের সূচনা চিহ্নিতকরণ
  2. তাত্ক্ষণিকভাবে দ্বিতীয় ফিউজের দ্বিতীয় প্রান্তে আলোকপাত করা প্রথম ফিউজটি গ্রাস করা হয় (30 মিনিট পরে)
  3. তাত্ক্ষণিক সময়ে আপনার সময়ের ব্যবধানের শেষ চিহ্নিত করে দ্বিতীয় ফিউজটি খাওয়া হয় (15 মিনিট পরে)

চ্যালেঞ্জ

একটি ঘন্টার সংখ্যক টি , এবং এন ফিউজের সঠিক বার্ন হারকে উপস্থাপন করে এন ভগ্নাংশের একটি সেট দেওয়া , এমন একটি প্রোগ্রাম বা ফাংশন লিখুন যাতে ফলাফলগুলি ফিউজগুলি নিয়মিত জ্বালিয়ে দেওয়ার জন্য যদি টি ঘন্টা যথাযথভাবে পরিমাপ করা যায় তবে একটি সত্যবাদী মান প্রদান করে / মিথ্যা মান অন্যথায়।

প্রোগ্রামের ইনপুট নিম্নলিখিত যে কোনও একটি হতে পারে:

  • ফর্মের কমান্ড-লাইন আর্গুমেন্ট TN/TD N1/D1 N2/D2 N3/D3 ...
  • ফর্মের একটি স্ট্রিং TN/TD N1/D1 N2/D2 N3/D3 ...পড়া stdinবা সমতুল্য
  • ফর্ম একটি স্ট্রিং TN/TD N1/D1 N2/D2 N3/D3 ...একটি ফাংশন আর্গুমেন্ট হিসাবে পাস
  • স্ট্রিংগুলির একটি অ্যারে ["TN/TD", "N1/D1", "N2/D2", "N3/D3", ...]একটি ফাংশন আর্গুমেন্ট হিসাবে পাস করেছে

সমস্ত ক্ষেত্রে t = TN/ TD, কোথায় TN, TD∈ [1,10000]।

একইভাবে, সব ক্ষেত্রেই: ফিউজ হার বার্ন আমি = এন আমি / ডি আমি = N<i>/ D<i>, যেখানে N<i>, D<i>∈ [1,10] ∀ আমি

আপনি ধরে নিতে পারেন যে সর্বদা 1 থেকে 5 ফিউজ (সমেত) এর মধ্যে থাকবে এবং সমস্ত ইনপুট বৈধ এবং ইন-রেঞ্জের। আপনি ধরে নিতে পারেন যে সমস্ত ইনপুট ভগ্নাংশটি সর্বনিম্ন শর্তে দেওয়া হয়েছে।

আপনি এই চ্যালেঞ্জের জন্য ভগ্নাংশ উপাদান সহ ভাসমান পয়েন্ট নম্বর ব্যবহার করতে পারবেন না। এটি হ'ল যদি আপনি আপনার প্রয়োগের যে কোনও জায়গায় ভাসমান পয়েন্ট নম্বর ব্যবহার করেন তবে সেগুলি কেবল শূন্য ভগ্নাংশ উপাদান সহ অবিচ্ছেদ্য মানগুলি গ্রহণ করতে পারে।

স্কোরিং

এটি একটি চ্যালেঞ্জ, সুতরাং বাইটের মধ্যে সংক্ষিপ্ততম অনুগত জমাটি জয়কে ভূষিত করা হবে।


উদাহরণ ইনপুট / আউটপুট

input:  29/6 3/2 2/3 3/5 3/7 7/5
output: true

One solution:
  - light both ends of fuse 1, mark start of interval
  - on fuse 1 consumption: light both ends of fuse 2, light one end of fuse 5
  - on fuse 5 consumption: extinguish one end of fuse 2, light both ends of fuse 3,
    light both ends of fuse 4
  - on fuse 2 consumption: extinguish one end of fuse 3, extinguish both ends of
    fuse 4
  - on fuse 3 consumption: relight one end of fuse 4
  - on consumption of fuse 4: mark end of interval (29/6 hours)

input:  2/1 3/1 5/1 7/1
output: false

input:  5/1 6/1 1/6 9/1 1/9
output: true

One solution:
  - light fuse 1 at one end, light fuse 2 at both ends, light fuse 4 at both ends
  - on fuse 1 consumption: extinguish one end of fuse 2, mark start of interval
  - on fuse 4 consumption: relight one end of fuse 2
  - on fuse 2 consumption: mark end of interval (5 hours)

হ্যাপি ফিউজিং! :)


@ মার্টিনবাটনার আমি অনুমান করব এটি ভাসমান পয়েন্ট সংখ্যা বিধিনিষেধ হবে।
hmatt1

2
@ মার্টিনবাটনার আমি সম্মত হলাম এটি উত্স কোডে কোনও বিধিনিষেধ নয়। আমি মনে করি না [সীমাবদ্ধ উত্স] বর্তমানে এই প্রশ্নটি যেমন দাঁড়িয়েছে তেমন ফিট করে।
hmatt1

@ চিলিমাজিক: আমি ভাসমান পয়েন্ট যুক্তি ব্যবহার করা যায়নি সেদিকে দৃষ্টি আকর্ষণ করতে চেয়েছিলাম, তবে যদি sensকমত্য হয় যে এটি ট্যাগটির যথাযথ ব্যবহার নয়, তবে আমি তা ছিনিয়ে নেব।
COTO

পরীক্ষার বিষয় অত্যন্ত বড় :) হয়
feersum

5
লোল, আমি গল্ফিংয়ের উদ্দেশ্যে একটি ও ((এন!) ^ 3) অ্যালগরিদম ব্যবহার করছি।
ফেয়ারসাম

উত্তর:


8

পাইথন 2, 305

এটি গল্ফ সংস্করণ। এটি n> 3 এর জন্য ব্যবহারিকভাবে অযোগ্য , কারণ সময় (এবং স্থান) জটিলতা 3 এন 2 এর মতো ... আসলে এটি সময়ের জন্য খুব কম হতে পারে। যাইহোক, ফাংশন স্ট্রিংগুলির একটি তালিকা গ্রহণ করে।

def f(i):
 Z=range;r=map(__import__('fractions').Fraction,i);R=r[1:];n=len(R);L=[[[1]*n,[0]]];g=0
 for m,p in L: 
  for d in([v/3**i%3for i in Z(n)]for v in Z(3**n)):
    try:x=min(m[i]/R[i]/d[i]for i in Z(n)if m[i]*d[i]>0);L+=[[[m[i]-x*R[i]*d[i]for i in Z(n)],[p[0]+x]+p]]
    except:g|=p[0]-r[0]in p
 return g

কিছুটা অপ্টিমাইজড সংস্করণ কয়েক মিনিটের মধ্যে পরীক্ষার কেসগুলি শেষ করতে পারে। যদিও এটি একটি অসাধ্য n = 5 কেসের জন্য এখনও ধীর হতে পারে ।

def fLessslow(i):
 Z=range
 r=map(__import__('fractions').Fraction,i)
 R=r[1:]
 n=len(R)
 L=[((1,)*n,(0,))]
 ls = set(L)
 for m,p in L: 
  if p[0]-r[0]in p: return 1
  for d in([v/3**i%3 for i in Z(n)]for v in Z(3**n)):
   if any(d[i] and m[i]<=0 for i in Z(n)):continue
   try:
    x=min(m[i]/R[i]/d[i]for i in Z(n)if m[i]*d[i]>0)
    thing = (tuple(m[i]-x*R[i]*d[i]for i in Z(n)),(p[0]+x,)+p)
    if thing not in ls:L+=[thing];ls.add(thing)
   except:5
 return 0

print fLessslow('5/1 6/1 1/6 9/1 1/9'.split())
print fLessslow('29/6 3/2 2/3 3/5 3/7 7/5'.split())

1
সুন্দর, একটি বগি কোডের জন্য 8 টি আপভোটস: বর্ণনাটিতে উদাহরণ সহ ফাংশনটি ডাকছে: মুদ্রণ চ ('3/4 1/1 1 / 1'.split ()) 0 প্রদান করে, যদিও বর্ণনায় বলা হয়েছে, এটি দ্রবণযোগ্য ।
জাকুবে

@ জাকুব পরীক্ষার জন্য ধন্যবাদ ... এটি এই সাইটে খুব বিরল! এটি এখন স্থির; দড়িটির কত প্রান্ত জ্বলন্ত তার উপর নির্ভর করে আমি 1 বা 2 এর গুণক দ্বারা ভাগ করতে এক জায়গায় ভুলে গিয়েছিলাম।
feersum

3

পাইথন 2, 331

এটি ফেয়ারসামের সংস্করণ থেকে কিছুটা দীর্ঘ, তবে এটি আরও দ্রুত। সমস্ত পরীক্ষাগুলি একসাথে আমার ল্যাপটপে প্রায় 3 সেকেন্ড সময় নেয়। N = 5 এর জন্য একটি সম্পূর্ণ অনুসন্ধানে 10 মিনিটের জন্য আনুমানিক সময় লাগে। কিছু কোড ফেয়ারসামের সংস্করণের অনুরূপ, তবে আমি ইচ্ছাকৃতভাবে কোনও কোড অনুলিপি করিনি।

from fractions import*
f=Fraction
r=range
g=lambda x:h(f(x[0]),[1/f(i)for i in x[1:]],[])
def h(t,x,y):
 for i in r(1,3**len(x)):
  c=[[],[],[]]
  for j in r(len(x)):c[i/3**j%3]+=[x[j]]
  n,b,w=c
  m=min(b+[i/2 for i in w])
  if h(t,[i for i in n+[j-m for j in b]+[j-2*m for j in w]if i],[i+m for i in y]+[m]):return True
 return t in y

ব্যবহার:

print g('3/4 1/1 1/1'.split())
print g('29/6 3/2 2/3 3/5 3/7 7/5'.split())
print g('2/1 3/1 5/1 7/1'.split())
print g('5/1 6/1 1/6 9/1 1/9'.split())

ব্যাখ্যা:

ল্যাম্বডা এক্সপ্রেশন জি ইনপুটটির কিছুটা প্রাকপ্রসেসিং করে, যেমন স্ট্রিংগুলিকে ভগ্নাংশে রূপান্তর করা, বার্ন হার থেকে লক্ষ্য সময়কে পৃথক করে এবং বার্নের সময়গুলি গণনা করা (= 1 / বার্ন রেট)।

ফাংশন এইচ সমস্ত বার বার এক্স 3 সেট এন, বি এবং ডাব্লু (এন নন বার্নিংয়ের জন্য দাঁড়ায়, বি ওয়ান_ডেন বার্নিংয়ের জন্য, এবং ডাব্লু উভয়_দ্বন্দ্বী_ বার্নিংয়ের জন্য) বিভক্ত করে। এটি সেই সমস্ত ব্যবস্থার উপরে পুনরাবৃত্তি করে (বিন্যাস ব্যতীত এন = এক্স, বি = [], ডাব্লু = []), সংক্ষিপ্ত বার্ন রেট (এমতে সময় সাশ্রয়) সহ ফিউজ নির্ধারণ করে এবং আপডেট বার্নের সময়গুলির সাথে পুনরাবৃত্তভাবে এইচ কল করে। Y এ আমি সমস্ত সম্ভাব্য সময়গুলি সংরক্ষণ করি যে কেউ ফিউজগুলি ব্যবহার করে পরিমাপ করতে পারে। পুনরাবৃত্তির কলটিতে এই মানগুলিও আপডেট হয়।

যত তাড়াতাড়ি আমি মানটি পেলাম এটি সত্যের সাথে আল কলগুলি বন্ধ করে দেয়।


4
আপনি অল্প বয়স্ক পাইথন প্রোগ্রামাররা আপনার সমস্ত অন্তর্নির্মিত ভগ্নাংশ এবং বড় পূর্ণসংখ্যার সাথে নষ্ট হয়ে গেছে। ফিরে যখন আমি যুবক ছিলাম, আমাদের যা কিছু ছিল সবই ছিল 1এবং 0যা আমাদের মনিটর ছাড়াই একটি কনসোলে একসাথে টাইপ করতে হয়েছিল। কখনও কখনও আমরা এস ছিল না 1
কোতো
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.