ব্রিজ এবং টর্চের সমস্যা


17

এই কোড গলফ ধাঁধা জন্য অনুপ্রেরণা সেতু এবং টর্চ সমস্যা , যা একটি সেতু শুরুতে মানুষ সব সময় অন্তত পরিমাণ এটা ক্রস আবশ্যক।

ক্যাচটি হল যে সর্বাধিক দু'জন লোক একবারে অতিক্রম করতে পারে, অন্যথায় সেতুটি তাদের ওজনের নিচে চূর্ণ হয়ে যায় এবং গোষ্ঠীর কেবলমাত্র একটি মশালই অ্যাক্সেস পায়, যা সেতুটি অতিক্রম করতে হবে।

পুরো ধাঁধার প্রতিটি ব্যক্তির একটি নির্দিষ্ট সময় থাকে যা তারা ব্রিজটি পেরিয়ে যায়। যদি দু'জন লোক এক সাথে অতিক্রম করে তবে এই জুটি ধীরতম ব্যক্তির মতো ধীরে চলে goes

এমন কোনও সংখ্যক লোক নেই যাঁকে অবশ্যই সেতুটি পার হতে হবে; আপনার সমাধান d এর যে কোনও মানের জন্য কাজ করতে হবে ।

এই সমস্যার জন্য আপনার স্ট্যান্ডার্ড ইনপুট ব্যবহার করার দরকার নেই, তবে সমস্যার ব্যাখ্যা দেওয়ার জন্য, আমি নীচের ইনপুট এবং আউটপুট ফর্ম্যাটটি ব্যাখ্যার জন্য ব্যবহার করব। প্রথম নম্বর, ডি , সেতুর শুরুতে লোকের সংখ্যা। তারপরে কোডটি ডি সংখ্যার জন্য স্ক্যান করবে , প্রত্যেকটি একজনের গতির প্রতিনিধিত্ব করবে।

পূর্বে বর্ণিত মানদণ্ডগুলি পূরণ করার সময়, ব্রিজের শুরু থেকে সেতুর শেষ পর্যন্ত প্রত্যেককে অতিক্রম করার জন্য কোড আউটপুট হ'ল সর্বনিম্ন সময় প্রয়োজন।

এখানে কিছু ইনপুট কেস এবং আউটপুট কেস এবং প্রথম ইনপুট কেসের ব্যাখ্যা। কোডের খুব কম সংখ্যক বাইটে সমস্যার সমাধান করতে এই তথ্য থেকে একটি অ্যালগরিদম অর্জন করা আপনার উপর নির্ভর করবে।

ইনপুট

4
1 2 5 8

আউটপুট

15

এই আউটপুট পৌঁছানোর জন্য, জনগণকে নিম্নলিখিত উপায়ে ক্রস করতে হবে।

A and B cross forward (2 minutes)
A returns (1 minute)
C and D cross forward (8 minutes)
B returns (2 minutes)
A and B cross forward (2 minutes)

আপনার পথে আপনাকে গাইড করার জন্য এখানে আরও একটি পরীক্ষার কেস।

ইনপুট

5
3 1 6 8 12

আউটপুট

29

নিয়মাবলী:

  1. অনুমান করুন যে ইনপুটটি বাছাই করা হবে না এবং আপনার নিজেরও এটি করতে হবে (যদি আপনার প্রয়োজন হয়)
  2. ধাঁধার লোকের সংখ্যা 4 (এন> = 1) এ স্থির নয়
  3. প্রতিটি গ্রুপ এবং পৃথক ক্রসিংয়ের অবশ্যই একটি টর্চ থাকতে হবে। একটি মাত্র টর্চ আছে।
  4. প্রতিটি গ্রুপে সর্বাধিক মাত্র ২ জন লোক থাকতে হবে!
  5. না, আপনি ব্রিজ থেকে লাফিয়ে অন্য দিকে সাঁতার নাও থাকতে পারেন। এর মতো আর কোন কৌশল নয়;)।

নীচে xnor দ্বারা পাওয়া গেছে, নিশ্চিত ক্ষেত্রে পরীক্ষা করুন 1 3 4 5, যা 14 না 15 ফিরে আসা উচিত।
খুশি

1 4 5 6 7একই সমস্যা আছে। 25 বনাম 26
শার্লক 9

1
এটি একটি বিজোড় প্রশ্নের মতো মনে হচ্ছে, তবে ধাঁধাটির সর্বনিম্ন এবং সর্বাধিক সংখ্যক লোক কী? আমার সমাধানগুলিতে কাজ করার সময়, আমি লক্ষ্য করেছি যে তারা কেবলমাত্র N >= 2লোকদের পরিচালনা করে (অর্থাত্ "বিস্ময়করভাবে যথেষ্ট যে এটি" 1 ব্যক্তির ক্রস করা প্রয়োজন "এর তুচ্ছ ঘটনা হ্যান্ডেল করার জন্য অতিরিক্ত কাজ), সুতরাং এই বিষয়টির কিছু স্পষ্টতা দুর্দান্ত হবে। আগাম ধন্যবাদ.
শার্লক 9

@ শারলক 9 ধরে নিন আপনার সমাধানটি অবশ্যই এন> = 1
বেসমান 101

পরীক্ষার কেসগুলি দেখায় যে আমরা পরামিতি হিসাবে দৈর্ঘ্যটি ব্যবহার করতে পারি, তবে আপনি কি নিয়মগুলিতে আরও স্পষ্ট করতে পারেন? ইনপুটটি কি বারের বিন্যাস এবং লোক সংখ্যা হিসাবে অনুমোদিত, বা কেবলমাত্র বারের জন্য অনুমোদিত?
শার্লক 9

উত্তর:


8

পাইথন 3, 100 99 বাইট

একটি পুনরাবৃত্তি সমাধান

f=lambda s:s[0]+s[-1]+min(2*s[1],s[0]+s[-2])+f(s[:-2])if s.sort()or 3<len(s)else sum(s[len(s)==2:])

এই কাগজটির জন্য @ এক্সনরকে ধন্যবাদ

@ লিরিটোসিয়াসট 2 বাইট সংরক্ষণের জন্য ধন্যবাদ, @ মোভাত্তিকা 1 বাইট সংরক্ষণ এবং @ প্রশংসা করে যে আমার আগের সমাধানটি কাজ করে না তাতে

ল্যাম্বদা ফাংশনটিতে কিছু মূল্যায়নের জন্য নিম্নলিখিত কৌশলটি ব্যবহার করুন s.sort() or s এখানে আমরা সকারটি গণনা করি এবং পরীক্ষার ফলাফলটি ফিরিয়ে দিইs.sort()or len(s)>3

Ungolfed

def f(s):
    s.sort()                                   # sort input in place
    if len(s)>3:                               # loop until len(s) < 3
        a = s[0]+s[-1]+min(2*s[1],s[0]+s[-2])  # minimum time according to xnor paper
        return  a + f(s[:-2])                  # recursion on remaining people
    else:
        return sum(s[len(s)==2:])              # add last times when len(s) < 3

ফলাফল

>>> f([3, 1, 6, 8, 12])
29
>>> f([1, 2, 5, 8])
15
>>> f([5])
5
>>> f([1])
1
>>> f([1, 3, 4, 5])
14

আপনি 1 বাইট সংরক্ষণ করতে এবং এতে পরিবর্তন len(s)==2করতে পারেনlen(s)<3
মিস্টার পাবলিক

@ মিঃ প্রজাতন্ত্র আপনি একটি বাগ খুঁজে পেয়েছেন, আমি সমাধানটি পরিবর্তিত করেছি এটি বাগের সাথে s[0]*(len(s)==2)নয় কেন আমরা ধন্যবাদ দ্বারা প্রতিস্থাপন করতে পারি না(s[0]*len(s)==2) f([1]) -> 0<3
এরওয়ান

এই কাগজটিতে সর্বোত্তম সময়ের জন্য একটি অভিব্যক্তি রয়েছে যা একাধিক সম্ভাবনার ন্যূনতম। আপনি কি নিশ্চিত যে আপনার সমাধানটি সব ক্ষেত্রেই অনুকূল?
xnor

@ এক্সনো বাহ মনে হচ্ছে লেমমা 3A5:22
এরওয়ান

1
আপনি প্রস্তাবনার @movatica আপডেট
Erwan

4

পাইথন 2, 119 114 112 119 110 100 95 বাইট

আমার উত্তরগুলি আলাদা করার জন্য আমাকে পরামর্শ দেওয়া হয়েছে।

Theorem 1, A2:09 লিঙ্কযুক্ত এই কাগজটি ব্যবহারের একটি সমাধান । কাগজটি উদ্ধৃত করতে (এটি শূন্য-সূচকে পরিবর্তন করা):The difference between C_{k-1} and C_k is 2*t_1 - t_0 - t_{N-2k}.

lambda n,t:t.sort()or(n-3)*t[0]*(n>1)+sum(t)+sum(min(0,2*t[1]-t[0]-t[~k*2])for k in range(n/2))

Ungolfing:

def b(n, t): # using length as an argument
    t.sort()
    z = sum(t) + (n-3) * t[0] * (n>1) # just sum(t) == t[0] if len(t) == 1
    for k in range(n/2):
        z += min(0, 2*t[1] - t[0] - t[-(k+1)*2]) # ~k == -(k+1)
    return z

আপনি কি নিশ্চিত যে আমরা ধরে নিতে পারি যে দৈর্ঘ্যটি একটি আর্গুমেন্ট হতে পারে?
এরওয়ান

@ এরওয়ান উদাহরণ পরীক্ষার ক্ষেত্রে এটির অনুমতি রয়েছে বলে মনে হয়। আমি জিজ্ঞাসা করব
শার্লক 9

2

রুবি, 94 133 97 96 101 96 99 বাইট

আমার উত্তরগুলি আলাদা করার জন্য আমাকে পরামর্শ দেওয়া হয়েছে।

এই একটি সমাধান অ্যালগরিদম বর্ণিত ভিত্তিতে A6:06-10এর সেতু এবং টর্চ সমস্যা এই কাগজ

সম্পাদনা: একটি বাগ স্থির করা a=s[0]হচ্ছে যেখানে এখনও সংজ্ঞায়িত হয়নি যখন aশেষে বলা হয় s.size <= 3

->s{r=0;(a,b,*c,d,e=s;r+=a+e+[b*2,a+d].min;*s,y,z=s)while s.sort![3];r+s.reduce(:+)-~s.size%2*s[0]}

Ungolfing:

def g(s)
  r = 0
  while s.sort![3]      # while s.size > 3
    a, b, *c, d, e = s  # lots of array unpacking here
    r += a + e + [b*2, a+d].min
    *s, y, z = s        # same as s=s[:-2] in Python, but using array unpacking
  end
  # returns the correct result if s.size is in [1,2,3]
  return r + s.reduce(:+) - (s.size+1)%2 * s[0]
end

1

স্কালা, 113 135 (darit)

def f(a:Seq[Int]):Int={val(s,b)=a.size->a.sorted;if(s<4)a.sum-(s+1)%2*b(0)else b(0)+Math.min(2*b(1),b(0)+b(s-2))+b(s-1)+f(b.take(s-2))}

কিছুটা অবহেলিত:

def f(a:Seq[Int]):Int = {
    val(s,b)=a.size->a.sorted      // Sort and size
    if (s<4) a.sum-(s+1)%2*b(0)    // Send the rest for cases 1-3
    else Math.min(b(0)+2*b(1)+b(s-1),2*b(0)+b(s-2)+b(s-1)) + // Yeah.
        f(b.take(s-2))             // Repeat w/o 2 worst
}

পরীক্ষক:

val tests = Seq(Seq(9)->9, Seq(1,2,5,8)->15, Seq(1,3,4,5)->14, Seq(3,1,6,8,12)->29, Seq(1,5,1,1)->9, Seq(1,2,3,4,5,6)->22, Seq(1,2,3)->6, Seq(1,2,3,4,5,6,7)->28)
println("Failures: " + tests.filterNot(t=>f(t._1)==t._2).map(t=>t._1.toString + " returns " + f(t._1) + " not " + t._2).mkString(", "))

সাধারণভাবে দুর্দান্ত নয় তবে দৃ strongly়ভাবে টাইপিত ভাষার জন্য খারাপ নাও হতে পারে। আমার কাছে ধরা পড়েনি এমন একটি মামলার সন্ধানের জন্য xnor কে ধন্যবাদ জানাতে।


এই কাগজটিতে সর্বোত্তম সময়ের জন্য একটি অভিব্যক্তি রয়েছে যা একাধিক সম্ভাবনার ন্যূনতম। আপনি কি নিশ্চিত যে আপনার সমাধানটি সব ক্ষেত্রেই অনুকূল?
xnor

1

রুবি, 104 95 93 বাইট

আমার উত্তরগুলি আলাদা করার জন্য আমাকে পরামর্শ দেওয়া হয়েছে।

এই একটি সমাধান ভিত্তিতে আমার পাইথন 2 সমাধান এবং Theorem 1, A2:09এর সেতু এবং টর্চ সমস্যা এই কাগজ

->n,t{z=t.sort!.reduce(:+)+t[0]*(n>1?n-3:0);(n/2).times{|k|z+=[0,2*t[1]-t[0]-t[~k*2]].min};z}

Ungolfing:

def b(n, t) # using length as an argument
  z = t.sort!.reduce(:+) + t[0] * (n>1 ? n-3 : 0)
  (n/2).times do each |k|
    a = t[1]*2 - t[0] - t[-(k+1)*2] # ~k == -(k+1)
    z += [0, a].min
  end
  return z
end
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.