Bir Hangman çözücü yazmanız gerekir. Bu İngilizce kelime listesine [1] karşı test ederek , en fazla kelimeyi çözen çözücü kazanır ve toplam yanlış tahmin sayısı bağlayıcı olur. Kelime listesindeki tüm kelimeler rastgele sırayla test edilecektir.
[1]: Bu kelime listesi buradan alınmakta , sayılar kaldırılmakta, daha sonra uzunluğu 1 olan veya alfabetik olmayan karakterlere sahip sözcükler kaldırılmakta, daha sonra en sık rastlanan 4096 benzersiz sözcük bu kelime listesi olarak seçilmektedir.
Ayrıntılar:
Programınız, alt çizgi ve doğru tahmin edilmiş harflerle stdin yoluyla size oyun programında etkileşime girecektir. Programınız tahminlerinizi ortaya koymaya çalışacak ve önceki tahminin doğru veya yanlış olup olmadığını girdiden çıkarmalı. 6 kez yanlış yaptıktan sonra programınız kaybolur. Her oyun sona erdikten sonra (galibiyet veya mağlubiyetten sonra) programınız bir sonraki oyuna hazır olmalıdır.
Kod uzunluğunuz kesinlikle 2048 bayttan az olmalı ve programınız herhangi bir harici kaynak kullanmamalıdır (yerel depolama alanındaki veya İnternetten kelime listesine erişim dahil ancak bunlarla sınırlı olmamak üzere).
Örnek : (Girdi >
burada sadece açıklama için önce gelir - gerçekte girişte mevcut değildir)
>_______ // 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 kez yanlış olduğunuzu varsayalım, tahmininizin yanlış olduğunu belirten bir son girdi alacaksınız ve programınız yeni bir tur başlatmaya hazır olmalıdır (yani başka bir giriş yapın).
Eğer kazanırsan,
>_angman
h
>hangman
>_____ // new round
Kazandığınızı bildikten sonra (girişin altı çizili olmadığından), bir sonraki tura katılmaya hazır olmalısınız.
Programınız bir giriş aldığında sonlandırmalıdır END
.
Programınız deterministik değilse (rastlantısallık, sözde rasgelelık, sistem süresi, ortam sıcaklığı, ruh halime vs. bağlıysa), başvurunuzda açıkça belirtmelisiniz ve puanınız 10 defa alınacaktır (aksi belirtilmedikçe, bana göre). ve ortalama.
Not : python gibi diller kullanıyorsanız, lütfen her baskı ifadesinden sonra stdout'unuzu açıkça yıkayın.
Oyun programı şu şekildedir ( nneonneo'ya kredi ):
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')
Kullanımı: python ./game.py [yoursolverprogram]
Örnek: python ./game.py ruby ./solver.rb
Bu eski puanlama programı gibi çalışmalıdır, ancak adlandırılmış yöneltmelere bağlı değildir, bu nedenle diğer platformlarda çalışabilir. Eskisi ile ilgileniyorsanız, gözden geçirme geçmişine bakın.
subprocess
Oyunu sürmek için harici bir fifo yerine kullanmanızı önerebilir miyim ? Bu şekilde kod diğer işletim sistemlerinde çalışacaktır (örneğin, Windows'ta Cygwin). İşte komut satırında adı geçen programı başlatmak game.py
için kullanılacak subprocess
şekilde değiştirildi : gist.github.com/nneonneo/d173f8888e1ea0c6fe37 . python game.py <program> [args]
Örneğin olarak kullanın python game.py python hangman.py
.