Temukan Kunci Kombinasi Paling Banyak

18

Saya memiliki gembok kombinasi yang memiliki huruf dan bukan angka. Kelihatannya seperti ini: http://pictures.picpedia.com/2012/09/Word_Combination_Padlock.jpg Ada 5 gulungan, masing-masing memiliki 10 huruf berbeda.

Kebanyakan orang lebih suka menggunakan kata untuk kombinasi mereka daripada serangkaian huruf acak. (Kurang aman, tentu saja, tetapi lebih mudah diingat.) Jadi ketika membuat kuncinya, akan lebih baik untuk membuatnya dengan kombinasi huruf yang dapat digunakan untuk membuat kata-kata bahasa Inggris sebanyak 5 huruf sebanyak mungkin.

Tugas Anda, jika Anda memilih untuk menerimanya, adalah menemukan tugas surat untuk gulungan yang akan memungkinkan kata-kata sebanyak mungkin dibuat. Misalnya, solusi Anda mungkin

ABCDEFGHIJ DEFGHIJKLM ZYXWVUTSR ABCDEFGHIJ ABCDEFGHIJ

(Jika Anda tidak merasa terlalu imajinatif, itu adalah).

Untuk konsistensi, silakan gunakan daftar kata di http://www.cs.duke.edu/~ola/ap/linuxwords

Kata 5 huruf apa pun dalam daftar itu OK, termasuk nama yang benar. Abaikan Sino- dan L'vov dan kata-kata lain dalam daftar yang berisi karakter bukan az.

Program yang menang adalah program yang menghasilkan serangkaian kata terbesar. Jika beberapa program menemukan hasil yang sama, yang pertama diposting akan menang. Program harus berjalan dalam waktu kurang dari 5 menit.

Sunting: karena aktivitas telah mereda, dan tidak ada solusi yang lebih baik telah keluar, saya menyatakan Peter Taylor pemenang! Terima kasih semuanya atas solusi inventif Anda.

Edwin Young
sumber
Bagaimana seseorang dapat menghitung nama yang tepat mengingat bahwa mereka sangat bervariasi antar budaya?
elssar
@elssar, Jika saya mengerti dengan benar, kata apa pun dalam daftar itu OK, terlepas dari apakah itu nama yang tepat (dalam budaya apa pun).
ugoren
Oh benar, di sana , tidak melihat itu
elssar
Jadi, bukan pertanyaan kode; tapi logika?
Brigand
2
Ini ditandai sebagai tantangan kode : apa tantangannya? Yang Anda minta hanyalah nilai yang memaksimalkan fungsi yang ukuran domainnya sekitar 110,3 bit. Jadi tidak layak untuk memaksa masalah, tetapi harus layak untuk mendapatkan jawaban yang tepat, dan mungkin bahkan untuk membuktikannya dengan benar. Mengingat semua itu, prasyarat apa yang harus dipertimbangkan untuk dipertimbangkan, dan kriteria apa yang akan Anda gunakan untuk memilih seorang pemenang?
Peter Taylor

Jawaban:

6

1275 kata oleh pendakian sederhana serakah bukit

Kode adalah C #. Solusi yang dihasilkan adalah

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

Saya menggunakan format output itu karena sangat mudah untuk menguji:

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();
        }
    }
}
Peter Taylor
sumber
Saya baru saja akan mengedit jawaban saya dengan solusi tepat ini, tetapi Anda mengalahkan saya untuk itu.
cardboard_box
Ketika saya menjalankan pencarian mendaki bukit yang sama dari 1000 kombinasi permulaan acak dan memilih yang terbaik dari 1000 optima lokal yang ditemukan, sepertinya selalu menghasilkan solusi yang sama, sehingga sepertinya akan menjadi global optimal.
Peter Taylor
Itu tergantung pada definisi Anda tentang kemungkinan ;-) Tetapi selanjutnya "dikonfirmasi" oleh pendekatan lain yang menghasilkan 1275 sebagai maksimum. (Dan kemana perginya Quantum-Tic-Tac-Toe?)
Howard
@ Howard, itu hanya sebuah artefak. Net tidak mendukung beberapa titik masuk dalam satu proyek. Saya punya satu "kotak pasir" proyek yang saya gunakan untuk hal-hal seperti ini, dan saya biasanya mengubahMain metode untuk memanggil _Mainmetode yang berbeda .
Peter Taylor
Saya mencoba algoritma genetika dan mendapatkan hasil yang sama dalam beberapa menit, dan kemudian tidak ada dalam jam berikutnya, jadi saya tidak akan terkejut jika itu yang optimal.
cardboard_box
4

Python (3), 1273 ≈ 30,5%

Ini adalah pendekatan yang benar-benar naif: pertahankan frekuensi dari setiap huruf di setiap posisi, lalu hilangkan huruf "terburuk" hingga huruf-huruf yang tersisa sesuai dengan gulungan. Saya terkejut tampaknya melakukannya dengan sangat baik.

Yang paling menarik adalah bahwa saya memiliki output yang hampir sama persis dengan solusi C # 1275, kecuali saya memiliki Npada reel terakhir saya, bukan A. Itu Aadalah eliminasi ke-11 saya yang terakhir, juga, bahkan sebelum membuang a Vdan a 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))

Menghasilkan:

BCDFGMPSTW
AEHILOPRTU
AEILNORSTU
ACDEKLNRST
DEHKLNRSTY
1273 words found (~30.5%)
Eevee
sumber
Berapa persentase mewakili?
Joe Z.
Persentase kata-kata yang diberikan yang dapat dibuat dengan set gulungan yang diusulkan
Eevee
Baik. (Whoa, saya baru saja melihat siapa Anda.)
Joe Z.
ha, dunia kecil.
Eevee
3

Mathematica , 1275 kata lagi dan lagi ...

Kode ini tidak di-Golf-kan karena pertanyaannya sepertinya tidak perlu.

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]
]

Kata menghitung dengan cepat (kurang dari 10 detik) berevolusi menjadi 1275 pada kebanyakan berjalan tetapi tidak pernah melampaui itu. Saya mencoba mengganggu surat-surat oleh lebih dari satu pada suatu waktu dalam upaya untuk keluar dari maksimum lokal teoritis tetapi tidak pernah membantu. Saya sangat curiga bahwa 1275 adalah batas untuk daftar kata yang diberikan. Ini adalah langkah lengkapnya:

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}

Berikut beberapa pilihan "menang":

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

Seperti komentar Peter, ini sebenarnya solusi yang sama dalam urutan berbeda. Diurutkan:

{"bcdfgmpstw", "aehiloprtu", "aeilnorstu", "acdeklnrst", "adehklrsty"}
Tuan Penyihir
sumber
@belisarius Terima kasih! Lebih menarik dengan ENABLE2k .
Mr.Wizard
Saya telah mempertimbangkan Combinatorica's NetworkFlow untuk yang satu ini, tetapi belum menemukan cara yang berguna untuk menggunakannya
Dr. belisarius
@belisarius Saya harap Anda menemukan jalan; Saya ingin melihatnya.
Mr.Wizard
@belisarius ngomong-ngomong, kode saya shortlistterasa panjang, dan meskipun ini bukan Golf, saya ingin sesuatu yang lebih pendek. Bisakah kamu menolong?
Mr.Wizard
1
Saya pikir pilihan "menang" Anda semua permutasi modulo yang sama dalam cepat.
Peter Taylor
2

Python, 1210 kata (~ 29%)

Dengan asumsi saya menghitung kata-kata dengan benar kali ini, ini sedikit lebih baik daripada solusi FakeRainBrigand. Satu-satunya perbedaan adalah saya menambahkan setiap gulungan secara berurutan, dan kemudian menghapus semua kata dari daftar yang tidak cocok dengan gulungan sehingga saya mendapatkan distribusi yang sedikit lebih baik untuk gulungan berikutnya. Karena ini, ia memberikan gulungan pertama yang sama persis.

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)

Output program

SBCAPFDTMG
AOREILUHTP
ARIOLENUTS
ENTLRCSAID
SEYDTKHRNL
1210
kotak kardus
sumber
Bagus, dan 1210 bekerja di checker saya.
Brigand
1

iPython ( 273 210 Bytes, 1115 kata)

1115/4176 * ~ 27%

Saya menghitung ini di iPython, tetapi riwayat saya (dipangkas untuk menghapus debugging) tampak seperti ini.

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]

Jika kita akan kekurangan; Saya bisa memotongnya menjadi ini.

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]

Dipersingkat:

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]

Hasil saya adalah: ['sbcapfdtmg', 'aoeirulhnt', 'aironeluts', 'etnlriaosc', 'seyrdtnlah'].

* Matematika saya di 4176 mungkin sedikit pendek karena kata-kata dengan tanda hubung atau tanda kutip dihilangkan

Perampok
sumber
1
Meskipun solusi ini adalah heuristik yang baik dan kemungkinan akan mengembalikan solusi yang baik, saya tidak percaya dijamin untuk mengembalikan solusi optimal. Alasannya adalah bahwa Anda tidak menangkap kendala di antara gulungan: Anda memperlakukan setiap gulungan sebagai variabel independen padahal sebenarnya gulungan itu tergantung. Misalnya, mungkin kata-kata yang menggunakan huruf pertama yang paling umum memiliki perbedaan besar dalam distribusi huruf kedua mereka. Jika demikian halnya, maka solusi Anda mungkin menghasilkan kombinasi gulungan yang sebenarnya tidak memungkinkan kata sama sekali.
ESultanik
1

Q

? (todo) kata-kata

Kata-kata harus disimpan dalam file bernama words

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

Berjalan sekitar 170 ms pada i7 saya. Ini menganalisis daftar kata, mencari surat paling umum di setiap posisi (jelas menyaring non-kandidat). Ini adalah solusi naif malas tetapi menghasilkan hasil yang cukup baik dengan kode minimal.

Hasil:

"sbcapfdtmg"
"aoeirulhnt"
"aironeluts"
"etnlriaosc"
"seyrdtnlah"
skeevey
sumber
Berapa banyak kata 5 huruf yang Anda temukan?
DavidC
Saya melakukan hal yang sama dengan python dan mendapatkan 16353.
cardboard_box
Apakah ini algoritma serakah yang sama dengan FakeRainBrigand?
Peter Taylor
1
@ cardboard_box, hasil Anda pasti salah. Tidak banyak kata 5 huruf dalam kamus.
Peter Taylor
1
Yap, ini 1115. Saya menghitung jumlah huruf yang benar dalam kata apa pun, bukan jumlah kata yang benar. Saya pikir saya perlu kopi lagi.
cardboard_box
0

Sunting: Sekarang setelah aturannya diubah, pendekatan ini didiskualifikasi. Saya akan meninggalkannya di sini kalau-kalau ada yang tertarik sampai saya akhirnya memodifikasinya untuk aturan baru.

Python: 277 Karakter

Saya cukup yakin bahwa versi umum dari masalah ini adalah NP-Hard, dan pertanyaannya tidak memerlukan menemukan solusi tercepat , jadi inilah metode brute-force untuk melakukannya:

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)

Perhatikan bahwa saya mengganti nama file daftar kata menjadi "w" untuk menyimpan beberapa karakter.

Outputnya adalah jumlah kata yang dimungkinkan dari konfigurasi yang diberikan diikuti oleh konfigurasi itu sendiri:

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

Garis keluaran terakhir sebelum program berakhir dijamin menjadi solusi optimal.

ESultanik
sumber
Saya ingin melihat versi C atau ASM dari kode Anda sehingga dapat benar-benar selesai tahun ini :-) Atau setidaknya jalankan sampai 1116. Bisakah Anda menulisnya tanpa itertools, sehingga saya dapat menjalankannya di jython ? (lebih cepat dari python biasa, tetapi lebih mudah dari cython.)
Brigand
Nevermind tentang hal jython. Saya perlu mengambil alpha. Masih macet (terlalu banyak memori) tetapi itu tampaknya tidak dapat dihindari.
Brigand
Saya cukup yakin bahwa bahkan jika ini diterapkan dalam perakitan, akan memakan waktu lebih lama dari waktu saya untuk menyelesaikan perangkat keras saat ini :-P
ESultanik
Masalahnya adalah bahwa saya mengulangi (26 pilih 10) ^ 5 ≈ 4,23 * 10 ^ 33 kemungkinan. Bahkan jika kita bisa menguji satu kemungkinan per nanodetik, itu akan memakan waktu sekitar 10 kali lipat usia alam semesta saat ini untuk menyelesaikannya.
ESultanik
1
Ada dua karakter yang tidak muncul di posisi ke-5 dalam kata apa pun dalam daftar kata yang diberikan, sehingga Anda dapat mengurangi jumlah kemungkinan dengan faktor sekitar 4. Itulah cara saya mendapatkan "sekitar 110,3 bit" dalam komentar saya di pertanyaan.
Peter Taylor