বারো-মুদ্রার সমস্যা


14

পটভূমি

বারো-কয়েন সমস্যাটি ক্লাসিক ব্যালেন্স ধাঁধা যা সাধারণত কাজের সাক্ষাত্কারে ব্যবহৃত হয়। ধাঁধাটি প্রথম 1945 সালে প্রকাশিত হয়েছিল এবং আমার পিতাকে আমার দাদার কাছে যখন তিনি আমার মাকে বিয়ে করতে বলেছিলেন তখন তিনি তা প্রকাশ করেছিলেন! ধাঁধাটিতে বারোটি মুদ্রা রয়েছে যার মধ্যে একটি হ'ল অন্যদের চেয়ে ভারী বা হালকা (আপনি জানেন না কোনটি)। সমস্যাটি হল একটি ব্যালেন্স স্কেলগুলি অনন্য মুদ্রা নির্ধারণের জন্য তিনবার ব্যবহার করা। কিছু বৈকল্পিকতায় মুদ্রাটি ভারী বা হালকা কিনা তা সনাক্ত করাও দরকার।

এখানে টাস্কটিতে এন কয়েনগুলির সাথে জড়িত সাধারণ সমস্যা সমাধান করা , সবচেয়ে খারাপ ক্ষেত্রে সবচেয়ে কম ওজন ব্যবহার করা সম্ভব। মুদ্রাটি ভারী বা হালকা কিনা কেবল এটি কোনটি তা সনাক্ত করার প্রয়োজন নেই। তদ্ব্যতীত, প্রদত্ত সেটটির বাইরে আপনার কোনও অতিরিক্ত কয়েনের অ্যাক্সেস নেই (যা কৌতূহলজনকভাবে একটি পার্থক্য করে)।

দেখা যাচ্ছে যে কে-ওজন (3 ^ কে -1) / 2 কয়েনের জন্য যথেষ্ট (তাই এই প্রকরণের 4 টি ওজন আসলে 13 মুদ্রা পরিচালনা করতে পারে)। তদ্ব্যতীত (এবং আশ্চর্যজনকভাবে), ভবিষ্যতের ওজন অতীত ফলাফলের উপর নির্ভরশীল না হয়ে আগাম ওজনের পুরো সেট নির্বাচন করা সম্ভব (তবে এখানে প্রয়োজনীয় নয়)। দুটি সম্ভাব্য সমাধানের বিবরণের জন্য, এই কাগজটি এবং এই কোওর উত্তরটি দেখুন

কার্য

কোনও ফাংশন বা প্রোগ্রাম লিখুন, STDIN, কমান্ড-লাইন আর্গুমেন্ট বা ফাংশন আর্গুমেন্টের মাধ্যমে ইনপুট হিসাবে একটি পূর্ণসংখ্যা n গ্রহণ করে , যা নিকৃষ্টতম ক্ষেত্রে সবচেয়ে কম ওজন ব্যবহার করে এন কয়েনগুলির জন্য সমস্যাটি সমাধান করে । প্রোগ্রামটি করা উচিত:

  • 1,2,3-4,5,6স্কেলের প্রতিটি পাশের মুদ্রার তালিকাগুলি সূচিত করতে ফর্ম্যাটটিতে ওজন STDOUT এ মুদ্রণ করুন । যে কোনও মুদ্রা ওজন হচ্ছে না তা উল্লেখ করা উচিত নয়। কয়েনগুলি স্পষ্টভাবে 1 থেকে n পর্যন্ত গণনা করা হয় এবং সংখ্যার ক্রমে মুদ্রণ করা দরকার না (সুতরাং 2,1-3,4যেমন হয় তেমন 1,2-3,4)।
  • প্রতিটি ওজন করার পরে প্রোগ্রামটির STDIN এর মাধ্যমে একটি ইনপুটটির জন্য অপেক্ষা করা উচিত, যা হওয়া উচিত <, =বা >, স্কেলটির বাম দিকটি হালকা, একই বা ডান পাশের চেয়ে ভারী কিনা তা নির্দেশ করে।
  • শেষ ওজনের ফলাফলের পরে, প্রোগ্রামটি অনন্য মুদ্রার নম্বর মুদ্রণ করে বা ফিরিয়ে আনবে।
  • প্রোগ্রামটির ব্যবহারকারীর কাছ থেকে অসম্পূর্ণ ফলাফলের ইনপুটগুলি হ্যান্ডেল করা উচিত নয়।
  • প্রোগ্রাম হ্যান্ডেল করার প্রয়োজন নেই এন 3 কম।

উদাহরণ আউটপুট

>> 3
1-2
>> =
1-3
>> <
3

# using Quora algorithm
>> 13
1,2,3,4-5,6,7,8
>> <
1,2,5-3,4,6
>> >
3-4
>> <
3

# using paper algorithm
>> 13
1,2,3,4-5,6,7,8
>> <
2,6,7,9-3,8,10,11
>> >
6,8,10,12-4,5,7,11
>> =
3

স্কোরিং

সংক্ষিপ্ততম কোড জিতেছে। স্ট্যান্ডার্ড বিধি প্রয়োগ।

উত্তর:


2

পাইথন 3: 497 বাইট

I=lambda a,b:input(",".join(a)+"-"+",".join(b)+"\n>> ")
def A(a,b):
 l,L=len(a),len(b)
 if l+L==1:return(a or b)[0]
 m=(2*l+1-L)//3;M=m+L-l;x,y,X,Y=a[:m],a[m:2*m],b[:M],b[M:2*M];r=I(x+X,y+Y);return A(a[2*m:],b[2*M:])if r=="="else A(x,Y)if r=="<"else A(y,X)
def B(a,n=[]):
 if len(a)==1:return a[0]
 m=len(n);l=(len(a)+1+m)//3;x,y,z=a[:l],a[l:2*l-m],a[2*l-m:];r=I(x,y+n);return B(z,a[:1])if r=="="else A(x+z[:1-m],y)if r=="<"else A(y+z[:1-m],x)
print(B(list(map(str,range(1,int(input("N= "))+1)))))

আমার সন্দেহ হয় এটি আরও কিছুটা সঙ্কুচিত হতে পারে তবে আমি আর কোনও স্পষ্ট জায়গা দেখতে পাচ্ছি না (প্রতিটি ফাংশনের প্রায় 5 টি আলাদা সংস্করণের পরে)।

কোডটি তিনটি ফাংশন ব্যবহার করে এই পৃষ্ঠা থেকে অ্যালগরিদমের কিছুটা পরিবর্তিত সংস্করণ প্রয়োগ করে। Iফাংশন আই (অপশন মুদ্রণ এবং ব্যবহারকারীর প্রতিক্রিয়া ফিরে) আছে। Aএবং Bফাংশন আলগোরিদিম প্রধান বাস্তবায়ন। Aদুটি তালিকাগুলি গ্রহণ করে যা আকারের সাথে এক উপাদানের দ্বারা পৃথক হয় (যদিও উভয় তালিকায় বৃহত্তর aহতে পারে ): একটি মুদ্রা স্বাভাবিকের চেয়ে হালকা হতে পারে বা একটি মুদ্রা bভারী হতে পারে। Bডাবল ডিউটি ​​করে এটি মুদ্রার একটি তালিকা নেয় aএবং বিকল্পভাবে একটি একক মুদ্রা সহ দ্বিতীয় তালিকা যা সঠিক ওজন হিসাবে পরিচিত। দৈর্ঘ্য-বৃত্তাকার আচরণ দুটি ক্ষেত্রেই আলাদা হওয়া দরকার, যার কারণে মাথা ব্যথার শেষ নেই।

দুটি অ্যালগরিদম ফাংশন kনিম্নোক্ত আকারের আকারের ইনপুটগুলিতে দেওয়া ওজনের মধ্যে অস্বাভাবিক ওজনযুক্ত মুদ্রাটি খুঁজে পেতে পারে:

  • A: 3^kমোট কয়েন, দুই তালিকায় বিভক্ত (3^k-1)/2এবং (3^k+1)/2
  • B: (3^k + 1)/2কয়েন যদি জ্ঞাত-ভাল মুদ্রা সরবরাহ করা হয়, (3^k - 1)/2 অন্যথায়।

প্রশ্ন এখানে নির্দিষ্ট করে যাকে জাহির যে আমরা শুরুতে কোনো পরিচিত-ভাল কয়েন না, তাই আমরা একটি সেট খারাপ মুদ্রা এটি সমাধান করতে পারে (3^k - 1)/2মধ্যে kweighings।

আমার কোডটি বোগাস ওজনের অনুরোধ করছে না বা যে ওজন মনে করা হয়েছিল তার চেয়ে বেশি ব্যবহার করছে না তা নিশ্চিত করার জন্য আমি এখানে একটি পরীক্ষার ফাংশন লিখেছি:

def test(n):
    global I
    orig_I = I
    try:
        for x in range(3,n+1):
            max_count = 0
            for y in range(x*2):
                count = 0
                def I(a, b):
                    assert len(a) == len(b), "{} not the same length as {}".format(a,b)
                    nonlocal count
                    count += 1
                    if y//2 in a: return "<"if y%2 else ">"
                    if y//2 in b: return ">"if y%2 else "<"
                    return "="
                assert B(list(range(x)))==y//2, "{} {} not found in size {}".format(['heavy','light'][y%2], y//2+1, x)
                if count > max_count:
                    max_count = count
            print(x, max_count)
    finally:
        I = orig_I

এটি মুদ্রা এবং খারাপ ওজনের প্রতিটি ভার (ভারী বা হালকা) এর সংমিশ্রনের সাথে পরীক্ষার পরে একটি নির্দিষ্ট সেটের জন্য সবচেয়ে ওজনের সবচেয়ে খারাপ সংখ্যার প্রিন্ট করে।

এখানে 125 টি পর্যন্ত সেটগুলির পরীক্ষার ফলাফল রয়েছে:

>>> test(150)
3 2
4 2
5 3
6 3
7 3
8 3
9 3
10 3
11 3
12 3
13 3
14 4
15 4
16 4
17 4
18 4
19 4
20 4
21 4
22 4
23 4
24 4
25 4
26 4
27 4
28 4
29 4
30 4
31 4
32 4
33 4
34 4
35 4
36 4
37 4
38 4
39 4
40 4
41 5
42 5
43 5
44 5
45 5
46 5
47 5
48 5
49 5
50 5
51 5
52 5
53 5
54 5
55 5
56 5
57 5
58 5
59 5
60 5
61 5
62 5
63 5
64 5
65 5
66 5
67 5
68 5
69 5
70 5
71 5
72 5
73 5
74 5
75 5
76 5
77 5
78 5
79 5
80 5
81 5
82 5
83 5
84 5
85 5
86 5
87 5
88 5
89 5
90 5
91 5
92 5
93 5
94 5
95 5
96 5
97 5
98 5
99 5
100 5
101 5
102 5
103 5
104 5
105 5
106 5
107 5
108 5
109 5
110 5
111 5
112 5
113 5
114 5
115 5
116 5
117 5
118 5
119 5
120 5
121 5
122 6
123 6
124 6
125 6

ব্রেকপয়েন্টগুলি ঠিক যেখানে আপনি আশা করতে চেয়েছিলেন, এর মধ্যে (3^k - 1)/2এবং (3^k + 1)/2

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