Bạn được yêu cầu viết một bộ giải Hangman. Thử nghiệm chống lại này danh sách từ tiếng Anh [1] , người giải quyết này quyết định số hầu hết từ thắng, với số lượng tổng dự đoán sai là tie-breaker. Tất cả các từ trong danh sách từ sẽ được kiểm tra theo thứ tự ngẫu nhiên.
[1]: Danh sách từ này được lấy từ đây , sau đó các số bị xóa, sau đó các từ có độ dài 1 hoặc với các ký tự không theo thứ tự chữ cái sẽ bị xóa, sau đó 4096 từ duy nhất thường được chọn làm danh sách từ này.
Các chi tiết:
Chương trình của bạn sẽ tương tác với chương trình trò chơi, chương trình này sẽ cung cấp cho bạn thông qua stdin các dấu gạch dưới và các chữ cái được đoán chính xác. Chương trình của bạn sẽ đưa ra để đánh giá dự đoán của bạn và nó phải suy ra từ đầu vào cho dù lần đoán trước đó là đúng hay sai. Sau khi sai 6 lần, chương trình của bạn thua. Chương trình của bạn phải sẵn sàng cho trò chơi tiếp theo sau khi mỗi trò chơi kết thúc (sau khi thắng hoặc thua).
Độ dài mã của bạn phải nghiêm ngặt dưới 2048 byte và chương trình của bạn không được sử dụng bất kỳ tài nguyên bên ngoài nào (bao gồm nhưng không giới hạn trong việc truy cập danh sách từ trên bộ nhớ cục bộ hoặc từ Internet).
Ví dụ : (Đầu vào trước >
chỉ ở đây để làm rõ - nó không thực sự có trong đầu vào)
>_______ // 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
Giả sử bạn sai 6 lần, bạn sẽ nhận được đầu vào cuối cùng ngụ ý dự đoán của bạn là sai và chương trình của bạn phải sẵn sàng để bắt đầu một vòng mới (tức là lấy một đầu vào khác).
Nếu bạn thắng,
>_angman
h
>hangman
>_____ // new round
Sau khi biết rằng bạn đã thắng (vì đầu vào không có dấu gạch dưới), bạn phải sẵn sàng chấp nhận vòng tiếp theo.
Chương trình của bạn phải chấm dứt khi nhận được đầu vào END
.
Nếu chương trình của bạn không mang tính quyết định (phụ thuộc vào tính ngẫu nhiên, giả ngẫu nhiên, thời gian hệ thống, nhiệt độ môi trường, tâm trạng của tôi, v.v.), bạn phải nói rõ rằng trong bài nộp của mình và điểm của bạn sẽ được lấy 10 lần (trừ khi tôi được hướng dẫn) và tính trung bình.
Lưu ý : nếu bạn sử dụng các ngôn ngữ như python, vui lòng xóa hoàn toàn thiết bị xuất chuẩn của bạn sau mỗi câu lệnh in.
Chương trình trò chơi như sau (tín dụng cho 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')
Sử dụng: python ./game.py [yoursolverprogram]
Thí dụ: python ./game.py ruby ./solver.rb
Điều này sẽ hoạt động như chương trình tính điểm cũ, nhưng không phụ thuộc vào các đường ống được đặt tên, vì vậy nó có thể hoạt động trên các nền tảng khác. Tham khảo lịch sử sửa đổi nếu bạn quan tâm đến cái cũ.
subprocess
thay vì fifo bên ngoài để điều khiển trò chơi không? Bằng cách này, mã sẽ hoạt động cho các hệ điều hành khác (ví dụ: Cygwin trên Windows). Đây game.py
được sửa đổi để sử dụng subprocess
để bắt đầu chương trình có tên trên dòng lệnh: gist.github.com/nneonneo/d173f8888e1ea0c6fe37 . Sử dụng nó như python game.py <program> [args]
, ví dụ python game.py python hangman.py
.