ওয়ার্ডেস্ট কম্বিনেশন লকটি সন্ধান করুন


18

আমার সংমিশ্রণ প্যাডলক রয়েছে যার সংখ্যার পরিবর্তে অক্ষর রয়েছে। এটি দেখতে এটির মতো দেখাচ্ছে: http://pictures.picpedia.com/2012/09/Word_Combination_Padlock.jpg এখানে 5 টি রিল রয়েছে, যার প্রত্যেকটিতে 10 টি আলাদা অক্ষর রয়েছে।

বেশিরভাগ লোকেরা স্বতঃস্ফূর্ত অক্ষরের পরিবর্তে তাদের সংমিশ্রণের জন্য একটি শব্দ ব্যবহার করতে পছন্দ করে। (কম সুরক্ষিত অবশ্যই, তবে সহজে মনে রাখা সহজ)) সুতরাং লকটি তৈরি করার সময়, এটি অক্ষরের সংমিশ্রণে তৈরি করা ভাল হবে যা যতগুলি সম্ভব 5 অক্ষরের ইংরেজি শব্দ তৈরি করতে ব্যবহার করা যেতে পারে।

আপনার টাস্ক, আপনি যদি এটি গ্রহণ করা পছন্দ করেন তবে তা হ'ল রিলগুলিতে চিঠিপত্রের একটি অ্যাসাইনমেন্ট সন্ধান করা যা যতটা সম্ভব শব্দ তৈরি করতে দেয়। উদাহরণস্বরূপ, আপনার সমাধান হতে পারে

এবিসিডিডিফিজিজে ডিফজিআইজিএইচএলএম জাইএক্সডাব্লুভিউটিএসআর এবিসিডিএফজিআইজি এবিসিডিএফজিআইজি

(যদি আপনি খুব কল্পনাপ্রসূত বোধ না করছিলেন তবে তা)।

ধারাবাহিকতার জন্য, দয়া করে http://www.cs.duke.edu/~ola/ap/linuxwords এ শব্দ তালিকাটি ব্যবহার করুন

সেই তালিকার 5-অক্ষরের কোনও শব্দই যথাযথ নাম সহ ঠিক আছে। সিনো- এবং লভভ এবং তালিকার অন্য কোনও শব্দের উপেক্ষা করুন যা একটি অ-এজে অক্ষর ধারণ করে।

বিজয়ী প্রোগ্রাম হ'ল এটি যা শব্দের বৃহত্তম সেট তৈরি করে। ইভেন্টে যে একাধিক প্রোগ্রাম একই ফলাফল সন্ধান করে, পোস্ট হওয়া প্রথমটি জয়লাভ করে। প্রোগ্রামটি 5 মিনিটের নিচে চলতে হবে।

সম্পাদনা করুন: যেহেতু ক্রিয়াকলাপটি হ্রাস পেয়েছে এবং এর থেকে আরও ভাল সমাধান আর আসে নি, আমি পিটার টেলরকে বিজয়ী ঘোষণা করি! আপনার উদ্ভাবনী সমাধানের জন্য সবাইকে ধন্যবাদ।


সংস্কৃতি জুড়ে তারা এত বেশি পরিবর্তিত হয়ে কীভাবে সঠিক নাম গণনা করতে পারে?
এলসার

@ এলসার, আমি যদি সঠিকভাবে বুঝতে পারি তবে তালিকার কোনও শব্দ ঠিক আছে, এটি সঠিক নাম (কোনও সংস্কৃতিতে) নির্বিশেষে।
ugoren

ওহ ঠিক আছে , ওখানে থাকা লোকেরা তা দেখেনি
এলসার

সুতরাং, একটি কোড প্রশ্ন নয়; কিন্তু যুক্তি?
ব্রিগেন্ড

2
এটি কোড-চ্যালেঞ্জ হিসাবে ট্যাগ : চ্যালেঞ্জ কি? আপনি যা জিজ্ঞাসা করেছেন তার সবকিছুর মধ্যেই এমন মান যা কোনও ফাংশনকে সর্বাধিক করে তোলে যার ডোমেনের আকার প্রায় 110.3 বিট। সুতরাং সমস্যাটিকে নিষ্ঠুর করে তোলা সম্ভব নয়, তবে সঠিক উত্তর পাওয়া সম্ভব এবং এটি সঠিক প্রমাণও করা উচিত। এই সমস্ত বিষয় মনে রেখে, উত্তরের বিবেচনার জন্য পূর্বশর্তগুলি কী কী এবং আপনি কোন বিজয়ী নির্বাচন করতে কোন মানদণ্ডটি ব্যবহার করছেন?
পিটার টেলর

উত্তর:


6

সাধারণ লোভী পাহাড়ী আরোহণের মাধ্যমে 1275 শব্দ

কোডটি সি #। সমাধান উত্পাদিত হয়

Score 1275 from ^[bcdfgmpstw][aehiloprtu][aeilnorstu][acdeklnrst][adehklrsty]$

আমি সেই আউটপুট ফর্ম্যাটটি ব্যবহার করছি কারণ এটি পরীক্ষা করা সত্যিই সহজ:

grep -iE "^[bcdfgmpstw][aehiloprtu][aeilnorstu][acdeklnrst][adehklrsty]$" linuxwords.txt | wc

namespace Sandbox {
    class Launcher {
        public static void Main(string[] args)
        {
            string[] lines = _Read5s();
            int[][] asMasks = lines.Select(line => line.ToCharArray().Select(ch => 1 << (ch - 'a')).ToArray()).ToArray();
            Console.WriteLine(string.Format("{0} words found", lines.Length));

            // Don't even bother starting with a good mapping.
            int[] combos = _AllCombinations().ToArray();
            int[] best = new int[]{0x3ff, 0x3ff, 0x3ff, 0x3ff, 0x3ff};
            int bestSc = 0;
            while (true)
            {
                Console.WriteLine(string.Format("Score {0} from {1}", bestSc, _DialsToString(best)));

                int[] prevBest = best;
                int prevBestSc = bestSc;

                // Greedy hill-climbing approach
                for (int off = 0; off < 5; off++)
                {
                    int[] dials = (int[])prevBest.Clone();

                    dials[off] = (1 << 26) - 1;
                    int[][] filtered = asMasks.Where(mask => _Permitted(dials, mask)).ToArray();
                    int sc;
                    dials[off] = _TopTen(filtered, off, out sc);
                    if (sc > bestSc)
                    {
                        best = (int[])dials.Clone();
                        bestSc = sc;
                    }
                }

                if (bestSc == prevBestSc) break;
            }

            Console.WriteLine("Done");
            Console.ReadKey();
        }

        private static int _TopTen(int[][] masks, int off, out int sc)
        {
            IDictionary<int, int> scores = new Dictionary<int, int>();
            for (int k = 0; k < 26; k++) scores[1 << k] = 0;

            foreach (int[] mask in masks) scores[mask[off]]++;

            int rv = 0;
            sc = 0;
            foreach (KeyValuePair<int, int> kvp in scores.OrderByDescending(kvp => kvp.Value).Take(10))
            {
                rv |= kvp.Key;
                sc += kvp.Value;
            }
            return rv;
        }

        private static string _DialsToString(int[] dials)
        {
            StringBuilder sb = new StringBuilder("^");
            foreach (int dial in dials)
            {
                sb.Append('[');
                for (int i = 0; i < 26; i++)
                {
                    if ((dial & (1 << i)) != 0) sb.Append((char)('a' + i));
                }
                sb.Append(']');
            }
            sb.Append('$');
            return sb.ToString();
        }

        private static IEnumerable<int> _AllCombinations()
        {
            // \binom{26}{10}
            int set = (1 << 10) - 1;
            int limit = (1 << 26);
            while (set < limit)
            {
                yield return set;

                // Gosper's hack:
                int c = set & -set;
                int r = set + c;
                set = (((r ^ set) >> 2) / c) | r;
            }
        }

        private static bool _Permitted(int[] dials, int[] mask)
        {
            for (int i = 0; i < dials.Length; i++)
            {
                if ((dials[i] & mask[i]) == 0) return false;
            }
            return true;
        }

        private static string[] _Read5s()
        {
            System.Text.RegularExpressions.Regex word5 = new System.Text.RegularExpressions.Regex("^[a-z][a-z][a-z][a-z][a-z]$", System.Text.RegularExpressions.RegexOptions.Compiled);
            return File.ReadAllLines(@"d:\tmp\linuxwords.txt").Select(line => line.ToLowerInvariant()).Where(line => word5.IsMatch(line)).ToArray();
        }
    }
}

আমি এই সঠিক সমাধানটি দিয়ে আমার উত্তরটি সম্পাদনা করতে যাচ্ছিলাম তবে আপনি আমাকে এটির জন্য পিটিয়েছিলেন।
পিচবোর্ড_বক্স

আমি যখন 1000 টি এলোমেলো শুরু সংমিশ্রণগুলি থেকে একই পাহাড়-আরোহণের অনুসন্ধান চালাচ্ছি এবং পাওয়া 1000 স্থানীয় সর্বোত্তমগুলির মধ্যে সেরাটি নির্বাচন করি তখন মনে হয় এটি সর্বদা একই সমাধান তৈরি করে, তাই এটি বিশ্বব্যাপী সর্বোত্তম হতে পারে বলে মনে হয়।
পিটার টেলর

এটি সম্ভবত আপনার সংজ্ঞা উপর নির্ভর করে ;-) তবে এটি অন্যান্য পদ্ধতির দ্বারা আরও "নিশ্চিত" হয়ে গেছে যা সর্বোচ্চ 1275 ফলন দেয়। (এবং কোয়ান্টাম-টিকিট-টাক-টু কোথায় গেল?)
হাওয়ার্ড

@ হাওয়ার্ড, এটি কেবলমাত্র একটি নিদর্শন ছিল। একটি প্রকল্পে একাধিক এন্ট্রি পয়েন্ট সমর্থন করে না। আমার কাছে একটি "স্যান্ডবক্স" প্রকল্প রয়েছে যা আমি এই জাতীয় জিনিসগুলির জন্য ব্যবহার করি এবং আমি সাধারণত Mainবিভিন্ন _Mainপদ্ধতি কল করার পদ্ধতিটি পরিবর্তন করি ।
পিটার টেলর

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

4

পাইথন (3), 1273 ≈ 30.5%

এটি একটি সত্যই নির্লজ্জ দৃষ্টিভঙ্গি: প্রতিটি পদের প্রতিটি অক্ষরের ফ্রিকোয়েন্সিটির পরিমাণ রাখুন, তারপরে "সবচেয়ে খারাপ" বর্ণটি অপসারণ করুন যতক্ষণ না বাকী অক্ষরগুলি রেলগুলিতে ফিট না হয়। আমি অবাক হয়েছি এটি খুব ভাল করে দেখে মনে হচ্ছে।

কি সবচেয়ে আকর্ষণীয় যে আমি সি # 1275 সমাধান হিসেবে প্রায় হুবহু একই আউটপুট পাওয়া যায়, ছাড়া আমি একজন আছে Nপরিবর্তে আমার শেষ রীল উপর A। এটাই Aআমার একাদশ-শেষ-নির্মূলকরণ ছিল, এমনকি, এমনকি একটি Vএবং এ ফেলে দেওয়ার আগেও G

from collections import Counter

def main(fn, num_reels, letters_per_reel):
    # Read ye words
    words = []
    with open(fn) as f:
        for line in f:
            word = line.strip().upper()
            if len(word) == num_reels and word.isalpha():
                words.append(word)

    word_pool_size = len(words)

    # Populate a structure of freq[reel_number][letter] -> count
    freq = [Counter() for _ in range(num_reels)]
    for word in words:
        for r, letter in enumerate(word):
            freq[r][letter] += 1

    while True:
        worst_reelidx = None
        worst_letter = None
        worst_count = len(words)
        for r, reel in enumerate(freq):
            # Skip reels that already have too-few letters left
            if len(reel) <= letters_per_reel:
                continue

            for letter, count in reel.items():
                if count < worst_count:
                    worst_reelidx = r
                    worst_letter = letter
                    worst_count = count

        if worst_letter is None:
            # All the reels are done
            break

        # Discard any words containing this worst letter, and update counters
        # accordingly
        filtered_words = []
        for word in words:
            if word[worst_reelidx] == worst_letter:
                for r, letter in enumerate(word):
                    freq[r][letter] -= 1
                    if freq[r][letter] == 0:
                        del freq[r][letter]
            else:
                filtered_words.append(word)
        words = filtered_words

    for reel in freq:
        print(''.join(sorted(reel)))

    print("{} words found (~{:.1f}%)".format(
        len(words), len(words) / word_pool_size * 100))

উত্পাদন:

BCDFGMPSTW
AEHILOPRTU
AEILNORSTU
ACDEKLNRST
DEHKLNRSTY
1273 words found (~30.5%)

শতাংশ কী উপস্থাপন করে?
জো জে। জেড

রেলের প্রস্তাবিত সেট দিয়ে তৈরি করা যায় এমন প্রদত্ত শব্দের শতাংশ
ইভি

ঠিক আছে. (ওহো, আমি কেবল আপনি কে ছিলেন তা দেখেছি))
জো জেড।

হা, ছোট বিশ্বের।
veভী

3

গণিত , 1275 শব্দ বার বার ...

এই কোডটি গল্ফ হয় না কারণ এটির জন্য প্রশ্নটি হাজির হয় না।

wordlist = Flatten @ Import @ "http://www.cs.duke.edu/~ola/ap/linuxwords";
shortlist = Select[ToLowerCase@wordlist, StringMatchQ[#, Repeated[LetterCharacter, {5}]] &];
string = "" <> Riffle[shortlist, ","];

set = "a" ~CharacterRange~ "z";
gb = RandomChoice[set, {5, 10}];

best = 0;
While[True,
  pos = Sequence @@ RandomInteger /@ {{1, 5}, {1, 10}};
  old = gb[[pos]];
  gb[[pos]] = RandomChoice @ set;
  If[best < #,
    best = #; Print[#, "   ", StringJoin /@ gb],
    gb[[pos]] = old
  ] & @ StringCount[string, StringExpression @@ Alternatives @@@ gb]
]

শব্দ গণনা দ্রুত (10 সেকেন্ডেরও কম) বেশিরভাগ রানে 1275-তে বিকশিত হয় তবে এর আগে কখনই যায় না। একটি তাত্ত্বিক স্থানীয় সর্বাধিক থেকে বেরিয়ে আসার প্রয়াসে আমি একবারে একের অধিক চিঠিগুলিকে আটকানোর চেষ্টা করেছি তবে এটি কখনই সাহায্য করতে পারেনি। আমি দৃ strongly়ভাবে সন্দেহ করি যে প্রদত্ত শব্দ তালিকার সীমা 1275। এখানে একটি সম্পূর্ণ রান:

36   {tphcehmqkt,agvkqxtnpy,nkehuaakri,nsibxpctio,iafwdyhone}

37   {tpicehmqkt,agvkqxtnpy,nkehuaakri,nsibxpctio,iafwdyhone}

40   {tpicehmqkt,agvkqxtnpy,nkehuaakri,nsibxpctio,iafldyhone}

42   {tpicehmqkt,agvkqxtnpy,nkehuaakri,nsfbxpctio,iafldyhone}

45   {tpicehmrkt,agvkqxtnpy,nkehuaakri,nsfbxpctio,iafldyhone}

48   {tpicehmrkt,agvkwxtnpy,nkehuaakri,nsfbxpctio,iafldyhone}

79   {tpicehmskt,agvkwxtnpy,nkehuaakri,nsfbxpctio,iafldyhone}

86   {tpicehmskt,agvkwxtnpy,nkehuaakri,esfbxpctio,iafldyhone}

96   {tpicehmskt,agvkwxtnpy,nkehuaokri,esfbxpctio,iafldyhone}

97   {tpicehmskt,agvkwxtnpy,nkehuaokri,esfbxpctio,ipfldyhone}

98   {tpicehmskv,agvkwxtnpy,nkehuaokri,esfbxpctio,ipfldyhone}

99   {tpicehmskv,agvkwxtnpy,nkehuaokri,esfbzpctio,ipfldyhone}

101   {tpicehmskv,agvkwxtnpy,nkehuaokri,esfhzpctio,ipfldyhone}

102   {tpicehmskv,agvkwxtnpy,nkehuaokri,esfhzpctno,ipfldyhone}

105   {tpicehmskv,agvkwxtnpy,nkehuaokri,esfhzmctno,ipfldyhone}

107   {tpicehmskn,agvkwxtnpy,nkehuaokri,esfhzmctno,ipfldyhone}

109   {tpgcehmskn,agvkwxtnpy,nkehuaokri,esfhzmctno,ipfldyhone}

115   {tpgcehmsan,agvkwxtnpy,nkehuaokri,esfhzmctno,ipfldyhone}

130   {tpgcehmsan,agvkwxtnpy,nkehuaokri,esfhzmctno,ipfldyhons}

138   {tpgcehmsan,agvkwxtnpy,nkehuaokri,esfhzmctno,ipfldytons}

143   {tpgcehmsab,agvkwxtnpy,nkehuaokri,esfhzmctno,ipfldytons}

163   {tpgcehmsab,auvkwxtnpy,nkehuaokri,esfhzmctno,ipfldytons}

169   {tpgcehmsab,auvkwctnpy,nkehuaokri,esfhzmctno,ipfldytons}

176   {tpgcehmsab,auvkwctnpy,nkehuaokri,esfhzmctno,ihfldytons}

189   {tpgcehmsab,auvkwchnpy,nkehuaokri,esfhzmctno,ihfldytons}

216   {tpgcehmsab,auvkwchnpy,nkehtaokri,esfhzmctno,ihfldytons}

220   {tpgcehmsab,auvkwthnpy,nkehtaokri,esfhzmctno,ihfldytons}

223   {tpgcehmsab,auvkwthnpy,nkehtaokri,esfhbmctno,ihfldytons}

234   {tpgcehmsab,auvkwthnpy,nkegtaokri,esfhbmctno,ihfldytons}

283   {tpgcehmsab,auvkwthnpy,nkegtaokri,esfhbrctno,ihfldytons}

285   {tpdcehmsab,auvkwthnpy,nkegtaokri,esfhbrctno,ihfldytons}

313   {tpdcehmsab,auvkwthnly,nkegtaokri,esfhbrctno,ihfldytons}

371   {tpdcehmsab,auvkethnly,nkegtaokri,esfhbrctno,ihfldytons}

446   {tpdcehmsab,auvoethnly,nkegtaokri,esfhbrctno,ihfldytons}

451   {tpdcehmslb,auvoethnly,nkegtaokri,esfhbrctno,ihfldytons}

465   {tpdcwhmslb,auvoethnly,nkegtaokri,esfhbrctno,ihfldytons}

545   {tpdcwhmslb,auioethnly,nkegtaokri,esfhbrctno,ihfldytons}

565   {tpdcwhmslb,auioethnly,nkegtaocri,esfhbrctno,ihfldytons}

571   {tpdcwhmslb,auioethnly,nkegtaocri,esfhwrctno,ihfldytons}

654   {tpdcwhmslb,auioethnly,nkegtaocri,esfhwrctno,ihfedytons}

671   {tpdcwhmslb,auioethnly,nkegtaocri,esfhirctno,ihfedytons}

731   {tpdcwhmslb,auioethnly,nkegtaocri,esfhirctno,ihredytons}

746   {tpdcwhmslb,arioethnly,nkegtaocri,esfhirctno,ihredytons}

755   {tpdcwhmslb,arioethnuy,nkegtaocri,esfhirctno,ihredytons}

772   {tpdcwhmslb,arioethnuy,nkegtaocri,ekfhirctno,ihredytons}

786   {tpdcwhmslb,arioethnuy,nkegtaocri,ekfhirctno,lhredytons}

796   {tpdcwhmslb,arioethnuy,nkegtaocri,ekfhgrctno,lhredytons}

804   {tpdcwhmslb,arioethwuy,nkegtaocri,ekfhgrctno,lhredytons}

817   {tpdcwhmslb,arioethwuy,nklgtaocri,ekfhgrctno,lhredytons}

834   {tpdcwhmslb,arioethwuy,nklgtaocri,ekfhdrctno,lhredytons}

844   {tpdcwhmslb,arioethwup,nklgtaocri,ekfhdrctno,lhredytons}

887   {tpdcwhmslb,arioethwup,nklgtaocri,ekshdrctno,lhredytons}

901   {tpdcwhmslb,arioethwup,nklgtaouri,ekshdrctno,lhredytons}

966   {tpdcwhmslb,arioethwup,nklgtaouri,elshdrctno,lhredytons}

986   {tpdcwhmsfb,arioethwup,nklgtaouri,elshdrctno,lhredytons}

1015   {tpdcwhmsfb,arioethwup,nklgtaouri,elsidrctno,lhredytons}

1039   {tpdcwhmsfb,arioethwup,nklgtaouri,elsidrctno,khredytons}

1051   {tpdcwhmsfb,arioethwup,nklgtaouri,elskdrctno,khredytons}

1055   {tpdcwhmsfb,arioethwup,nklgtaouri,elskdrctno,khredytlns}

1115   {tpdcwhmsfb,arioethwup,nelgtaouri,elskdrctno,khredytlns}

1131   {tpdcwhmsfb,arioethwup,nelwtaouri,elskdrctno,khredytlns}

1149   {tpdcwhmsfb,arioethwup,nelwtaouri,elskdrctna,khredytlns}

1212   {tpdcwhmsfb,arioelhwup,nelwtaouri,elskdrctna,khredytlns}

1249   {tpdcwhmsfb,arioelhwup,nelstaouri,elskdrctna,khredytlns}

1251   {tpgcwhmsfb,arioelhwup,nelstaouri,elskdrctna,khredytlns}

1255   {tpgcwdmsfb,arioelhwup,nelstaouri,elskdrctna,khredytlns}

1258   {tpgcwdmsfb,arioelhwup,nelstaouri,elskdrctna,khredytlas}

1262   {tpgcwdmsfb,arioelhwut,nelstaouri,elskdrctna,khredytlas}

1275   {tpgcwdmsfb,arioelhput,nelstaouri,elskdrctna,khredytlas}

এখানে আরও কিছু "বিজয়ী" নির্বাচন রয়েছে:

{"cbpmsftgwd", "hriuoepatl", "euosrtanli", "clknsaredt", "yhlkdstare"}
{"wptdsgcbmf", "ohlutraeip", "erotauinls", "lknectdasr", "sytrhklaed"}
{"cftsbwgmpd", "ropilhtaue", "niauseltor", "clstnkdrea", "esdrakthly"}
{"smgbwtdcfp", "ihulpreota", "ianrsouetl", "ekndasctlr", "kehardytls"}

পিটার মন্তব্য হিসাবে এই আসলে বিভিন্ন ক্রমে একই সমাধান। সাজানো:

{"bcdfgmpstw", "aehiloprtu", "aeilnorstu", "acdeklnrst", "adehklrsty"}

@ বিলেসারিয়াস ধন্যবাদ! এটি ENABLE2k এর সাথে আরও আকর্ষণীয় ।
মিঃ উইজার্ড

আমি এইটির জন্য কম্বিনেটরিকার নেটওয়ার্কফ্লো বিবেচনা করেছি, তবে এটির ব্যবহারের কোনও কার্যকর উপায় খুঁজে
পাইনি

@ বিলেসারিয়াস আমি আশা করি আপনি একটি উপায় খুঁজে পাবেন; আমি এটি দেখতে চাই।
মিঃ উইজার্ড

আমার কোডটি shortlistদীর্ঘকাল বোধ করার জন্য @ বিলেসারিয়াস , এবং যদিও এটি গল্ফ নয় তবে আমি আরও ছোট করতে চাই। তুমি কি সাহায্য করতে পারো?
মিঃ উইজার্ড

1
আমি মনে করি আপনার "বিজয়ী" নির্বাচনগুলি সমস্ত ডায়ালগুলির মধ্যে একই মডুলোর অনুক্রম।
পিটার টেলর

2

পাইথন, 1210 শব্দ (~ 29%)

ধরে নিলাম আমি এই বারে শব্দগুলি সঠিকভাবে গণনা করেছি, এটি ফেকরাইনব্রিজ্যান্ডের সমাধানের চেয়ে কিছুটা ভাল। পার্থক্যটি হ'ল আমি প্রতিটি রিলকে ক্রমে যুক্ত করছি এবং তারপরে তালিকা থেকে সমস্ত শব্দগুলি সরিয়ে ফেলছি যা রিলের সাথে মেলে না তাই আমি পরবর্তী রেলগুলির জন্য কিছুটা ভাল বিতরণ পেতে পারি। এই কারণে, এটি ঠিক একই প্রথম রিল দেয়।

word_list = [line.upper()[:-1] for line in open('linuxwords.txt','r').readlines() if len(line) == 6]
cur_list = word_list
s = ['']*5
for i in range(5):
    count = [0]*26
    for j in range(26):
        c = chr(j+ord('A'))
        count[j] = len([x for x in cur_list if x[i] == c])
    s[i] = [chr(x+ord('A')) for x in sorted(range(26),lambda a,b: count[b] - count[a])[:10]]
    cur_list = filter(lambda x:x[i] in s[i],cur_list)
for e in s:
    print ''.join(e)
print len(cur_list)

প্রোগ্রাম আউটপুট

SBCAPFDTMG
AOREILUHTP
ARIOLENUTS
ENTLRCSAID
SEYDTKHRNL
1210

ভাল, এবং 1210 আমার পরীক্ষক কাজ করে।
ব্রিগেন্ড

1

আইপিথন ( 273 210 বাইট, 1115 শব্দ)

1115/4176 * ~ 27%

আমি এগুলিকে আইপিথনে গণনা করেছি, তবে আমার ইতিহাস (ডিবাগিং অপসারণের জন্য ছাঁটাই করা) এর মতো দেখায়।

with open("linuxwords") as fin: d = fin.readlines()
x = [w.lower().strip() for w in d if len(w) == 6]
# Saving for later use:
# with open("5letter", "w") as fout: fout.write("\n".join(x))
from string import lowercase as low
low=lowercase + "'"
c = [{a:0 for a in low} for q in range(5)]
for w in x:
    for i, ch in enumerate(w):
        c[i][ch] += 1

[''.join(sorted(q, key=q.get, reverse=True)[:10]) for q in c]

আমরা যদি সংক্ষেপে যাচ্ছি; আমি এটি এটি ছাঁটাই করতে পারে।

x = [w.lower().strip() for w in open("l") if len(w)==6]
c=[{a:0 for a in"abcdefghijklmnopqrstuvwxyz'-"}for q in range(5)]
for w in[w.lower().strip()for w in open("l") if len(w)==6]:
 for i in range(5):c[i][w[i]]+=1
[''.join(sorted(q,key=q.get,reverse=True)[:10])for q in c]

সংক্ষিপ্ত:

c=[{a:0 for a in"abcdefghijklmnopqrstuvwxyz'-"}for q in range(5)]
for w in[w.lower() for w in open("l")if len(w)==6]:
 for i in range(5):c[i][w[i]]+=1
[''.join(sorted(q,key=q.get,reverse=True)[:10])for q in c]

আমার ফলাফল ছিল: ['sbcapfdtmg', 'aoeirulhnt', 'aironeluts', 'etnlriaosc', 'seyrdtnlah']

হাইফেন বা অ্যাডোস্ট্রোফস বাদ দেওয়া শব্দগুলির কারণে * 4176-এ আমার গণিতটি কিছুটা সংক্ষিপ্ত হতে পারে


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

1

প্রশ্নঃ

? (করণীয়) শব্দ

শব্দ একটি ফাইল বলা উচিত words

(!:')10#/:(desc')(#:'')(=:')(+:)w@(&:)(5=(#:')w)&(&/')(w:(_:)(0:)`:words)in\:.Q.a

আমার আই 7-তে প্রায় 170 এমএসে চলে। এটি শব্দের তালিকা বিশ্লেষণ করে প্রতিটি পজিশনে সর্বাধিক সাধারণ চিঠিটি সন্ধান করে (স্পষ্টত কোনও প্রার্থী ছাড়াই)। এটি একটি অলস নিষ্পাপ সমাধান তবে ন্যূনতম কোড সহ যুক্তিসঙ্গতভাবে ভাল ফলাফল তৈরি করে।

ফলাফল:

"sbcapfdtmg"
"aoeirulhnt"
"aironeluts"
"etnlriaosc"
"seyrdtnlah"

আপনি কত 5 টি অক্ষরের শব্দ খুঁজে পেয়েছেন?
ডেভিডসি

অজগরে আমিও একই কাজটি করেছি এবং 16353 পেয়েছি।
কার্ডবোর্ড_বক্স

এটি কি ফেকরাইনব্রিজ্যান্ডের মতো একই লোভী অ্যালগরিদম?
পিটার টেলর

1
@ কার্ডবোর্ড_বক্স, আপনার ফলাফল অবশ্যই ভুল। অভিধানে তেমন 5-অক্ষরের শব্দ নেই।
পিটার টেলর

1
হ্যাঁ, এটি ১১১৫ any আমি সঠিক শব্দের সংখ্যার পরিবর্তে যে কোনও শব্দে সঠিক অক্ষরের সংখ্যা গণনা করেছি। আমার মনে হয় আমার আর একটি কফি লাগবে।
পিচবোর্ড_বক্স

0

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

পাইথন: 277 অক্ষর

আমি নিশ্চিত যে এই সমস্যার সাধারণীকরণ করা সংস্করণটি এনপি-হার্ড, এবং প্রশ্নের দ্রুততম সমাধান সন্ধান করার প্রয়োজন ছিল না , সুতরাং এটি করার একটি নিষ্ঠুর শক্তি পদ্ধতি এখানে:

import itertools,string
w=[w.lower()[:-1] for w in open('w') if len(w)==6]
v=-1
for l in itertools.product(itertools.combinations(string.ascii_lowercase,10),repeat=5):
 c=sum(map(lambda d:sum(map(lambda i:i[0] in i[1],zip(d,l)))==5,w))
 if c>v:
  v=c
  print str(c)+" "+str(l)

নোট করুন যে আমি কয়েকটি অক্ষর সংরক্ষণ করতে শব্দ তালিকার ফাইলটির নাম পরিবর্তন করে "" ডাব্লু "রেখেছি।

আউটপুট হ'ল শব্দের সংখ্যা যা প্রদত্ত কনফিগারেশন থেকে নিজেই কনফিগারেশন অনুসারে সম্ভব:

34 (('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'))
38 (('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'k'))
42 (('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'l'))
45 (('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'n'))
50 (('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'r'))
57 (('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 's'))
60 (('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'k', 's'))
64 (('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'l', 's'))
67 (('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'n', 's'))
72 (('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'), ('a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'r', 's'))
...

প্রোগ্রামটি শেষ হওয়ার আগে আউটপুটটির শেষ লাইনটি সর্বোত্তম সমাধান হিসাবে গ্যারান্টিযুক্ত।


আমি আপনার কোডটির একটি সি বা এএসএম সংস্করণ দেখতে পছন্দ করব যাতে এটি এই বছরটি শেষ করতে পারে :-) বা কমপক্ষে এটি 1116 না হওয়া পর্যন্ত চালান you ? (অপেক্ষাকৃত দ্রুত নিয়মিত পাইথন চেয়ে কিন্তু cython তুলনায় অনেক সহজ।)
রাহাজান

জাইথন ​​জিনিস সম্পর্কে কিছু মনে রাখবেন না। আমার আলফা ধরার দরকার ছিল। এটি এখনও ক্র্যাশ হয়েছে (অত্যধিক স্মৃতি) তবে এটি অনিবার্য বলে মনে হয়।
ব্রিগেন্ড

আমি যথেষ্ট নিশ্চিত যে এটি যদি সমাবেশে প্রয়োগ করা হয় তবে বর্তমান হার্ডওয়্যারটি শেষ করতে আমার আজীবন সময়ের চেয়ে বেশি সময় লাগবে :
পি

সমস্যাটি হ'ল আমি পুনরাবৃত্তি করছি (26 টি 10 ​​চয়ন করুন) ^ 5 ≈ 4.23 * 10 ^ 33 সম্ভাবনা। এমনকি যদি আমরা প্রতি ন্যানোসেকেন্ডে একটি সম্ভাবনা পরীক্ষা করতে পারি তবে মহাবিশ্বের বর্তমান বয়সটি শেষ হতে 10 ^ 7 বার লাগবে।
সুলতানিক

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