বিমূর্ত গেমের জন্য অনুকূল কৌশল


12

একটি সাক্ষাত্কারে আমাকে নীচের সমস্যাটি দেওয়া হয়েছে (যে আমি ইতিমধ্যে সমাধান করতে ব্যর্থ হয়েছি, আমার অতীতকে ঠকানোর চেষ্টা করছি না): গেমটি ইতিবাচক পূর্ণসংখ্যার নম্বর দিয়ে শুরু হয় । (উদাঃ ) এই সংখ্যাটি বাইনারি উপস্থাপনায় রূপান্তরিত হয়, এবং হ'ল বিটের সংখ্যা সেট হয় । (উদাঃ , )A0A0=1234N1A0=b100 1101 0010N=5.

প্লেয়ার 1 একটি সংখ্যা পছন্দ চেয়ে ক্ষুদ্রতর । অবশ্যই একটি বিট সেট করা উচিত ১। (উদাঃ ) আসুন । (উদাঃ ) যদি পূর্ববর্তী সীমাবদ্ধতাগুলি পূরণ করে এবং 1 বিটের সংখ্যা এখনও এন এর সমান হয় তবে একটি পদক্ষেপ বৈধB0A0B0B0=b10 0000 0000=512A1=A0B0A1=1234512=722=b1011010010B0A1

প্লেয়ার 2 থেকে বৈধ বি 1 চয়ন করে অবিরত থাকে , তারপরে প্লেয়ার 1 2 থেকে চালিয়ে যায় এবং আরও অনেক কিছু। কোনও প্লেয়ার হেরে যদি তাদের বৈধ পদক্ষেপ না থাকে।A1B1A2

উভয় খেলোয়াড়ই অনুকূল খেলছেন তা ধরে নিয়ে, যুক্তিযুক্ত দক্ষ পদ্ধতি ব্যবহার করে বিজয়ী খেলোয়াড় নির্ধারণ করুন। (আমার সমস্যার সংজ্ঞা অনুসারে, এগুলির সীমাবদ্ধতাগুলি হ'ল প্রোগ্রামটি কয়েক মিলিয়ন ইনপুট সংখ্যার জন্য একটি সমাধান সরবরাহ করতে সক্ষম হবে যা স্বাক্ষরিত 32-বিট পূর্ণসংখ্যার সাথে মাপসই হয়)) অর্থাৎ সমাধানটি হওয়ার দরকার নেই is সম্পূর্ণ বিশ্লেষণাত্মক।


আমার ব্যক্তিগত আগ্রহ এখানে সন্ধান করছে যে আমার যে 120 মিনিট সময় দেওয়া হয়েছিল তাতে সঠিকভাবে কোনও প্রতিক্রিয়া না দিয়ে আমার সঠিক সমাধানটি খুঁজে পেয়েছে এবং বাস্তবায়িত করা যে প্রত্যাশা ছিল তা যথাযথ ছিল কিনা; বা যদি এটি অন্যতম হয় তবে "আসুন দেখুন তারা আগে এই ধাঁধাটি দেখেছেন কিনা"।

আমি ব্যর্থ হয়েছি কারণ আমি যুক্তিসঙ্গত কৌশল বলে মনে হয়েছিল তা বাস্তবায়ন করতে বেছে নিয়েছি, যা আমাকে সামনে রেখে দেওয়া হয়েছে এমন কয়েকটি পরীক্ষার ক্ষেত্রে সঠিক ফলাফল দিয়েছে, এই রানটি দ্রুত তৈরি করতে খুব বেশি সময় নষ্ট করেছে এবং ভুল হাতে তুলে দিয়েছি আমার সময় শেষ হওয়ার সাথে সাথে পুরো আউটপুট।

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


বর্ণনা থেকে আমি বুঝতে পারি নি যে নির্বাচিত পদক্ষেপগুলির একটি বিট সেট 1 এ অবশ্যই স্থাপন করা উচিত (আমি মনে করি এটি উদাহরণের অংশ মাত্র)।
jjmontes

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

1
হতে পারে "প্লেয়ার 1 একটি 0 এর চেয়ে কম বেছে নেয় , যার অবশ্যই একটি বিট সেট করা আবশ্যক ?"? (সম্ভবত এটি কেবল আমিই ছিলাম, তবে এটি বাধা ছিল বুঝতে পেরে আমাকে @ জার্নাল উত্তরটি পড়তে হয়েছিল)। B0A0
jjmontes

@ উইড্রাক - ম্যান, আমি যদি জানতাম যে, বিটকাউন্টকে যুক্তিসঙ্গতভাবে রান চালাতে আমার সমস্ত প্রচেষ্টা ব্যর্থ হতে পারত না। এটি কেন কাজ করে তা ব্যাখ্যা করে একটি উত্তর দুর্দান্ত।
মিলিমুজ

@ মিলিমুজ বিটকাউন্ট বেশিরভাগ আধুনিক সিপিইউয়ের জন্য হার্ডওয়্যারে রয়েছে!
Veedrac

উত্তর:


21

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

1001

সুতরাং একটি গেমের একমাত্র নির্ধারণকারী ফ্যাক্টর হ'ল যে সমস্ত স্থানে ডানদিকে রয়েছে সেই রাজ্যে পৌঁছাতে কতগুলি অদলবদল লাগে এবং বিজয়ী বা হারাবার কৌশল নেই। অদলবদলের সংখ্যার সমতা হ'ল একমাত্র নির্ধারক উপাদান।

1

i1101kki

i = 0
k = 0
total = 0
while n > 0:
    if n & 1:
       total += k - i
       i += 1
    n >>= 1
    k += 1

totalO(logn)


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

এই সম্পর্কে চিন্তাভাবনা করে, কৌশলটি কোনও বিষয় নয় তার অর্থ আমার বাস্তবায়নে আমার বরং একটি অস্পষ্ট বাগ রয়েছে, অথবা এটি অন্য কোনও প্রয়োগের মতো একই ফলস্বরূপ হওয়া উচিত যা গেমটি সঠিকভাবে খেলছে…
মিলিমুজ

5

এই জাতীয় সমস্যা সমাধানের একটি উপায় নিম্নরূপ:

  • আপনার প্রস্তাবিত "মেমোজাইজড ব্রুট-ফোর্স" পদ্ধতির সাহায্যে কয়েকটি সাধারণ মানের জন্য সমাধানটি সন্ধান করুন।

  • উত্তরটি অনুমান করুন (কোন অবস্থানগুলি জিতেছে এবং কোনটি হারাচ্ছে)।

  • আপনার উত্তর প্রমাণ করার চেষ্টা করুন। আপনি সফল হলে, দুর্দান্ত। অন্যথায়, একটি পাল্টা নমুনা সন্ধান করার চেষ্টা করুন, এবং অন্য উত্তর অনুমান করতে এটি ব্যবহার করুন। এখানে আরও কয়েকটি মামলা সমাধান করা সহায়ক হতে পারে।

এটি কতটা সময় নেয় তা বলা সত্যিই শক্ত। যাইহোক, সাক্ষাত্কারে আপনি সমাধান সন্ধান করার জন্য অগত্যা আশা করা হয় না। বরং, সাক্ষাতকারীরা জানতে ইচ্ছে করে কেমন চান কাছে সমস্যা সমাধানের, এবং কি অগ্রগতি আপনি করতে দেয়।


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

মেমোয়াইজড ব্রুট ফোর্স পদ্ধতির সঠিক হতে হবে, যেহেতু এটি কৌশল সম্পর্কে কোনও শর্টকাট নেয় না। তবে এটি - আমিও বুঝতে পেরেছিলাম - অসহনীয়ভাবে ধীর হতে হবে এবং মেমোয়েজেশন সম্ভবত নিরীহ পরিমাণে স্মৃতি ব্যবহার না করে প্রচুর সাহায্যের জন্য খুব বেশি কাজ হতে পারে। বা নাও হতে পারে, আমি পরে এটি চেষ্টা করব এটি আমার সিস্টেম থেকে সরিয়ে দিতে।
মিলিমুজ

5

@ অরলপের উত্তর থেকে নোট করুন যে আমরা শুরু থেকে শেষের অবস্থানে স্থানচ্যুতির যোগফলের সমতা চাই। আসুন এটিকে বর্ননা দিন:

       9876543210
       9 76 4  1    (positions at start)
start: 1011010010
end:   0000011111
            43210   (positions at end)

সুতরাং আমরা চাই

  ((1 - 0) + (4 - 1) + (6 - 2) + (7 - 3) + (9 - 4)) & 1
= ((1 + 4 + 6 + 7 + 9) - (0 + 1 + 2 + 3 + 4)) & 1
= ((1 + 0 + 0 + 1 + 1) - (0 + 1 + 0 + 1 + 0)) & 1

প্রথম অংশটি বিজোড় অবস্থানগুলিতে বিটের সংখ্যার সামঞ্জস্যতা। আপনি সর্বাধিক স্বাক্ষরবিহীন পূর্ণসংখ্য গ্রহণ করে, 0 বি 11 দ্বারা ভাগ করে এবং উপেক্ষা করে এটি মাস্ক করতে পারেন।

= (bitcount(x & ~(UINT_MAX / 0b11)) ^ (0 + 1 + 0 + 1 + 0)) & 1

দ্বিতীয় অংশটি হ'ল বিটের অর্ধেক সংখ্যার সমতা x

= (bitcount(x & ~(UINT_MAX / 0b11)) ^ (bitcount(x) >> 1)) & 1

bitcountহয় হার্ডওয়ার popcntনির্দেশাবলী ব্যবহার করতে পারে, বা ম্যানুয়ালি প্রয়োগ করা যেতে পারে যে কেবলমাত্র শেষ বা দ্বিতীয় থেকে শেষ বিট প্রয়োজন হয়, এর মতো দ্রুত হ্রাস সহ ।

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