Debes escribir un solucionador de ahorcado. Probando contra esta lista de palabras en inglés [1] , el solucionador que resuelve la mayor cantidad de palabras gana, siendo el número de conjeturas incorrectas el factor decisivo. Todas las palabras en la lista de palabras serán probadas en orden aleatorio.
[1]: Esta lista de palabras se toma de aquí , luego se eliminan los números, luego se eliminan las palabras con longitud 1 o con caracteres no alfabéticos, luego se eligen las 4096 palabras únicas más frecuentes como esta lista de palabras.
Los detalles:
Su programa interactuará con el programa del juego, que le dará a través de stdin los guiones bajos y las letras correctamente adivinadas. Su programa le dará a stdout sus conjeturas, y tiene que inferir de la entrada si la suposición anterior fue correcta o incorrecta. Después de equivocarse 6 veces, su programa pierde. Su programa debe estar listo para el próximo juego después de que finalice cada juego (después de ganar o perder).
La longitud de su código debe ser estrictamente inferior a 2048 bytes, y su programa no debe utilizar ningún recurso externo (incluido, entre otros, el acceso a la lista de palabras en el almacenamiento local o desde Internet).
Ejemplo : (La entrada está precedida por >
aquí solo para aclaración; en realidad no está presente en la entrada)
>_______ // 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
Suponga que está equivocado 6 veces, recibirá una entrada final que implica que su suposición es incorrecta, y su programa debe estar listo para comenzar una nueva ronda (es decir, tomar otra entrada).
Si tu ganas,
>_angman
h
>hangman
>_____ // new round
Después de saber que ha ganado (porque la entrada no tiene guiones bajos), debe estar listo para aceptar la próxima ronda.
Su programa debe finalizar cuando recibe una entrada END
.
Si su programa no es determinista (depende de la aleatoriedad, la pseudoaleatoriedad, la hora del sistema, la temperatura ambiente, mi estado de ánimo, etc.), debe indicarlo explícitamente en su envío, y su puntaje se tomará 10 veces (por mí, a menos que se indique lo contrario) y promediado.
Nota : si usa idiomas como Python, por favor, elimine explícitamente su stdout después de cada declaración de impresión.
El programa del juego es el siguiente (crédito a 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')
Uso: python ./game.py [yoursolverprogram]
Ejemplo: python ./game.py ruby ./solver.rb
Esto debería funcionar como el antiguo programa de puntuación, pero no depende de canalizaciones con nombre, por lo que puede funcionar en otras plataformas. Consulte el historial de revisiones si está interesado en el anterior.
subprocess
lugar de un fifo externo para conducir el juego? De esta manera, el código funcionará para otros sistemas operativos (por ejemplo, Cygwin en Windows). Aquí se game.py
modifica para usar subprocess
para iniciar el programa nombrado en la línea de comandos: gist.github.com/nneonneo/d173f8888e1ea0c6fe37 . Úselo como python game.py <program> [args]
, por ejemplo python game.py python hangman.py
.