ค้นหารหัสล็อคแบบ Wordiest


18

ฉันมีกุญแจรวมกันที่มีตัวอักษรแทนตัวเลข ดูเหมือนว่า: http://pictures.picpedia.com/2012/09/Word_Combination_Padlock.jpgมี 5 วงล้อแต่ละอันมี 10 ตัวอักษรที่แตกต่างกัน

คนส่วนใหญ่ชอบที่จะใช้คำสำหรับการรวมกันของพวกเขามากกว่าตัวอักษรโดยพลการ (แน่นอนว่าปลอดภัยน้อยกว่า แต่จดจำได้ง่ายกว่า) ดังนั้นเมื่อผลิตกุญแจมันจะเป็นการดีที่จะสร้างมันขึ้นมาให้มีตัวอักษรผสมกันซึ่งสามารถใช้ในการสร้างคำภาษาอังกฤษ 5 ตัวอักษรให้ได้มากที่สุด

งานของคุณถ้าคุณเลือกที่จะยอมรับมันก็คือการหาตัวอักษรให้วงล้อซึ่งจะอนุญาตให้สร้างคำได้มากที่สุด ตัวอย่างเช่นทางออกของคุณอาจเป็น

ABCDEFGHIJ DEFGHIJKLM ZYXWVUTSR ABCDEFGHIJ ABCDEFGHIJ

(ถ้าคุณไม่ได้จินตนาการเกินไปนั่นก็คือ)

เพื่อความสอดคล้องโปรดใช้รายการคำศัพท์ที่http://www.cs.duke.edu/~ola/ap/linuxwords

คำ 5 ตัวอักษรใด ๆ ในรายการนั้นใช้ได้รวมถึงชื่อที่เหมาะสม ไม่สนใจ Sino- และ L'vov และคำอื่น ๆ ในรายการที่มีอักขระที่ไม่ใช่ az

โปรแกรมที่ชนะคือโปรแกรมที่สร้างชุดคำที่ใหญ่ที่สุด ในกรณีที่หลาย ๆ โปรแกรมพบผลลัพธ์เดียวกันโปรแกรมแรกที่ชนะจะถูกโพสต์ โปรแกรมควรทำงานภายใน 5 นาที

แก้ไข: เนื่องจากกิจกรรมได้พังทลายลงและไม่มีทางออกที่ดีกว่านี้อีกเลยฉันประกาศ Peter Taylor ผู้ชนะ! ขอบคุณทุกคนสำหรับโซลูชั่นการประดิษฐ์ของคุณ


เราจะนับชื่อที่เหมาะสมได้อย่างไรเมื่อพิจารณาว่าพวกเขาแตกต่างกันมากในหลายวัฒนธรรม
elssar

@elssar ถ้าฉันเข้าใจถูกต้องคำใด ๆ ในรายการก็โอเคไม่ว่าจะเป็นชื่อที่เหมาะสม (ในทุกวัฒนธรรม)
ugoren

โอ้ใช่แล้วที่นั่นไม่เห็นว่า
elss

ดังนั้นไม่ใช่คำถามรหัส; แต่ตรรกะ?
Brigand

2
สิ่งนี้ถูกแท็กเป็นความท้าทายเกี่ยวกับรหัส : อะไรคือความท้าทาย สิ่งที่คุณขอคือค่าที่เพิ่มฟังก์ชั่นที่มีขนาดของโดเมนประมาณ 110.3 บิต ดังนั้นจึงไม่มีความเป็นไปได้ที่จะบังคับปัญหา แต่ควรจะได้คำตอบที่ถูกต้องและอาจพิสูจน์ได้ว่าถูกต้อง จำไว้ว่าสิ่งที่จำเป็นสำหรับการพิจารณาคำตอบคืออะไรและคุณจะใช้เกณฑ์อะไรในการคัดเลือกผู้ชนะ
Peter Taylor

คำตอบ:


6

1,275 คำโดยการปีนเขาแบบโลภอย่างง่าย

รหัสคือ C # ทางออกที่ผลิตคือ

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();
        }
    }
}

ฉันเพิ่งจะแก้ไขคำตอบของฉันด้วยโซลูชันที่แน่นอนนี้ แต่คุณเอาชนะฉันได้
cardboard_box

เมื่อฉันเรียกใช้การค้นหาไต่เขาแบบเดียวกันจากชุดค่าผสมแบบสุ่มเริ่มต้น 1,000 ชุดและเลือกออพติม่าท้องถิ่นที่ดีที่สุด 1000 รายการดูเหมือนว่าจะสร้างโซลูชันเดียวกันเสมอดังนั้นจึงน่าจะเหมาะสมที่สุดในระดับโลก
Peter Taylor

ขึ้นอยู่กับคำจำกัดความของคุณที่มีแนวโน้ม ;-) แต่มันก็เป็น "ยืนยัน" ต่อไปโดยวิธีการอื่น ๆ ที่ให้ผลสูงสุด 1275 (และ Quantum-Tic-Tac-Toe ไปไหน)
Howard

@ โฮวาร์ดนั่นเป็นเพียงสิ่งประดิษฐ์ของ. Net ที่ไม่สนับสนุนจุดเข้าใช้หลายรายการในโครงการเดียว ฉันมีหนึ่งโครงการ "แซนด์บ็อกซ์" ที่ฉันใช้สำหรับสิ่งนี้และฉันมักจะเปลี่ยนMainวิธีการที่จะเรียก_Mainวิธีการที่แตกต่างกัน
Peter Taylor

ฉันลองอัลกอริธึมทางพันธุกรรมและได้ผลลัพธ์เดียวกันในไม่กี่นาทีจากนั้นก็ไม่มีอะไรในชั่วโมงถัดไปดังนั้นฉันจะไม่แปลกใจเลยถ้ามันเป็นสิ่งที่ดีที่สุด
cardboard_box

4

Python (3), 1273 ≈ 30.5%

นี่เป็นวิธีที่ไร้เดียงสาจริงๆ: รักษาความถี่ของตัวอักษรแต่ละตัวในแต่ละตำแหน่งจากนั้นกำจัดตัวอักษร "ที่แย่ที่สุด" จนกว่าตัวอักษรที่เหลือจะพอดีกับวงล้อ ฉันประหลาดใจที่ดูเหมือนว่าจะทำได้ดี

สิ่งที่น่าสนใจที่สุดคือการที่ผมมีเกือบว่าการส่งออกเช่นเดียวกับ C # 1275 วิธีการแก้ปัญหายกเว้นฉันมีบนรีลสุดท้ายของฉันแทนN Aนั่นAคือวันที่ 11 ไปสุดท้ายกำจัดของฉันเกินไปแม้ก่อนที่จะโยนออกไปและVG

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%)

เปอร์เซ็นต์การเป็นตัวแทนคืออะไร?
Joe Z.

ร้อยละของคำที่กำหนดที่สามารถทำกับชุดม้วนที่เสนอ
Eevee

ตกลง. (โอ้โหฉันเพิ่งเห็นว่าคุณเป็นใคร)
Joe Z.

ฮ่าโลกเล็ก ๆ
Eevee

3

Mathematica 1275 คำอีกครั้งและอีกครั้ง ...

รหัสนี้ไม่ใช่ Golfed เนื่องจากคำถามดูเหมือนจะไม่เรียก

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 ในการวิ่งส่วนใหญ่ แต่ไม่เคยเกินกว่านั้น ฉันพยายามรบกวนตัวอักษรมากกว่าหนึ่งครั้งในความพยายามที่จะออกไปให้ได้สูงสุดตามทฤษฎีท้องถิ่น แต่มันก็ไม่ได้ช่วยอะไรเลย ฉันสงสัยอย่างยิ่งว่า 1,275 เป็นข้อ จำกัด สำหรับรายการคำที่กำหนด นี่คือการเรียกใช้ที่สมบูรณ์:

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"}

ดังที่ Peter แสดงความคิดเห็นสิ่งเหล่านี้เป็นทางออกเดียวกันในคำสั่งซื้อที่แตกต่างกัน เรียง:

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

@belisarius ขอบคุณ! มันน่าสนใจมากขึ้นด้วยENABLE2k
Mr.Wizard

ฉันได้รับการพิจารณา Combinatorica ของ NetworkFlow หนึ่งนี้ แต่ยังไม่พบวิธีที่มีประโยชน์ในการใช้งาน
ดร. เบลิซาเรี

@belisarius ฉันหวังว่าคุณจะหาวิธี; ฉันต้องการที่จะเห็นว่า
Mr.Wizard

@belisarius โดยวิธีการที่รหัสของฉันให้shortlistความรู้สึกยาวและแม้ว่านี่ไม่ใช่กอล์ฟฉันต้องการบางสิ่งที่สั้นกว่า คุณช่วยได้ไหม
Mr.Wizard

1
ฉันคิดว่าการเลือกที่ "ชนะ" ของคุณนั้นเป็นการเปลี่ยนแบบโมดูโลแบบเดียวกันทั้งหมดในการหมุน
ปีเตอร์เทย์เลอร์

2

Python 1210 คำ (~ 29%)

สมมติว่าฉันนับจำนวนคำถูกต้องในครั้งนี้มันดีกว่าทางออกของ FakeRainBrigand เล็กน้อย ข้อแตกต่างคือฉันเพิ่มแต่ละรีลตามลำดับจากนั้นลบคำทั้งหมดจากรายการที่ไม่ตรงกับรีลดังนั้นฉันจึงได้รับการกระจายที่ดีขึ้นเล็กน้อยสำหรับวงล้อถัดไป ด้วยเหตุนี้มันจึงให้รีลแรกที่แน่นอนเหมือนกัน

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 ทำงานในเครื่องตรวจสอบของฉัน
Brigand

1

iPython ( 273 210 ไบต์ 1115 คำ)

1115/4176 * ~ 27%

ฉันคำนวณสิ่งเหล่านี้ใน iPython แต่ประวัติของฉัน (ถูกตัดเพื่อลบการดีบัก) มีลักษณะเช่นนี้

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
ในขณะที่วิธีแก้ปัญหานี้เป็นวิธีแก้ปัญหาที่ดีและมีแนวโน้มที่จะส่งคืนโซลูชันที่ดี แต่ฉันไม่เชื่อว่าจะรับประกันว่าจะส่งคืนโซลูชันที่ดีที่สุด เหตุผลก็คือคุณไม่ได้จับข้อ จำกัด ระหว่างวงล้อ: คุณกำลังปฏิบัติต่อแต่ละรีลว่าเป็นตัวแปรอิสระเมื่ออยู่ในความจริงพวกเขาจะขึ้นอยู่กับ ตัวอย่างเช่นอาจเป็นกรณีที่คำที่ใช้ตัวอักษรตัวแรกที่พบบ่อยที่สุดมีความแปรปรวนขนาดใหญ่ในการกระจายตัวอักษรตัวที่สองของพวกเขา หากเป็นเช่นนั้นโซลูชันของคุณอาจสร้างวงล้อที่จริง ๆ แล้วไม่อนุญาตให้ใช้คำใด ๆ เลย
ESultanik

1

Q

? (สิ่งที่ต้องทำ) คำ

ควรเก็บคำต่าง ๆ ไว้ในไฟล์ที่เรียกว่า words

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

ทำงานในประมาณ 170 ms ใน i7 ของฉัน มันวิเคราะห์ wordlist โดยมองหาตัวอักษรที่พบบ่อยที่สุดในแต่ละตำแหน่ง (เห็นได้ชัดว่ากรองผู้สมัครที่ไม่ใช่ผู้สมัคร) มันเป็นโซลูชันที่ไร้เดียงสาขี้เกียจ แต่ให้ผลลัพธ์ที่ดีพอสมควรโดยมีโค้ดน้อยที่สุด

ผล:

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

คุณค้นหาคำศัพท์ 5 คำจำนวนเท่าใด
DavidC

ฉันทำสิ่งเดียวกันในหลามและได้ 16353
กระดาษแข็งกล่อง

นี่เป็นอัลกอริทึมโลภแบบเดียวกับของ FakeRainBrigand หรือไม่?
ปีเตอร์เทย์เลอร์

1
@cardboard_box ผลลัพธ์ของคุณผิดอย่างแน่นอน ไม่มีคำ 5 ตัวอักษรมากมายในพจนานุกรม
ปีเตอร์เทย์เลอร์

1
ใช่มันคือ 1115 ฉันนับจำนวนตัวอักษรที่ถูกต้องในคำใด ๆ แทนจำนวนคำที่ถูกต้อง ฉันคิดว่าฉันต้องการกาแฟอีกอัน
cardboard_box

0

แก้ไข:ตอนนี้กฎได้รับการแก้ไขวิธีการนี้จะถูกตัดสิทธิ์ ฉันจะทิ้งมันไว้ที่นี่ในกรณีที่ใคร ๆ ก็สนใจจนกระทั่งในที่สุดฉันก็สามารถแก้ไขกฎใหม่ได้

Python: 277 ตัวอักษร

ฉันค่อนข้างแน่ใจว่ารุ่นทั่วไปของปัญหานี้คือ NP-Hard และคำถามไม่ต้องการค้นหาวิธีแก้ปัญหาที่เร็วที่สุดดังนั้นนี่เป็นวิธีการที่โหดร้ายในการทำ:

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)

โปรดทราบว่าฉันเปลี่ยนชื่อไฟล์รายการคำเป็น "w" เพื่อบันทึกอักขระไม่กี่ตัว

ผลลัพธ์คือจำนวนคำที่เป็นไปได้จากการกำหนดค่าที่กำหนดตามด้วยการกำหนดค่าเอง:

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'))
...

บรรทัดสุดท้ายของเอาต์พุตก่อนที่โปรแกรมจะยกเลิกจะรับประกันว่าจะเป็นทางออกที่ดีที่สุด


ฉันชอบที่จะเห็นโค้ดของคุณในเวอร์ชัน C หรือ ASM เพื่อให้มันเสร็จในปีนี้ :-) หรืออย่างน้อยก็รันจนกว่าจะถึง 1116 คุณสามารถเขียนมันโดยไม่ใช้ itertools ดังนั้นฉันจึงสามารถรันมันบน jython ? (เร็วกว่างูหลามธรรมดา แต่ง่ายกว่างูใหญ่)
Brigand

ไม่ต้องกังวลกับเรื่องของงู ฉันต้องการคว้าอัลฟา มันยังคงทำงานล้มเหลว (หน่วยความจำมากเกินไป) แต่ดูเหมือนว่าจะหลีกเลี่ยงไม่ได้
Brigand

ฉันค่อนข้างแน่ใจว่าแม้ว่าสิ่งนี้จะถูกนำมาใช้ในการประกอบมันจะใช้เวลานานกว่าอายุการใช้งานของฉันในการทำให้ฮาร์ดแวร์ปัจจุบันเสร็จสมบูรณ์ :-P
ESultanik

ปัญหาคือฉันซ้ำแล้วซ้ำอีก (26 เลือก 10) ^ 5 ≈ 4.23 * 10 ^ 33 ความเป็นไปได้ แม้ว่าเราจะสามารถทดสอบความเป็นไปได้หนึ่งอย่างต่อนาโนวินาทีมันก็จะใช้เวลาประมาณ 10 ^ 7 เท่าของอายุปัจจุบันของเอกภพที่จะเสร็จสิ้น
ESultanik

1
มีตัวละครสองตัวที่ไม่ปรากฏในตำแหน่งที่ 5 ในคำใด ๆ ในรายการคำที่กำหนดดังนั้นคุณสามารถลดจำนวนความเป็นไปได้ด้วยปัจจัยประมาณ 4 นั่นคือวิธีที่ฉันได้รับ "ประมาณ 110.3 บิต" ในความคิดเห็นของฉัน คำถาม.
ปีเตอร์เทย์เลอร์
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.