อัลกอริทึมสำหรับการจำแนกคำสำหรับระดับความยากของเพชฌฆาตเป็น "ง่าย" "ปานกลาง" หรือ "ยาก"


114

อัลกอริทึมที่ดีในการกำหนด "ความยาก" ของคำสำหรับเกมเพชฌฆาตคืออะไรเพื่อให้เกมสามารถเลือกคำให้ตรงกับระดับความยากที่กำหนดได้

ความยากดูเหมือนจะเกี่ยวข้องกับจำนวนการเดาที่ต้องการความถี่สัมพัทธ์ของการใช้ตัวอักษร (เช่นคำที่มีตัวอักษรผิดปกติจำนวนมากอาจเดาได้ยากกว่า) และความยาวของคำ

นอกจากนี้ยังมีปัจจัยอัตนัยบางอย่างที่จะ (พยายาม) ชดเชยเช่นความเป็นไปได้ที่คำจะอยู่ในคำศัพท์ของผู้เล่นและสามารถจดจำได้ทำให้สามารถเปลี่ยนจากกลยุทธ์การเดาตามความถี่ของตัวอักษรเพียงอย่างเดียวไปจนถึงการคาดเดาตามรายการ รู้จักคำที่ตรงกัน

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

def classify_word(w)
  n = w.chars.to_a.uniq.length # Num. unique chars in w
  if n < 5 and w.length > 4
    return WordDifficulty::Easy
  end
  if n > w.length / 2
    return WordDifficulty::Hard
  else
    return WordDifficulty::Medium
  end
end

ฉันกำลังเขียนเกมเพชฌฆาตฉันอยากให้ลูก ๆ เล่น ฉันค่อนข้างแก่เกินไปที่จะพยายาม "ทำการบ้าน" ซึ่งอาจเป็นสาเหตุว่าทำไมคำถามจึงได้รับคะแนนโหวตลดลงมาก ... คำถูกสุ่มจากฐานข้อมูลคำขนาดใหญ่ซึ่งมีคำที่คลุมเครือจำนวนมากและถูกกรองตามระดับความยาก กำหนดสำหรับคำ


12
ทำไมต้องโหวตลง? นี่เป็นคำถามที่ดี f(w) = (# unique letters) * (7 - # vowels) * (sum of the positions of unique letters in a list, ordered by frequency)ฉันจะทำให้การทำงานยากลำบากเช่น จากนั้นคุณสามารถแบ่งช่วงของฟังก์ชั่นออกเป็นสามส่วนและเรียกความยากลำบากของคุณออกมา
Blender

2
ฉันขอแนะนำให้คุณค้นหาเว็บสำหรับสิ่งนี้ - น่าจะมีอัลกอริทึมหรือพจนานุกรมที่มีจุดประสงค์เพื่อคำนวณ / รายงานความซับซ้อนของคำ ฉันรู้ว่ามีข้อความยาวกว่านี้
Hot Licks

3
ที่เกี่ยวข้อง: youtube.com/watch?v=bBLm9P-ph6U (QI XL - คำที่เดายากที่สุดใน Hangman)
Claus Jørgensen

5
ไม่ว่าคุณจะทำอะไรอย่าลืมใส่ EXTINCTIONSPECTROPHOTOPOLERISCOPEOCCULOGRAVOGYROKYNETOMETER
Hot Licks

2
สำหรับผู้ใช้ที่อาจไม่คุ้นเคยกับ Ruby คุณอาจต้องการอธิบายว่าบรรทัดแรกของวิธีการของคุณทำอะไร? n = w.chars.to_a.uniq.lengthนับจำนวนตัวอักษรที่ไม่ซ้ำกันหรือไม่?
T Nguyen

คำตอบ:


91

1. บทนำ

นี่คือวิธีแก้ไขปัญหานี้อย่างเป็นระบบ: หากคุณมีอัลกอริทึมที่เล่นเพชฌฆาตได้ดีคุณสามารถใช้ความยากของแต่ละคำเป็นจำนวนการเดาผิดที่โปรแกรมของคุณจะใช้หากเดาคำนั้น

2. นอกเหนือจากกลยุทธ์เพชฌฆาต

มีความคิดที่เป็นนัยในคำตอบและความคิดเห็นอื่น ๆ ว่ากลยุทธ์ที่ดีที่สุดสำหรับผู้แก้ปัญหาคือการตัดสินใจตามความถี่ของตัวอักษรในภาษาอังกฤษหรือความถี่ของคำในคลังข้อมูลบางส่วน นี่เป็นความคิดที่ยั่วยวน แต่ก็ไม่ถูกต้องนัก ผู้แก้จะทำได้ดีที่สุดหากสร้างแบบจำลองการกระจายของคำที่ผู้กำหนดเลือกได้อย่างถูกต้องและผู้ตั้งค่าที่เป็นมนุษย์อาจเลือกคำตามความหายากหรือการหลีกเลี่ยงตัวอักษรที่ใช้บ่อย ตัวอย่างเช่นแม้ว่าEเป็นตัวอักษรที่ใช้บ่อยที่สุดในภาษาอังกฤษถ้าหมามักจะเลือกจากคำJUGFUL, RHYTHM, SYZYGYและZYTHUMแล้วแก้ที่สมบูรณ์แบบไม่ได้เริ่มต้นด้วยการคาดเดาE!

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

3. อัลกอริทึมเพชฌฆาต

ที่นี่ฉันจะร่างตัวแก้ที่ค่อนข้างดี (แต่ยังห่างไกลจากความสมบูรณ์แบบ) มันจำลองเซ็ตเตอร์ว่าเลือกคำจากพจนานุกรมคงที่ มันเป็นอัลกอริทึมโลภ : ในแต่ละขั้นตอนจะคาดเดาตัวอักษรที่ลดจำนวนการพลาดนั่นคือคำที่ไม่มีการคาดเดา ตัวอย่างเช่นถ้าไม่มีคาดเดาได้รับการทำเพื่อให้ห่างไกลและคำพูดที่เป็นไปได้DEED, DEADและDAREแล้ว:

  • ถ้าคุณเดาDหรือEไม่มีพลาด
  • ถ้าคุณเดาAมีหนึ่ง miss ( DEED);
  • ถ้าคุณเดาRมีสองพลาด ( DEEDและDEAD);
  • หากคุณเดาตัวอักษรอื่นมีการพลาดสามครั้ง

อย่างใดอย่างหนึ่งDหรือEเป็นการคาดเดาที่ดีในสถานการณ์นี้

(ขอบคุณผู้พัน Panic ในความคิดเห็นที่ชี้ให้เห็นว่าการคาดเดาที่ถูกต้องนั้นไม่มีค่าใช้จ่ายในเพชฌฆาตฉันลืมสิ่งนี้ไปโดยสิ้นเชิงในความพยายามครั้งแรก!)

4. การนำไปใช้

นี่คือการใช้อัลกอริทึมนี้ใน Python:

from collections import defaultdict
from string import ascii_lowercase

def partition(guess, words):
    """Apply the single letter 'guess' to the sequence 'words' and return
    a dictionary mapping the pattern of occurrences of 'guess' in a
    word to the list of words with that pattern.

    >>> words = 'deed even eyes mews peep star'.split()
    >>> sorted(list(partition('e', words).items()))
    [(0, ['star']), (2, ['mews']), (5, ['even', 'eyes']), (6, ['deed', 'peep'])]

    """
    result = defaultdict(list)
    for word in words:
        key = sum(1 << i for i, letter in enumerate(word) if letter == guess)
        result[key].append(word)
    return result

def guess_cost(guess, words):
    """Return the cost of a guess, namely the number of words that don't
    contain the guess.

    >>> words = 'deed even eyes mews peep star'.split()
    >>> guess_cost('e', words)
    1
    >>> guess_cost('s', words)
    3

    """
    return sum(guess not in word for word in words)

def word_guesses(words, wrong = 0, letters = ''):
    """Given the collection 'words' that match all letters guessed so far,
    generate tuples (wrong, nguesses, word, guesses) where
    'word' is the word that was guessed;
    'guesses' is the sequence of letters guessed;
    'wrong' is the number of these guesses that were wrong;
    'nguesses' is len(guesses).

    >>> words = 'deed even eyes heel mere peep star'.split()
    >>> from pprint import pprint
    >>> pprint(sorted(word_guesses(words)))
    [(0, 1, 'mere', 'e'),
     (0, 2, 'deed', 'ed'),
     (0, 2, 'even', 'en'),
     (1, 1, 'star', 'e'),
     (1, 2, 'eyes', 'en'),
     (1, 3, 'heel', 'edh'),
     (2, 3, 'peep', 'edh')]

    """
    if len(words) == 1:
        yield wrong, len(letters), words[0], letters
        return
    best_guess = min((g for g in ascii_lowercase if g not in letters),
                     key = lambda g:guess_cost(g, words))
    best_partition = partition(best_guess, words)
    letters += best_guess
    for pattern, words in best_partition.items():
        for guess in word_guesses(words, wrong + (pattern == 0), letters):
            yield guess

5. ตัวอย่างผลลัพธ์

การใช้กลยุทธ์นี้เป็นไปได้ที่จะประเมินความยากลำบากในการเดาคำศัพท์แต่ละคำในคอลเล็กชัน ที่นี่ฉันพิจารณาคำหกตัวอักษรในพจนานุกรมระบบของฉัน:

>>> words = [w.strip() for w in open('/usr/share/dict/words') if w.lower() == w]
>>> six_letter_words = set(w for w in words if len(w) == 6)
>>> len(six_letter_words)
15066
>>> results = sorted(word_guesses(six_letter_words))

คำศัพท์ที่ง่ายที่สุดในการเดาในพจนานุกรมนี้ (พร้อมกับลำดับการเดาที่จำเป็นสำหรับผู้แก้ในการเดา) มีดังนี้:

>>> from pprint import pprint
>>> pprint(results[:10])
[(0, 1, 'eelery', 'e'),
 (0, 2, 'coneen', 'en'),
 (0, 2, 'earlet', 'er'),
 (0, 2, 'earner', 'er'),
 (0, 2, 'edgrew', 'er'),
 (0, 2, 'eerily', 'el'),
 (0, 2, 'egence', 'eg'),
 (0, 2, 'eleven', 'el'),
 (0, 2, 'enaena', 'en'),
 (0, 2, 'ennead', 'en')]

และคำที่ยากที่สุดคือ:

>>> pprint(results[-10:])
[(12, 16, 'buzzer', 'eraoiutlnsmdbcfg'),
 (12, 16, 'cuffer', 'eraoiutlnsmdbpgc'),
 (12, 16, 'jugger', 'eraoiutlnsmdbpgh'),
 (12, 16, 'pugger', 'eraoiutlnsmdbpcf'),
 (12, 16, 'suddle', 'eaioulbrdcfghmnp'),
 (12, 16, 'yucker', 'eraoiutlnsmdbpgc'),
 (12, 16, 'zipper', 'eraoinltsdgcbpjk'),
 (12, 17, 'tuzzle', 'eaioulbrdcgszmnpt'),
 (13, 16, 'wuzzer', 'eraoiutlnsmdbpgc'),
 (13, 17, 'wuzzle', 'eaioulbrdcgszmnpt')]

สาเหตุที่ยากเพราะหลังจากที่คุณเดา-UZZLEแล้วคุณยังมีความเป็นไปได้อีกเจ็ดประการ:

>>> ' '.join(sorted(w for w in six_letter_words if w.endswith('uzzle')))
'buzzle guzzle muzzle nuzzle puzzle tuzzle wuzzle'

6. การเลือกรายการคำศัพท์

แน่นอนว่าเมื่อเตรียมรายการคำศัพท์สำหรับบุตรหลานของคุณคุณจะไม่ได้เริ่มต้นด้วยพจนานุกรมระบบของคอมพิวเตอร์คุณจะต้องเริ่มต้นด้วยรายการคำศัพท์ที่คุณคิดว่าพวกเขาน่าจะรู้ ตัวอย่างเช่นคุณอาจดูรายการคำที่ใช้บ่อยที่สุดของ Wiktionaryในองค์กรภาษาอังกฤษต่างๆ

ตัวอย่างเช่นในบรรดา 1,700 คำหกตัวอักษรใน10,000 คำที่พบบ่อยที่สุดใน Project Gutenberg ณ ปี 2549สิบข้อที่ยากที่สุด ได้แก่ :

[(6, 10, 'losing', 'eaoignvwch'),
 (6, 10, 'monkey', 'erdstaoync'),
 (6, 10, 'pulled', 'erdaioupfh'),
 (6, 10, 'slaves', 'erdsacthkl'),
 (6, 10, 'supper', 'eriaoubsfm'),
 (6, 11, 'hunter', 'eriaoubshng'),
 (6, 11, 'nought', 'eaoiustghbf'),
 (6, 11, 'wounds', 'eaoiusdnhpr'),
 (6, 11, 'wright', 'eaoithglrbf'),
 (7, 10, 'soames', 'erdsacthkl')]

(Soames Forsyte เป็นตัวละครในForsyte Saga โดย John Galsworthyรายการคำถูกแปลงเป็นตัวพิมพ์เล็กดังนั้นฉันจึงไม่สามารถลบชื่อที่เหมาะสมได้อย่างรวดเร็ว)


1
การโทรที่ดีในรายการคำที่ใช้บ่อย invokeit.wordpress.com/frequency-word-listsมีภาษาอังกฤษและสวีเดนดีมากที่มีทั้งสองอย่าง
grrussel

1
ฉันคาดหวังว่าbingleจะได้รับการจัดอันดับที่ยากกว่าsingleหรือtingle- bingleเป็นคำที่ไม่ค่อยพบบ่อยนักและ bเป็นตัวอักษรทั่วไปน้อยกว่า
BlueRaja - Danny Pflughoeft

5
อัลกอริทึมที่ยอดเยี่ยม (และขอขอบคุณที่อธิบายเป็นภาษาอังกฤษก่อนเขียนโค้ด!) แต่ฉันคิดว่าคุณควรพยายามลดจำนวนการเดาที่ไม่ถูกต้อง ดังนั้นถ้าพจนานุกรมเป็น [ค้างคาวเดิมพันหมวกร้อนยำ] ฉันจะเดาว่า 'T' (แทนที่จะเป็น B, A หรือ H) ถ้าฉันพูดถูกก็ไม่เสียค่าใช้จ่ายอะไร ถ้าฉันผิดก็เหลือ แต่ 'ยำ'
พันเอก Panic

8
นี่เป็นอัลกอริธึมที่ยอดเยี่ยมจริงๆ แต่ฉันคิดว่าไม่ได้สะท้อนให้เห็นถึงกลยุทธ์ที่ผู้เล่นที่เป็นมนุษย์มักจะทำ - แทนที่จะรู้ทุกคำมนุษย์จะจดจำคำที่พบบ่อยที่สุด คำนำหน้า (เช่นไอออนไอเอ็นจี) และการล้มเหลวที่เพียงแค่เดาตัวอักษรทั่วไป (เริ่มต้นด้วยสระจากนั้นทำ t / r / s / n / etc) ไม่แน่ใจว่าจะเขียนโค้ดนี้อย่างไร แต่เป็นสิ่งที่ต้องคิด :)
Patashu

2
การวิเคราะห์ที่ยอดเยี่ยม ดังที่ @Patashu ชี้ให้เห็นขั้นตอนต่อไปที่จะทำให้สิ่งนี้ดียิ่งขึ้นไปกว่าการใช้พจนานุกรมคำทั่วไปใช้พจนานุกรมคำเต็มรูปแบบ แต่มีคำอธิบายประกอบเกี่ยวกับสามัญสำนึกและเพียงแค่ชั่งน้ำหนักในความเป็นสามัญของคำด้วย ความยากลำบากในการกระจายตัวอักษร แต่นั่นเป็นเพียงการปรับปรุงเพิ่มเติมซึ่งเป็นวิธีแก้ปัญหาที่ยอดเยี่ยมอยู่แล้ว
Ben Lee

21

วิธีง่ายๆคือการคำนวณคะแนนโดยพิจารณาจากการไม่มีสระในคำจำนวนตัวอักษรที่ไม่ซ้ำกันและความธรรมดาของตัวอักษรแต่ละตัว:

letters = 'etaoinshrdlcumwfgypbvkjxqz'
vowels = set('aeiou')

def difficulty(word):
    unique = set(word)
    positions = sum(letters.index(c) for c in word)

    return len(word) * len(unique) * (7 - len(unique & vowels)) * positions

words = ['the', 'potato', 'school', 'egypt', 'floccinaucinihilipilification']

for word in words:
    print difficulty(word), word

และผลลัพธ์:

432 the
3360 potato
7200 school
7800 egypt
194271 floccinaucinihilipilification

จากนั้นคุณสามารถให้คะแนนคำด้วย:

        score < 2000   # Easy
 2000 < score < 10000  # Medium
10000 < score          # Hard

สวัสดีเครื่องปั่นช่วยบอกหน่อยได้ไหมว่าเลขวิเศษ 7 มีไว้เพื่ออะไร? ทำไมไม่ 6 หรือ 50? จะเกิดอะไรขึ้นถ้าฉันใส่หมายเลขกองทัพอื่น
Pavan

@ ปาวัน: ไม่มีอะไรจริงๆ คะแนนของคำทั้งหมดจะเลื่อนขึ้นตามจำนวนที่เท่ากัน
Blender

ใช่ฉันสังเกตเห็นการเปลี่ยนแปลงเมื่อฉันเล่นกับผู้บริหารงูหลามออนไลน์ ฉันสังเกตเห็นบางอย่างและนั่นคือเมื่อฉันพิมพ์สิ่งที่เหมือนเพ้อฝันเมื่อเทียบกับสิ่งที่น่ารังเกียจความเกลียดชังจะมีค่าต่ำกว่าเพ้อฝันแม้ว่าจะเป็นคำที่สะกดถูกต้องมากกว่าก็ตามดังนั้นควรปรากฏในระดับความยากที่ต่ำกว่าในเกมคำศัพท์ สิ่งนี้ทำให้ฉันรู้ว่าความยากเป็นเรื่องส่วนตัว แต่ฉันคิดว่าควรมีการศึกษาบางอย่างเพื่อสรุปว่าคำใดสะกดยากที่สุดในหมู่คนอื่นใช่ไหม? คุณช่วยชี้ให้ฉันดูการศึกษาดังกล่าวได้ไหม
Pavan

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

9

คุณสามารถใช้วิธีมอนติคาร์โลเพื่อประเมินความยากของคำ:

  • จำลองเกมโดยการเดาตัวอักษรแบบสุ่มทุกครั้งถ่วงน้ำหนักด้วยความถี่ของตัวอักษรในภาษาเป้าหมายของคุณและนับจำนวนการเดาที่ผู้เล่นสุ่มของคุณมาถึงโซลูชัน โปรดทราบว่าเนื่องจากการเดาแต่ละครั้งจะกำจัดตัวอักษรกระบวนการนี้จึงมีข้อ จำกัด และจะส่งกลับตัวเลขตั้งแต่ 1 ถึง 26
  • ทำซ้ำขั้นตอนนี้2*Nหลายครั้งโดยที่Nจำนวนตัวอักษรที่ไม่ซ้ำกันในคำของคุณ
  • คำนวณคะแนนโดยเฉลี่ยผลการ2*Nวิ่ง
  • กำหนดระดับความซับซ้อน: คะแนนน้อยกว่าสิบหมายถึงคำที่ง่ายและคะแนนที่สูงกว่าสิบหกหมายถึงคำที่ยาก อย่างอื่นอยู่ในระดับปานกลาง

2
ฉันคิดว่าคุณควรนับเฉพาะการเดาที่ไม่ถูกต้อง ไม่มีการลงโทษสำหรับการเดาที่ถูกต้อง
พันเอก Panic

ทำไมจำนวนซ้ำ? ฉันคิดว่ากลยุทธ์นี้ (เช่นกลยุทธ์การสุ่มส่วนใหญ่) มีความแปรปรวนมากกว่าสำหรับคำที่สั้นกว่า
พันเอก Panic

@ColonelPanic ฉันคิดว่าการนับจำนวนการเดาทั้งหมดจะดีกว่าเพราะเป็นการรวมจำนวนตัวอักษรที่แตกต่างกันไว้ในคำตอบโดยธรรมชาติ คุณอาจคิดถูกเกี่ยวกับความแปรปรวนของคำที่สั้นกว่าที่สูงกว่า บางทีจำนวนการทำซ้ำควรได้รับการแก้ไขแล้ว อย่างไรก็ตามฉันคิดว่า 2N น่าจะเป็นการเริ่มต้นที่ดี
dasblinkenlight

4

การสนทนาที่คล้ายกันก่อนหน้านี้ในหัวข้อเดียวกัน: กำหนดความยากของคำภาษาอังกฤษ

ฉันชอบคำตอบที่ท้ายลิงค์ ^. สำหรับเกมเพชฌฆาตสำหรับเด็กเพียงแค่ใช้วิธีการเช่นเดียวกับการข่วน

กำหนดค่าคะแนนให้กับตัวอักษรแต่ละตัวจากนั้นเพิ่มตัวอักษร


1
สิ่งนี้ร่วมกับการหลีกเลี่ยงคำที่หายากหรือคลุมเครือในระดับง่ายดูเหมือนเป็นหนทางในการส่งต่อในตอนนี้ ภาวะแทรกซ้อนที่ฉันไม่ได้กล่าวถึงคือคำเหล่านี้ถูกเลือกมาจากพจนานุกรมขนาดใหญ่ซึ่งส่วนใหญ่ต้องใช้คำจำกัดความ :-)
grrussel

ค่าจุดสามารถทำงานน่าจะทำให้การใช้ความถี่ตัวอักษร แม้ว่าคำที่ใช้กันทั่วไปบางคำอาจมีค่าคะแนนสูงผิดปกติ
นิวเคลียร์

3

ในขณะที่กลับมาฉันเขียนนักแก้เพชฌฆาตโดยใช้อัลกอริทึมที่ชัดเจน: ให้พจนานุกรมเริ่มต้นของคำที่เป็นไปได้ทั้งหมดในแต่ละรอบเราจะเลือกตัวอักษรที่เกิดขึ้นในคำส่วนใหญ่ที่เหลืออยู่ในพจนานุกรมจากนั้นลบคำที่ไม่ตรงกัน (ขึ้นอยู่กับ response) จากพจนานุกรม

อัลกอริทึมไม่ค่อยตรงไปตรงมาเท่านี้เนื่องจากมักจะมีตัวอักษรหลายตัวซึ่งแต่ละตัวจะเกิดขึ้นในจำนวนคำเดียวกันในพจนานุกรม ในกรณีนี้การเลือกตัวอักษรสามารถสร้างความแตกต่างอย่างมีนัยสำคัญกับจำนวนการคาดเดาสำหรับคำหนึ่ง ๆ เราเลือก maxima ที่ข้อมูลผลลัพธ์เกี่ยวกับตำแหน่งของตัวอักษรนั้น (ถ้าอยู่ในคำนั้นจริง) ให้ข้อมูลสูงสุดเกี่ยวกับระบบ (ตัวอักษรที่มีค่าสูงสุดเอนโทรปีข้อมูล ) เช่นถ้าคำที่เป็นไปได้ที่เหลืออีกสองคำคือ 'สารานุกรม' และ 'สารานุกรม' ตัวอักษร 'c' มีความเป็นไปได้ที่จะปรากฏเช่นเดียวกับ e, n, y, l, o, p, e, d, i (กล่าวคือ รับประกันว่าจะอยู่ในคำ) แต่เราควรถามเกี่ยวกับ 'c' ก่อนเนื่องจากมีเอนโทรปีข้อมูลที่ไม่ใช่ศูนย์

แหล่งที่มา (C ++, GPL) คือ ที่นี่

ผลลัพธ์ของทั้งหมดนี้คือรายการคำที่มีจำนวนการเดาที่ต้องการสำหรับแต่ละคำ: ความยากลำบาก. txt (630KB) คำที่ยากที่สุดสำหรับอัลกอริทึมนี้คือ "will" (ซึ่งมีการเดาไม่ถูกต้อง 14 ข้อ); i และ double l จะเดาได้ค่อนข้างเร็ว แต่จากนั้นตัวเลือกต่างๆ ได้แก่ การเรียกเก็บเงินผักชีฝรั่งเติมเหงือกเนินเขาฆ่าโรงสียาร่องถึงจะและจากนั้นตัวเลือกเดียวคือเดาตัวอักษรแต่ละตัวใน กลับ. ค่อนข้างตรงไปตรงมาคำที่ยาวกว่าจะเดาได้เร็วกว่ามาก (ไม่มีแค่นั้นให้เลือก)

แน่นอนว่าในเกมเพชฌฆาตมนุษย์จิตวิทยา (และความกว้างของคำศัพท์) มีบทบาทมากกว่าอัลกอริทึมนี้อธิบายถึง ...


3

แค่ทำมัน! เล่นเพชฌฆาตกับคำ นับจำนวนของริบ (เช่นเดาไม่ถูกต้อง) เพื่อเอาชนะ

คุณจะต้องมีกลยุทธ์ในการเล่น นี่คือกลยุทธ์ของมนุษย์ (ish) จากพจนานุกรมขีดฆ่าทุกคำที่ไม่ตรงกับการเปิดเผยจนถึงตอนนี้ เดาตัวอักษรบ่อยที่สุดในบรรดาคำที่เหลือ

หากกลยุทธ์ของคุณเป็นแบบสุ่มคุณสามารถกำหนดหน่วยวัดของคุณเป็นจำนวนการริบที่คาดไว้และประเมินในเชิงประจักษ์


อีกหนึ่งกลยุทธ์เชิงกำหนดจากบอทเพชฌฆาตที่ฉันเขียนเมื่อไม่กี่ปีก่อน เดาตัวอักษรที่ลดจำนวนคำที่เหลือในกรณีที่การเดาไม่ถูกต้อง (เช่นปรับให้เหมาะสมที่สุดในกรณีที่เลวร้ายที่สุด) วันนี้ฉันไม่ชอบกลยุทธ์นี้เพราะมีกลไกมากเกินไปฉันชอบกลยุทธ์ข้างต้นมากกว่า


ฮ่าฮ่าฉันแค่จะแนะนำสิ่งเดียวกัน แต่เป็นเวอร์ชันที่จริงจัง: เขียนบอทง่ายๆที่เดาโดยใช้กลยุทธ์ง่ายๆจากนั้นเรียกใช้คำเหล่านั้นซ้ำ ๆ กับคำจากพจนานุกรม
Tikhon Jelvis

ใช่นั่นคือสิ่งที่ฉันหมายถึง!
พันเอก Panic

2

ก่อนอื่นคุณต้องสร้างรายการตัวอักษรที่ไม่ซ้ำกัน จากนั้นจัดเรียงตามความถี่ (เป็นภาษาอังกฤษหรือภาษาอะไรก็ได้ - มีรายการนี้ ) โดยตัวอักษรที่ไม่บ่อยจะมีความยากสูง

จากนั้นคุณต้องตัดสินใจว่าคุณจะรวมคะแนนโดยการเพิ่มคูณหรือใช้รูปแบบอื่น ๆ


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

และคุณอาจต้องการบัญชีสำหรับคอมโบตัวอักษรเช่นถ้ามี Q ก็จะมี U เกือบแน่นอนและ U ทำให้ Q มีโอกาสมากขึ้น ดังนั้นจึงอาจสมเหตุสมผลเช่นถือว่า QU เป็นอักษรตัวเดียวจากความถี่ POV
Hot Licks

1

คุณถูกลดคะแนนเนื่องจากคุณขอให้เราสร้างอัลกอริทึมที่ซับซ้อนมากสำหรับคุณ

ทำไมคุณไม่สร้างอาร์เรย์สามอาร์เรย์ (ง่ายปานกลางและยาก) และเติมแต่ละอาร์เรย์ด้วยคำหนึ่งร้อยหรือมากกว่านั้น จะใช้เวลาประมาณ 20 นาที

ฉันสัญญาว่าลูก ๆ ของคุณจะเบื่อกับการแขวนคอนานก่อนที่พวกเขาจะเล่นเกมไม่กี่ร้อยเกม ... : D


3
มันไม่จำเป็นต้องเป็นที่ซับซ้อน เช่นดูความคิดเห็นของ Blender เป็นต้น คำตอบของคุณไม่ได้ตรงกับคำถามหลักและไม่มีประโยชน์อย่างยิ่ง
Tikhon Jelvis

4
“ ทำไมคุณไม่สร้างอาร์เรย์สามอาร์เรย์ (ง่ายปานกลางและยาก) และเติมแต่ละอาร์เรย์ด้วยคำหนึ่งร้อยคำ”: เรียกอีกอย่างว่าวิธี“ แก้ปัญหาโดยสมมติว่าปัญหาได้รับการแก้ไขแล้ว”
Pascal Cuoq

คำวิจารณ์ที่เกิดขึ้นขอบคุณ ... ฉันเดาจากมุมมองทางวิชาการคุณพูดถูกจริงๆคำตอบของฉันไม่ได้แก้ปัญหาอะไรเลย แต่จากมุมมองในทางปฏิบัตินั่นคือวิธีที่ง่ายที่สุดในการสร้างเกมเพชฌฆาตสำหรับลูก ๆ ของคุณคำตอบของฉันแก้ปัญหาได้อย่างถูกและรวดเร็ว
BBagi

1
@PascalCuoq หรือคุณอาจพูดได้ว่านี่คือแนวทาง "แก้ปัญหาโดยสมมติว่ามนุษย์เลือกรายการที่เหมาะสมได้ดีกว่าอัลกอริทึม" เนื่องจากผู้ถามต้องการเกมสำหรับเด็กดูเหมือนว่า "หมวกแมวดวงอาทิตย์" จะอยู่ในรายการที่ง่ายกว่าและ "ระนาดไร้โรงเรียน" อยู่ในรายการที่ยากแม้ว่าอาจจะพบว่ามีการเดาน้อยกว่าก็ตาม โดยเฉลี่ย.
Darren Cook

1
@PascalCuoq ไม่มีอะไรผิดในการหลีกเลี่ยงปัญหาที่ซับซ้อนแม้ว่าจะเป็นวิธีแก้ปัญหาง่ายๆหากคุณสามารถหลีกเลี่ยงปัญหานี้ได้ ไม่มีอะไรผิดปกติในการสร้างอัลกอริทึมที่ซับซ้อนเพื่อความสนุกสนาน แต่อย่างน้อยวิธีแก้ปัญหาง่ายๆก็สมควรได้รับการกล่าวถึง
เดวิด

1

อาจมีหลายสิ่งที่เกี่ยวข้อง:

  1. อย่างที่ทุกคนพูดความถี่ของตัวอักษรแต่ละตัว
  2. ความยาวของคำควรนับอย่างแน่นอน แต่ไม่ใช่ในลักษณะเชิงเส้นคำที่ยาวสามารถทำให้การเดาแบบสุ่มตีตัวอักษรได้ในขณะที่คำสั้น ๆ นั้นยากที่จะได้รับ
  3. นอกจากนี้ควรพิจารณาคำเหล่านี้ด้วยเช่นกัน - "bipartite" อาจเป็นคำสำหรับคนที่อยู่ใน SO แต่อาจไม่ใช่สำหรับประชากรที่ไม่ใช่สายเทคนิค

อันที่จริงคุณสามารถพยายามร่วมกันพัฒนากลยุทธ์หลาย ๆ อย่างครึ่งหนึ่งของพวกเขาในการตัดสินคุณค่าของคำและครึ่งหนึ่งของพวกเขาเพื่อพยายามชนะเกม กลุ่มหลังจะพยายามเพิ่มคะแนนให้สูงสุดในขณะที่กลุ่มแรกพยายามลดคะแนนให้น้อยที่สุด หลังจากนั้นไม่นานอาจมีรูปแบบและครึ่งหนึ่งสำหรับการตัดสินคุณค่าของคำอาจทำให้คุณมีเกณฑ์มาตรฐาน


ความถี่ในการใช้คำเป็นจุดที่ดี ความพยายามครั้งแรกของฉันจากการให้คะแนนตัวอักษรที่ไม่ซ้ำกันตามความถี่ที่อ้างว่า "ยูเทคติก" เป็นคำที่ "ง่าย" Google ngrams storage.googleapis.com/books/ngrams/books/datasetsv2.htmlดูเหมือนจะช่วยระบุคำที่ใช้กันทั่วไปได้ในปัจจุบัน
grrussel

1

เริ่มต้นด้วยรายการคำและเปิดการค้นหาโดย Google สำหรับแต่ละคำ ให้จำนวน Hit เป็นพร็อกซี (หยาบ) ของความยากของคำ

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

การพิจารณาความคิดของ n-Grams อีกขั้นหนึ่งความยากของ Word สามารถจัดอันดับได้ตามความถี่ของพยางค์ในร้อยแก้ว ขึ้นอยู่กับคุณภาพของสถิติพยางค์แน่นอน คุณอาจต้องแยกความแตกต่างระหว่าง Lexemes และ Function word (ตัวกำหนดคำสันธาน ฯลฯ ) และ Normalize ตามจำนวนพยางค์ใน Word (รู้สึกเหมือน Overkill ขณะที่ฉันเขียน ... )


0

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


0

คำนวณค่าของแต่ละตัวอักษรของคำใน Scrabble points: E = 1, D = 2, V = 4, X = 8 และอื่น ๆ เพิ่มและหารด้วยจำนวนตัวอักษรเพื่อให้ได้ค่าตัวอักษรเฉลี่ยและใช้เพื่อให้คะแนนคำ คำนวณค่าเฉลี่ยสำหรับแต่ละคำในพจนานุกรมขนาดใหญ่และกำหนดจุดแบ่งระหว่างควอไทล์ เรียกคำในควอไทล์ต่ำสุด "ง่าย" คำในควอร์ไทล์กลางสองคำ "กลาง" และคำในควอไทล์สูงสุด "ยาก"

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