Anda diminta untuk menulis pemecah Hangman. Pengujian terhadap daftar kata bahasa Inggris ini [1] , pemecah yang memecahkan jumlah kata terbanyak akan menang, dengan jumlah total tebakan yang salah menjadi tie-breaker. Semua kata dalam daftar kata akan diuji secara acak.
[1]: Daftar kata ini diambil dari sini , kemudian angkanya dihapus, lalu kata-kata dengan panjang 1 atau dengan karakter non-abjad dihapus, maka 4096 kata unik paling sering dipilih sebagai daftar kata ini.
Rinciannya:
Program Anda akan berinteraksi dengan program permainan, yang akan memberi Anda melalui stdin garis bawah dan surat-surat yang ditebak dengan benar. Program Anda akan memberikan untuk menerka tebakan Anda, dan itu harus disimpulkan dari input apakah tebakan sebelumnya benar atau salah. Setelah salah 6 kali, program Anda hilang. Program Anda harus siap untuk pertandingan berikutnya setelah setiap pertandingan berakhir (setelah menang atau kalah).
Panjang kode Anda harus benar-benar kurang dari 2048 byte, dan program Anda tidak boleh menggunakan sumber daya eksternal apa pun (termasuk tetapi tidak terbatas pada mengakses daftar kata pada penyimpanan lokal atau dari Internet).
Contoh : (Input didahului di >
sini hanya untuk klarifikasi - sebenarnya tidak ada dalam input)
>_______ // 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
Misalkan Anda salah untuk 6 kali, Anda akan menerima input akhir yang menyiratkan dugaan Anda salah, dan program Anda harus siap untuk memulai babak baru (yaitu mengambil input lain).
Jika kamu menang,
>_angman
h
>hangman
>_____ // new round
Setelah mengetahui bahwa Anda telah menang (karena input tidak memiliki garis bawah), Anda harus siap untuk menerima babak selanjutnya.
Program Anda harus berhenti ketika menerima input END
.
Jika program Anda tidak deterministik (tergantung pada keacakan, pseudorandomness, waktu sistem, suhu sekitar, suasana hati saya, dll.), Anda harus secara eksplisit menyatakan bahwa dalam kiriman Anda, dan skor Anda akan diambil 10 kali (oleh saya, kecuali diinstruksikan lain) dan dirata-rata.
Catatan : jika Anda menggunakan bahasa seperti python, harap secara otomatis menghapus stdout Anda setelah setiap pernyataan cetak.
Program game adalah sebagai berikut (kredit ke 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')
Pemakaian: python ./game.py [yoursolverprogram]
Contoh: python ./game.py ruby ./solver.rb
Ini harus bekerja seperti program penilaian lama, tetapi tidak tergantung pada pipa bernama, sehingga dapat bekerja pada platform lain. Rujuk ke riwayat revisi jika Anda tertarik pada yang lama.
subprocess
fifo eksternal untuk menjalankan game? Dengan cara ini kode akan berfungsi untuk OS lain (misalnya, Cygwin di Windows). Berikut ini game.py
dimodifikasi untuk digunakan subprocess
untuk memulai program bernama pada command-line: gist.github.com/nneonneo/d173f8888e1ea0c6fe37 . Gunakan sebagai python game.py <program> [args]
, mis python game.py python hangman.py
.