คุณจะต้องเขียนแก้ Hangman ทดสอบกับรายการคำภาษาอังกฤษนี้[1]ตัวแก้ปัญหาที่แก้ได้มากที่สุดคำที่ชนะด้วยจำนวนการเดาที่ไม่ถูกต้องทั้งหมดเป็นตัวผูกไทเกอร์ คำทั้งหมดในรายการคำจะถูกทดสอบตามลำดับแบบสุ่ม
[1]: รายการคำนี้นำมาจากที่นี่จากนั้นตัวเลขจะถูกลบออกจากนั้นคำที่มีความยาว 1 หรือที่มีตัวอักษรที่ไม่ใช่ตัวอักษรจะถูกลบออกจากนั้นคำศัพท์เฉพาะ 4096 คำที่ไม่ซ้ำกันส่วนใหญ่จะถูกเลือกเป็นรายการคำนี้
รายละเอียด:
โปรแกรมของคุณจะโต้ตอบกับโปรแกรมเกมซึ่งจะช่วยให้คุณผ่านขีดล่างและตัวอักษรที่เดาได้อย่างถูกต้อง โปรแกรมของคุณจะให้ stdout การคาดเดาของคุณและมันต้องอนุมานจากอินพุตว่าการเดาก่อนหน้านั้นถูกหรือผิด หลังจากที่ทำผิด 6 ครั้งโปรแกรมของคุณจะหายไป โปรแกรมของคุณจะต้องพร้อมสำหรับเกมถัดไปหลังจากแต่ละเกมจบลง (หลังจากชนะหรือแพ้)
ความยาวรหัสของคุณจะต้องน้อยกว่า 2048 ไบต์อย่างเคร่งครัดและโปรแกรมของคุณจะต้องไม่ใช้ทรัพยากรภายนอกใด ๆ (รวมถึง แต่ไม่ จำกัด เพียงการเข้าถึง wordlist บนที่จัดเก็บในตัวเครื่องหรือจากอินเทอร์เน็ต)
ตัวอย่าง : (อินพุตนำหน้าด้วย>
ที่นี่เพื่อการชี้แจงเท่านั้น - มันไม่ได้มีอยู่จริงในอินพุต)
>_______ // 7 underscores
a // Now you wait for input again
>_a___a_
e
>_a___a_ // Implies that your guess is wrong
>_____ // new round, this will be given ONLY IF you already have 6 losses
สมมติว่าคุณผิด 6 ครั้งคุณจะได้รับการป้อนข้อมูลขั้นสุดท้ายซึ่งแสดงว่าคุณเดาผิดและโปรแกรมของคุณจะต้องพร้อมที่จะเริ่มรอบใหม่ (เช่นรับอินพุตอื่น)
หากคุณชนะ
>_angman
h
>hangman
>_____ // new round
หลังจากรู้ว่าคุณชนะ (เนื่องจากอินพุตไม่มีขีดล่าง) คุณต้องพร้อมที่จะยอมรับรอบต่อไป
END
โปรแกรมของคุณจะต้องยุติการเมื่อได้รับการป้อนข้อมูล
หากโปรแกรมของคุณไม่ได้กำหนดไว้ (ขึ้นอยู่กับการสุ่มการสุ่มตัวอย่างเวลาของระบบอุณหภูมิโดยรอบอารมณ์ของฉัน ฯลฯ ) คุณต้องระบุอย่างชัดเจนว่าในการส่งผลงานของคุณและคะแนนของคุณจะถูกนำ 10 ครั้ง (โดยฉัน และโดยเฉลี่ย
หมายเหตุ : ถ้าคุณใช้ภาษาอย่างหลามกรุณาล้าง stdout ของคุณอย่างชัดเจนหลังจากพิมพ์คำสั่งแต่ละคำ
โปรแกรมเกมดังต่อไปนี้ (เครดิตกับnneonneo ):
import sys, random, subprocess
proc = subprocess.Popen(sys.argv[1:], stdin=subprocess.PIPE, stdout=subprocess.PIPE)
def p(x):
proc.stdin.write(x+'\n')
proc.stdin.flush()
wordlist=[]
f=open('wordlist.txt', 'r')
for i in f:
wordlist.append(i[:-1] if i[-1]=='\n' else i)
# wordlist=[i[:-1] for i in f]
random.shuffle(wordlist)
score=0
totalerr=0
for s in wordlist:
s2=[]
for i in s:
s2.append('_')
err=0
p(''.join(s2))
while err<6 and '_' in s2:
c=proc.stdout.readline().strip()
nomatch=True
for i in range(0, len(s)):
if s[i]==c:
s2[i]=c
nomatch=False
if nomatch:
err+=1
totalerr+=1
p(''.join(s2))
if err<6:
score+=1
p('END')
sys.stderr.write('score is '+str(score)+', totalerr is '+str(totalerr)+'\n')
การใช้งาน: python ./game.py [yoursolverprogram]
ตัวอย่าง: python ./game.py ruby ./solver.rb
สิ่งนี้ควรทำงานเหมือนกับโปรแกรมการให้คะแนนแบบเก่า แต่ไม่ได้ขึ้นอยู่กับไพพ์ที่มีชื่อดังนั้นมันจึงสามารถทำงานบนแพลตฟอร์มอื่นได้ อ้างถึงประวัติการแก้ไขหากคุณสนใจประวัติเก่า
subprocess
แทนFifo ภายนอกเพื่อขับเกมหรือไม่ วิธีนี้รหัสจะใช้ได้กับ OS อื่น ๆ (ตัวอย่างเช่น Cygwin บน Windows) นี่คือgame.py
การปรับเปลี่ยนการใช้งานsubprocess
เพื่อเริ่มต้นโปรแกรมที่มีชื่อบนบรรทัดคำสั่ง: gist.github.com/nneonneo/d173f8888e1ea0c6fe37 ใช้มันเป็นเช่นpython game.py <program> [args]
python game.py python hangman.py