মাস্টারমাইন্ড কৌশল


19

আমি কেবল মাস্টারমাইন্ডের জন্য কোড-গল্ফ চ্যালেঞ্জগুলি সন্ধান করতে পারি, সুতরাং এখানে একটি কোড-চ্যালেঞ্জ সংস্করণ রয়েছে যা আমি নিজেরাই নিতে পছন্দ করব।

সাধারণ মাস্টারমাইন্ড গেমের জন্য সর্বোত্তম কৌশল, এমএম (4,6), 1993 সালে কোয়ামা এবং লাই দ্বারা খুঁজে পেয়েছিল, গড় অনুমানের পরিমাণ = 5625/1296 ~ 4.34। এমএম (5,8) এখনও অমীমাংসিত, তবে অনুমান করা হয় যে গড় অনুমান ~ 5.5 of

আপনার কাজটি হ'ল একটি এমএম (5,8) কৌশল তৈরি করা, যা 5 টি গর্ত এবং 8 রঙের জন্য, সমস্ত pow(8,5) = 32768সম্ভাব্য স্বতন্ত্র সমাধানগুলি covering েকে রাখে। স্পষ্টতই, এটি সর্বোত্তম হতে হবে না। আপনার দুটি পছন্দ আছে:

  1. একটি কৌশল নির্ধারণকারী প্রোগ্রাম পোস্ট করুন যা কৌশল উত্পন্ন করে। প্রোগ্রামটি কোনও অতিরিক্ত নন-মুক্ত সফ্টওয়্যার ছাড়াই উইন্ডোজ 7, ​​ম্যাক ওএস এক্স বা লিনাক্সে সংকলনযোগ্য / চলমান হতে হবে।
  2. আপনার কৌশলটি (আপনার স্ট্যাক এক্সচেঞ্জের নাম সহ) কোথাও ইন্টারনেটে প্রকাশ করুন এবং URL টি এখানে পোস্ট করুন।

উভয় ক্ষেত্রে, উত্তরের শিরোনামে স্কোরটি (নীচে দেখুন) লিখুন।

কৌশলটি অবশ্যই নিম্নলিখিত ব্যাকরণ অনুযায়ী এনকোড করা উচিত:

strategy : guessing-strategy | known-solution-strategy
guessing-strategy : '{' guess ':' branches '}'
known-solution-strategy : guess
guess : color color color color color
color : 'A'..'H'
branches : '{' branch (',' branch)* '}'
branch : reply ':' strategy
reply : number-of-blacks number-of-whites
number-of-blacks : number-of-key-pegs
number-of-whites : number-of-key-pegs
number-of-key-pegs : '0'..'5'

কালো / সাদা কী পগের সংখ্যা নির্ধারণের জন্য ব্যবহৃত অ্যালগরিদমটি http://en.wikedia.org/wiki/Mastermind_(board_game এ বর্ণিত হয়েছে )

মনে রাখবেন যে উত্তর "50" (অর্থাত্ সঠিক অনুমান) বিহিত এবং ব্যাকরণের অংশ নয়।

স্কোরিং: এন = 32768 পাথ / সমাধানগুলির প্রত্যেকের জন্য অনুমানের সংখ্যার যোগফল। কৌশলটি সবচেয়ে কম এন জিতেছে। প্রথম টাই বিরতি: অনুমানের সর্বনিম্ন সর্বাধিক সংখ্যা। দ্বিতীয় টাই বিরতি: প্রথম পোস্ট উত্তর। প্রতিযোগিতাটি আগস্ট 1, 2014 0:00 GMT এ শেষ হয়


স্কোর = 21 সহ এমএম (2,3) এর জন্য কৌশলটির উদাহরণ:

{AB:{10:{AC:{10:AA,01:CB,00:BB}},02:BA,01:{BC:{01:CA}},00:CC}}

এই কৌশলটি ব্যবহার করে, 9 টি সম্ভাব্য গেমগুলি এভাবে চলবে:

  • এবি 20
  • এবি 10, এসি 20
  • এবি 10, এসি 10, এএ 20
  • এবি 10, এসি 01, সিবি 20
  • এবি 10, এসি 00, বিবি 20
  • এবি 02, বিএ 20
  • এবি 01, বিসি 20
  • এবি 01, বিসি 01, সিএ 20
  • এবি 00, সিসি 20

আপনার সুবিধার জন্য আমি শীঘ্রই একটি জাভা-ভিত্তিক এমএম (5,8) কৌশল যাচাইকারী পোস্ট করব।


এমএম (2,3) এর উদাহরণ কৌশলটি কীভাবে প্রয়োগ করা হয় তা বুঝতে আমার সমস্যা হচ্ছে। কৌশলটির ব্যাখ্যা দিয়ে আপনি কি কোনও নমুনা গেম পোস্ট করতে পারেন?

@ টোটোস আমি সমস্ত 9 যোগ করেছি :)
মিস্টারব্যাকেন্ড

আপনার ভেরিফায়ার যদি স্কোরও আউটপুট করতে পারে তবে দুর্দান্ত হবে!
চার্লস

@ চার্লস করবে!
মিঃব্যাকেন্ডে

2
একাধিক কী পেগ সংমিশ্রণগুলিতে একই প্রতিক্রিয়াটিকে মঞ্জুরি দেওয়ার জন্য আপনি কি আপনার ব্যাকরণ পরিবর্তন করতে ইচ্ছুক? পছন্দ {AB:{10|01:BB}}? আমার একটি উত্তর আছে, তবে এটি বেশ নির্বোধ এবং ব্যাকরণের গাছের কাঠামোর কারণে এটি মোটেও ভাল স্কেল করে না (4 গর্ত, 3 বর্ণ, একটি 147MB কৌশল উত্পন্ন করে, যা আমি কিছু অংশগুলি একত্রিত করে উল্লেখযোগ্যভাবে কাটাতে পারি গাছটি).
মার্টিন ইন্ডার

উত্তর:


6

জাভা

এমএম (5,8) এর জন্য আমার অ্যালগরিদম 177902 178006 182798 182697 সর্বোচ্চ 8 9 এর গভীরতার সাথে এবং কেবল কয়েক সেকেন্ডের (আমার ধীর কম্পিউটারে) প্রয়োজন।

এই অ্যালগরিদমের দ্বারা পাওয়া স্কোর = 21 সহ এমএম (২,৩) এর জন্য একটি কৌশলটির উদাহরণ আউটপুট এর মতো দেখাচ্ছে:

{BC:{00:AA,01:AB:{01:CA},02:CB,10:AC:{00:BB,01:BA,10:CC}}}

আমার অ্যালগরিদম নিয়ে আকর্ষণীয় কিছু নেই nothing কোন আবিষ্কার নেই। আমি স্রেফ নেটে প্রাপ্ত রেসিপিগুলি অনুসরণ করেছি এবং তাদের এই জাভা কোডটিতে সংকুচিত করেছি। আমি কেবলমাত্র অপ্টিমাইজেশনই কোডের লাইনগুলি (একভাবে) অপ্টিমাইজ করার চেষ্টা করছি। এটা এইভাবেই চলে:

  1. বর্তমান সেট এস হতে সম্ভাব্য সকল কোডের প্রাথমিক সেট এস0 তৈরি করুন
  2. কোডব্রেকার এস এর জন্য একটি (লোভী) ভাল অনুমান আবিষ্কার করে প্রতিটি অনুমান এস এর একটি বিভাজন পিতে নিয়ে যায়, যেখানে প্রতিটি উপসেট এস 'অনুমানের একই উত্তর থাকা সমস্ত কোড (এস থেকে) সংগ্রহ করে। অনুমানের জন্য সর্বাধিক তথ্য দেওয়ার কারণে একটি ভাল অনুমানের একটি ভাল পার্টিশন থাকে।
  3. ভাল অনুমান এবং এর পি নিন। প্রতিটি নোম্পটি এস এর জন্য পি প্রয়োগ করুন কোডব্রেকার रिकরসিভ (পদক্ষেপ 2)।

@ মিঃব্যাকএন্ড: ভেরিফায়ার লেখা শক্ত, আমার ধারণা। ;-)

import java.util.TreeMap;
import java.util.Vector;

public class MM {
    Vector<String> codeset = new Vector<String>();
    String guess;
    TreeMap<Integer, MM> strategy = new TreeMap<Integer, MM>();

    public String toString() {
        String list="";
        for (Integer reply: strategy.keySet()) {
            if (strategy.get(reply)!=null) list+=(list.length()>0?",":"")+(reply<10?"0":"")+reply+":"+strategy.get(reply);
        }
        if (list.length()>0) return guess+":{"+list+"}"; else return guess;
    }

    MM() { }

    MM(int h, int c) {
        for (int i = 0; i < Math.pow(c, h); i++) {
            String code = "";
            for (int j = 0, p=i; j < h; j++) {
                code+="ABCDEFGH".charAt(p%c);
                p/=c;
            }
            codeset.add(code);
        }
    }

    int replyAccordingToDonaldKnuth(String secret, String guess) {
        int black=0;
        int totalHitsBlackAndWhite=0;
        for (char n = 'A'; n <= 'H'; n++) {
            int a=0, b=0;
            for (int i = 0; i < secret.length(); i++) {
                if (secret.charAt(i)==n) a++;
                if ( guess.charAt(i)==n) b++;
            }
            totalHitsBlackAndWhite+=Math.min(a, b);
        }
        for (int i = 0; i < secret.length(); i++) {
            if (secret.charAt(i) == guess.charAt(i)) black++;
        }
        return 10 * black + (totalHitsBlackAndWhite-black);
    }

    int reply(String secret, String guess) {
        return replyAccordingToDonaldKnuth(secret, guess);
    }

    MM codebreaker(Vector<String> permuts) {
        int fitness=0;
        MM protostrategy=null;
        for (int greedy = 0; greedy < Math.min(permuts.size(), 200); greedy++) {
            MM tmp=partition(permuts, permuts.get(greedy));
            int value=tmp.strategy.size();
            if (fitness<=value) {
                fitness=value;
                protostrategy=tmp;
                protostrategy.guess=permuts.get(greedy);
            }
        }
        if (protostrategy!=null) {
            for (Integer reply: protostrategy.strategy.keySet()) {
                protostrategy.strategy.put(reply, codebreaker(protostrategy.strategy.get(reply).codeset));
            }
        }
        return protostrategy;
    }

    MM partition(Vector<String> permuts, String code) {
        MM protostrategy=new MM();
        for (int c = 0; c < permuts.size(); c++) {
            int reply=reply(permuts.get(c), code);
            if (!protostrategy.strategy.containsKey(reply)) protostrategy.strategy.put(reply, new MM());
            if (permuts.get(c)!=code) protostrategy.strategy.get(reply).codeset.add(permuts.get(c));
        }
        return protostrategy;
    }

    public static void main(String[] args) {
        MM mm = new MM(5,8);
        System.out.println("{"+mm.codebreaker(mm.codeset)+"}");
    }
}

কিছু মন্তব্য:

  1. কোনও ধারাবাহিকতা যাচাইয়ের প্রয়োজন নেই কারণ সেট এস এবং তাদের পার্টিশনগুলি (স্বয়ংক্রিয়) সামঞ্জস্যপূর্ণ উপায়ে তৈরি করা হয়।
  2. এস 0 এর বাইরে (এসের পরিবর্তে) একটি ভাল ধারণা বাছাই করা বোধগম্য। তবে আমি বর্তমান কোডে এই পদ্ধতির অনুসরণ করি না।
  3. আমার লোভী অনুসন্ধানটি 200 টি চেষ্টাতে কৃত্রিমভাবে ছাঁটাই হয়েছে।
  4. আমি জানি, "অনুমানের জন্য সর্বাধিক তথ্য প্রদান" খুব সুনির্দিষ্ট নয়। সহজ ধারণাটি হ'ল সর্বাধিক সংখ্যক সাবসেট সহ পার্টিশনটি বেছে নেওয়া।
  5. ফলাফল আপনি কীভাবে উত্তরটি গণনা করেন তার উপর নির্ভর করে (..)। অবশেষে আমি ডোনাল্ড নথের অভিব্যক্তিটি মানিয়ে নিয়েছি।

জন্য কৌশল MM(5,8) এখানে পাওয়া যাবে । গিটহাবের লাইনগুলি প্রদর্শন করতে কিছু সমস্যা রয়েছে, তাই কাঁচা বোতামটি ক্লিক করুন ।


হাই কীভাবে গিথুব টেক্সটটি প্রিন্ট করা যায় যাতে ফলাফলগুলি প্রথম দিকনির্দেশনা 'এইচএইচসিএ' থেকে শুরু করে .. এবং পরবর্তী পদক্ষেপের উপর নির্ভর করে উত্তর ... এবং পরবর্তী এবং আরও কিছু করা যায়। বর্তমান কাঁচা পাঠ্য বিন্যাসটি ম্যানুয়াল স্ক্যান করার পক্ষে সহজ নয় .. যে কৌশলটি আমি পরে করছি তা হল কীভাবে নেস্টেড বন্ধনীগুলি পার্স করা যায় এবং একটি দুর্দান্ত টেবিল বিন্যাস পাওয়া যায় যা প্রশ্নের শেষে বুলেটযুক্ত তালিকার মতো শেষ অবধি অনুসরণ করা সহজ is এমএম (2,3) এর জন্য। ধন্যবাদ. আশা করি আমি বুঝতে পেরেছি যে আমি কী পরে আছি। (
অজগরটিকে

2

চুনি

সম্পাদনা: অসম্ভব অনুমানগুলি বাদ দিতে কিছু যুক্তি যুক্ত করা হয়েছে। অতএব, কৌশলগুলি এখন প্রদত্ত ফর্ম্যাটটি মেনে চলে এবং আরও অনেক বেশি পরিচালনাযোগ্য।

সুতরাং এখানে এই চেষ্টা করা এক প্রচেষ্টা। এটি বেশ নিখুঁত (এবং খুব সুস্পষ্ট নয়) - এটি নীচে থেকে উপরে / ifsif / অন্য শাখা পড়তে সহায়তা করে।

Holes, Colors = ARGV.map &:to_i

ColorChars = ('A'..'H').to_a

def is_possible(guess, blacks, result)
    blacks == guess.chars.zip(result.chars).count {|chars| chars[0] == chars[1]}
end

def print_strategy(known_colors, remaining_permutations, next_color)
    char = ColorChars[next_color]
    if remaining_permutations
        guess = remaining_permutations[0]
        print guess
        if remaining_permutations.length > 1
            print ':{'
            (Holes-1).times do |i|
                new_permutations = (remaining_permutations - [guess]).select { |perm| is_possible(guess, i, perm) }
                next if new_permutations.empty?
                print "#{i}#{Holes-i}:"                
                print '{' if new_permutations.length > 1
                print_strategy(known_colors, new_permutations, next_color)
                print '}' if new_permutations.length > 1
                print ',' if i < Holes-2
            end
            print '}'
        end
    elsif known_colors.length == Holes
        print_strategy(known_colors, known_colors.chars.permutation.map(&:join).uniq, next_color)
    elsif next_color == Colors-1
        print_strategy(known_colors+char*(Holes - known_colors.length), remaining_permutations, next_color+1)
    else
        print char*Holes, ':{'

        (Holes - known_colors.length + 1).times do |i|
            break if i == Holes
            print "#{i}0:"
            print '{' if next_color < Colors-2 || i > 0 || known_colors.length > 0
            print_strategy(
                known_colors+char*i,
                remaining_permutations,
                next_color+1
            )
            print '}' if next_color < Colors-2 || i > 0 || known_colors.length > 0
            print ',' if i < (Holes - known_colors.length) && i < Holes-1
        end
        print '}'
    end
end

print '{'
print_strategy('', nil, 0)
puts '}'

: প্রথমত, আমি চেষ্টা প্রতিটি রং এর 5 AAAAA, BBBBBযে আমি চিত্রে আউট যা রং আসলে প্যাটার্ন ব্যবহার করা হয় থেকে, ইত্যাদি। এবং তারপরে আমি কেবল প্রদত্ত রঙগুলির সমস্ত অনুমতিগুলি চেষ্টা করে যা ইতিমধ্যে কালো খোঁচা দ্বারা বাতিল হয়ে গেছে সেগুলি বাদ দিয়ে।

MM(2,3)কৌশলটি এখানে :

{AA:{00:{BB:{00:CC,10:{BC:{02:CB}}}},10:{BB:{00:{AC:{02:CA}},10:{AB:{02:BA}}}}}}

কৌশলটি MM(5,8)376KB নেয় এবং এটি এখানে পাওয়া যাবে । গিটহাবের লাইনগুলি প্রদর্শন করতে কিছু সমস্যা রয়েছে যেগুলি দীর্ঘ, তাই কা বোতামটি ক্লিক করুন ।

এখন আমি যদি কোনও যাচাইকারী পাই তবে আমার আসল স্কোরটি কী তা আমি আপনাকে বলতে পারি। :)


ভেরিফায়ারটি এখনও প্রকাশিত হয়নি সম্পর্কে খারাপ লাগছে, তবে এটি চলছে ... আপনার (প্রথম) এমএম (2,3) কৌশলটিতে কিছু ভুল আছে, উদাহরণস্বরূপ যদি সমাধানটি এবি: অনুমান = এএ; উত্তর = 10; অনুমান = বিবি; উত্তর = 10, যার জন্য কোনও কৌশল নেই। জবাবদিহি করার জন্য আপনার পরামর্শটি আমি খতিয়ে দেখব তবে ভাল কৌশলগুলির জন্য এটি প্রয়োজনীয় হওয়া উচিত নয়, যেহেতু সম্ভাব্য সমাধানের সেটটি বিভিন্ন উত্তরগুলির জন্য আলাদা হয়।
মিঃব্যাকেন্ডে

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

এখানে চুক্তিটি রয়েছে: আমি বর্তমান যাচাইকারীটি শেষ করব এবং এটি প্রকাশ করব (ওয়েব অ্যাপ হিসাবে - এটি এখানে আটকানো খুব বড়)। দুর্ভাগ্যক্রমে, এটি খুব কঠোর হতে পারে, কারণ এটি অসম্ভব জবাবগুলিকে একটি ত্রুটি বলে মনে করে। এরপরে, আমি একাধিক জবাবকে সমর্থন করার জন্য এটিকে মানিয়ে নেব এবং অসম্ভব উত্তরের জন্য সতর্কতা প্রেরণ করব। এটি বলে যে, আপনার 1.3G এমএম (4,4) কৌশলটিতে অনেকগুলি অসম্ভব জবাব এবং / বা হ্রাস-হ্রাস অনুমানগুলি থাকতে হবে, কারণ একটি শালীন এমএম (5,8) কৌশলটির আনুমানিক আকার হ'ল মুষ্টিমেজ।
মিঃব্যাকএন্ড

@ এমআরব্যাকএন্ড অবশ্যই আমার কৌশলগুলিতে এক টন অসম্ভব প্রতিক্রিয়া রয়েছে। "আমি সংযুক্তিগুলি করছি না" বলতে আমি এটাই বুঝি। ;) যদি তা ও গ্রুপিংয়ের উত্তরগুলি সমর্থন করার জন্য আপনার যদি খুব ঝামেলা হয় তবে চিন্তা করবেন না, তবে আমার অসম্ভব অনুমানগুলি বাদ দেওয়া উচিত।
মার্টিন এন্ডার

@ মিঃব্যাকএন্ড সুসংবাদ, আমি এটি ঠিক করেছি। :) আমি আশা করি কৌশলটি এখন কার্যকর হবে। এটির সাথে এখনও কোনও সমস্যা আছে কিনা তা আমাকে জানান।
মার্টিন ইন্ডার
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.